每次接触一款新的单片机,我都会很好奇该单片机的系统时钟是多少MHz,怎样才能达到Datasheet中描述的最大系统时钟,该单片机的外设的时钟会是多少MHz呢?如果要使用延时,我怎么编写程序才能实现精准的延时呢?我认为这些问题是我开始接触新单片机之前需要了解的。

对于每款ARM Cortex-M系列单片机而言,厂商为了更好的推广自己的单片机,同时方便设计人员使用,降低产品开发周期,都会将该单片机的外设相关寄存器以及外设的相关函数都实现并打包,放在官方网站上免费供大家使用。STM32F405RG的标准外设库还包含有DSP核的各种运算函数。如果需要,可以从http://www2.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-libraries/stsw-stm32065.html#下载。

如果使用标准外设库,我们可以根据标准外设库中的system_stm32f4xx.c文件中的代码分析可知:

#ifdefined(STM32F40_41xxx)||defined(STM32F427_437xx)||defined(STM32F429_439xx)||defined(STM32F401xx)||defined(STM32F469_479xx)#definePLL_M25#elifdefined(STM32F446xx)#definePLL_M8#elifdefined(STM32F410xx)||defined(STM32F411xE)#ifdefined(USE_HSE_BYPASS)#definePLL_M8#else/*!USE_HSE_BYPASS*/#definePLL_M16#endif/*USE_HSE_BYPASS*/#else#endif#ifdefined(STM32F40_41xxx)#definePLL_N336/*SYSCLK=PLL_VCO/PLL_P*/#definePLL_P2#endif#ifdefined(STM32F40_41xxx)uint32_tSystemCoreClock=168000000;#endif

根据编程手册关于时钟寄存器的内容,可知

PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N

SYSCLK=PLL_VCO/PLL_P

式中,HSE_VALUE表示单片机外接晶振的频率,HSI_VALUE表示单片机内部振荡器的频率,本实验板使用的是外部25MHz的晶振,根据程序中的配置,我们可以计算出SystemCoreClock =168000000。