最近自己画了个STM32板,苦于没有合适的晶振,就捣鼓起怎么使用内部RC振荡作为时钟,前前后后大概弄了一个星期,好吧,别惊讶,因为只能在下班才有时间,所以加起来也就几个小时的时间.
借助到了<<STM32固件库说明>>这个文档,很有用,如果通过官方库来学习STM32,那这个文档必不可少.
官方库中默认是使用HSE时钟,就是外部高速时钟,如果板上有晶振,我们只需要定义晶振频率和将要得到的频率就可以了,库函数会为我们自动初始化.
外部高速晶振的频率范围为4~16MHz,定义晶振频率在stm32f10x.h文件中第119行定义,#defineHSE_VALUE ((uint32_t)8000000) 默认为8MHz.
系统时钟频率在system_stm32f10x.c文件中第110~115行中定义,把需要的频率取消注释,不要的频率注释掉就可以了.
以上的都是用外部晶振的情况,只需要一点点定义就可以实现了,但是用HSI内部高速时钟的话我还没有发现有更直接的方法,所以就自己用库函数做了一下Init,具体代码如下:
RCC_DeInit(); //初始化RCC各寄存器
RCC_HSICmd(ENABLE); //使能内部HSI时
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);//等待设置成功
RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_12);//HSI/2时钟输入,倍频16,4*12=48M
RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟
RCC_PCLK1Config(RCC_HCLK_Div1); //设置低速AHB时钟
RCC_PCLK2Config(RCC_HCLK_Div2); //设置高速AHB时钟
RCC_PLLCmd(ENABLE); //使能PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//等待使能成功
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择PLL输出做为系统时钟
while(RCC_GetSYSCLKSource() != 0x08); //等待设置成功
然后下面就可以为各种外设时钟(例如GPIO)使能并使用了,这里值得一提的是,PLL输入只能得到HSI时钟的2分频后的频率,也就是说如果HSI设置为8M,则PLL输入只有4M.
我试验中还发现,在使用HSI作为PLL时钟源时,输出频率不得大于56M,否则STM32不会运行...
当然,内部RC震荡精度有限,在能使用晶振的情况下还是选择外部高速时钟. |