当前位置:首页 > 单片机 > 单片机
[导读]STM32F4系统时钟树STM32F4的系统时钟非常重要,涉及到整个系统的运行结果,无论是什么操作,都需要时钟信号,不同型号的微控制器的默认系统时钟配置是不同的,这里,给出两种配置STM32F407系统时钟的方法。方法一,采

STM32F4系统时钟树



STM32F4的系统时钟非常重要,涉及到整个系统的运行结果,无论是什么操作,都需要时钟信号,不同型号的微控制器的默认系统时钟配置是不同的,这里,给出两种配置STM32F407系统时钟的方法。方法一,采用官方库提供的配置(这里外部晶振8MHz,系统配置为168MHz)

STM32F4启动与STM32F10X不同,时钟已经默认配置好

启动代码,文件:startup_stm32f4xx.s


Reset_HandlerPROC

EXPORTReset_Handler[WEAK]

IMPORTSystemInit

IMPORT__main

LDRR0,=SystemInit

BLXR0

LDRR0,=__main

BXR0

ENDP

可以看出,在进入main函数之前,系统调用了SystemInit函数.

SystemInit函数分析:SystemInit函数位于system_stm32f4xx.c文件中.此文件提供几个宏定义可以设置各个时钟:


/*************************PLLParameters*************************************/

#ifdefined(STM32F40_41xxx)||defined(STM32F427_437xx)||defined(STM32F429_439xx)||defined(STM32F401xx)

/*PLL_VCO=(HSE_VALUEorHSI_VALUE/PLL_M)*PLL_N*/

#definePLL_M8

#else/*STM32F411xE*/

#ifdefined(USE_HSE_BYPASS)

#definePLL_M8

#else/*STM32F411xE*/

#definePLL_M16

#endif/*USE_HSE_BYPASS*/

#endif/*STM32F40_41xxx||STM32F427_437xx||STM32F429_439xx||STM32F401xx*/

/*USBOTGFS,SDIOandRNGClock=PLL_VCO/PLLQ*/

#definePLL_Q7

#ifdefined(STM32F40_41xxx)

#definePLL_N336

/*SYSCLK=PLL_VCO/PLL_P*/

#definePLL_P2//2//2---168M4---84M

#endif/*STM32F40_41xxx*/

#ifdefined(STM32F427_437xx)||defined(STM32F429_439xx)

#definePLL_N360

/*SYSCLK=PLL_VCO/PLL_P*/

#definePLL_P2

#endif/*STM32F427_437x||STM32F429_439xx*/

#ifdefined(STM32F401xx)

#definePLL_N336

/*SYSCLK=PLL_VCO/PLL_P*/

#definePLL_P4

#endif/*STM32F401xx*/

#ifdefined(STM32F411xE)

#definePLL_N400

/*SYSCLK=PLL_VCO/PLL_P*/

#definePLL_P4

#endif/*STM32F411xx*/

/******************************************************************************/

我使用的是STM32F407,筛选可用信息如下:




/*************************PLLParameters*************************************/

/*PLL_VCO=(HSE_VALUEorHSI_VALUE/PLL_M)*PLL_N*/

#definePLL_M8

#definePLL_N336

/*SYSCLK=PLL_VCO/PLL_P*/

#definePLL_P2

/*USBOTGFS,SDIOandRNGClock=PLL_VCO/PLLQ*/

#definePLL_Q7

/******************************************************************************/


而晶振频率则是在文件stm32f4xx.h中进行设置:

外部晶振:


#if!defined(HSE_VALUE)

#defineHSE_VALUE((uint32_t)8000000)/*!

#endif/*HSE_VALUE*/

内部晶振:

[cpp]view plaincopy

#if!defined(HSI_VALUE)

#defineHSI_VALUE((uint32_t)16000000)/*!

#endif/*HSI_VALUE*/




综上,如果使用外部晶振8MHz,则可以得出默认配置中:


锁相环压腔振荡器时钟PLL_VCO =(HSE_VALUE/PLL_M)*PLL_N=8/ 8* 336 = 336MHz


系统时钟SYSCLK = PLL_VCO / PLL_P=336 / 2 = 168MHz


USB,SD卡时钟 = PLL_VCO / PLLQ=336 / 7 = 48MHz



SystemInit函数代码:


voidSystemInit(void)

{

/*FPUsettings------------------------------------------------------------*/

#if(__FPU_PRESENT==1)&&(__FPU_USED==1)

SCB->CPACR|=((3UL<<10*2)|(3UL<<11*2));/*setCP10andCP11FullAccess*/

#endif

/*ResettheRCCclockconfigurationtothedefaultresetstate------------*/

/*SetHSIONbit*/

RCC->CR|=(uint32_t)0x00000001;

/*ResetCFGRregister*/

RCC->CFGR=0x00000000;

/*ResetHSEON,CSSONandPLLONbits*/

RCC->CR&=(uint32_t)0xFEF6FFFF;

/*ResetPLLCFGRregister*/

RCC->PLLCFGR=0x24003010;

/*ResetHSEBYPbit*/

RCC->CR&=(uint32_t)0xFFFBFFFF;

/*Disableallinterrupts*/

RCC->CIR=0x00000000;

#ifdefined(DATA_IN_ExtSRAM)||defined(DATA_IN_ExtSDRAM)

SystemInit_ExtMemCtl();

#endif/*DATA_IN_ExtSRAM||DATA_IN_ExtSDRAM*/

/*ConfiguretheSystemclocksource,PLLMultiplierandDividerfactors,

AHB/APBxprescalersandFlashsettings----------------------------------*/

SetSysClock();

/*ConfiguretheVectorTablelocationaddoffsetaddress------------------*/

#ifdefVECT_TAB_SRAM

SCB->VTOR=SRAM_BASE|VECT_TAB_OFFSET;/*VectorTableRelocationinInternalSRAM*/

#else

SCB->VTOR=FLASH_BASE|VECT_TAB_OFFSET;/*VectorTableRelocationinInternalFLASH*/

#endif

}

SetSysClock函数分析,在SetSysClock函数中,配置了系统时钟,PLL倍频以及分频系数:


staticvoidSetSysClock(void)

{

/******************************************************************************/

/* PLL (clocked by HSE) used as System clock source */

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

基于ARM® Cortex®-M4的STM32F4 MCU系列采用了意法半导体的NVM工艺和ART Accelerator™,在高达180 MHz的工作频率下通过闪存执行时其处理性能达到225 DMIPS/608 Cor...

关键字: stm32f4 ARM

stm32f4和f1都有哪些区别?除了需要的头文件不一样,管脚配置什么的有区别么?

关键字: stm32f4 f1 比较

STM32F407VET6引脚图及中文资料

关键字: stm32f4 引脚图

本文以6MHz时钟的单片机AT89C51系统为例,说明时钟中断的应用:

关键字: at89c51 中断 单片机 系统时钟

STM32F10x内核中都具有一个系统时钟基定时器,是一个24位的递减计数器。在其设置处置并使能后,每经过一个系统时钟周期,计数值减1.档计数值减到0时系统时基定时器又会自动重载初值。系统时基定时器每10ms就会产生一

关键字: STM32 系统时钟 基定时器

比较F1的片子对于F4的RTC来说有很大提升,F4的RTC提供了日历时钟和两个可编程闹钟中断,一个周期性可编程唤醒标志。这样很方便设置系统时间,并不会像F1的RTC那样要自己计算年月日时分秒。F4的RTC是一个独立的BC...

关键字: rtc stm32f4

【实验目的】输出7路占空比不同的PWM信号是各个版本ST库必备的例子。本实验的主要目的不是表现ST芯片PWM功能的强大,而是要完成输出的精确计算。【实验内容】输出7路PWM信号,并用示波器测量输出。【实验原理】1、时

关键字: pwm stm32f4 tim1 信号输出

STM32F4的随机数发生器RNG,以环境噪声为种子,产生32位随机数供主机使用。【主要特性】1、产生32位随机数 2、两次转换时间间隔40PLL48CLK 3、随机数熵检测以发现不正常位,以产生稳定序列 3、可被关闭以...

关键字: stm32f4 随机数发生器

书接上文,开始折腾ADC的DMA传输。因为大家都在说DMA,就连ST的例子里边也是使用DMA的。 ADC采集到的数据都存储在一个固定的寄存器中。当常规采样方式采样多个通道时候,使用DMA可以较好地避免将采集到的数据...

关键字: adc dma stm32f4 数据传输 采集数据

1. STM32的时钟系统在STM32中,一共有5个时钟源,分别是HSI、HSE、LSI、LSE、PLL(1)HSI是高速内部时钟,RC振荡器,频率为8MHz;(2)HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部...

关键字: STM32 系统时钟
关闭
关闭