单片机的程序运行之前,必须进行时钟配置,可是,我们写代码的时候,并没有写时钟配置代码,程序也能运行,为什么?如果单片机外接不同频率的晶振,时钟要怎么修改呢? 1、先来看没写时钟配置代码,程序怎么能运行。 原来当程序启动的时候,就自动为我们设置好了时钟。 在启动代码 : startup_stm32f20xx.s 和 startup_stm32f40xx.s 文件中,有一行代码 IMPORT SystemInit ,和 LDR R0, =SystemInit , 当程序启动的时候,就执行了 SystemInit()函数,打开这个函数 void SystemInit(void),可以看到,首先复位时钟配置的各个寄存器,然后执行:SetSysClock(); 进行时钟设置。 仔细分析可以看到,系统时钟为PLL输出时钟,AHB时钟为PLL时钟,AHB1时钟为系统时钟/4,AHB2时钟为系统时钟/2,再看看各个外设接到了哪一个时钟线上,就能知道各个外设使用的时钟频率是多少了。
2、更换了外接晶振,时钟配置如何修改呢? 我们之所以没有管时钟配置,是因为单片机外接晶振25MHZ与时钟配置代码中的参数刚好相符,代码中默认的PLL_M的值25,打开 system_stm32F2xx.c 和 system_stm32F4xx.c 中有一行 #define PLL_M 25 , PLLVCO的输出频率是25 / 25 = 1MHZ ,如果外接晶振不是25M,就修改这个数即可,比如,外接8M晶振,把PLL_M的值修改成8,#define PLL_M 8 , 其它代码都不用变,得到的时钟频率跟接25M晶振是一样的。个人觉得外接16M晶振最好,因为刚好与内部高速时钟频率相同,如果外部晶振失效,内部晶振刚好替换,几乎看不出问题。 也可以根据自己的实际需要,修改AHB、AHB1和AHB2的时钟,总之,频率够用的情况下,频率越低,系统可靠性越高,有的时候不必过分追求高频率。
|