STM32系统时钟设置详解(重要且细致)
前面几章分别讲解了什么是嵌入式系统,以及单片机和CMSIS结构。接下来正式进入STM32的学习。STM32最基础的部分就是系统时钟,系统时钟就像是整个STM32的心脏,为程序的运行提供了生命。要想在今后的STM32学习中更加得心应手,就需要非常熟悉我们STM32的系统时钟。
一、时钟控制
时钟系统为整个硬件系统的各个模块提供时钟信号。由于系统的复杂性,各个硬件模块很可能对时钟信号有自己的需求,这就要求在系统中设置多个振荡器,分别提供时钟信号,或者从一个主振荡器开始,经过多次倍频、分频、锁相环等电路,生成各个模块的独立时钟信号。
从主振荡器到各个模块的时钟信号通路成为时钟树。一些传统的低端8位单片机诸如51、AVR、PLC等单片机,也具备自身的一个时钟树系统,但其中的绝大部分是不受用户控制的,即在单片机上电后,时钟树就固定在某种不可能更改的状态。比如51单片机使用的典型12MHz晶振作为时钟源,则外设如IO口、定时器、串口等设备的驱动时钟便已经是固定的,用户无法将此时时钟的速率更改,除非更换晶振。而STM32微控制器的时钟树则是可配置的,其时钟输入源与最终达到外设的时钟速率不再是固定的关系,STM32微控制器的时钟树如下图所示:
在STM32中有5个时钟源,分别为HSI、HSE、LSE、LSI、PLL:
(1)HSI(高速内部时钟信号8MHz):通过8MHz的内部RC振荡器产生,并且可直接用做系统时钟,或者经过2分频后作为PLL的输入。
(2)HSE(高速外部时钟信号4~16MHz):可以通过外部直接提供时钟,从OSC_IN输入,或使用外部陶瓷/晶体谐振器。HSI比HSE更快的启动时间,但频率精确度没有外部晶振体振荡器高。
(3)LSE(低速外部时钟信号32.768kHz):振荡器是一个32.768kHz的低速外部晶体/陶瓷振荡器,它为RTC或其他功能提供低功耗且精确的时钟源。
(4)LSI(低速内部时钟信号30~60kHz):LSIRC担当了低功耗时钟源的角色,它可以在停机和待机模式下保持运行,为独立看门狗和自动唤醒单元提供时钟。
(5)PLL(锁相环倍频输出):用来倍频HSI或者HSE,时钟输入源可选择为HSI/2、HSE或者HSE/2,倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
SYSCLK是提供STM32中绝大部分部件工作的时钟源,系统时钟可选择为PLL输出、HSI或者HSE。HSI与HSE可以通过分频加至PLLSRC,并由PLLMUL进行倍频后经选择直接充当SYSCLK。PLLCLK经1.5分频或1分频后为USB串行接口引擎提供一个48MHz的振荡频率,即当需要使用USB时,PLL必须使能,并且时钟频率配置为48MHz或者72MHz。48MHz仅提供给USB串行接口引擎,而USB模块工作时钟是由APB1提供的。系统时钟最大频率为72MHz,它通过AHB分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、32、64、128、256、512分频。AHB分频器输出的时钟送给5大模块使用:
(1)送给AHB总线、内核、内存和DMA使用的HCLK时钟。
(2)通过8分频后送给Cortex的系统定时器时钟。
(3)直接送给Cortex的空闲运行时钟FCLK。
(4)送给APB1分频器,APB1分频器可选择为1、2、4、8、16分频,其输出一路提供APB1外设使用(PCLK2,最大频率36MHz);另一路送给定时器(Timer)2、3、4的倍频器使用(TIMX_CLK),该倍频器可选择1或者2倍频,输出提供定时器2、3、4使用。
(5)送给APB2分频器,APB2分频器可提供选择为1、2、4、8、16分频,其输出一路供APB2外设使用;另一路送给定时器1的倍频器使用(TIM1CLK),该倍频器可选择1或者2倍频,其输出供定时器1使用;另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用,ADC分频器可选择为2、4、6、8分频。
二、复位
STM32F10x支持电源复位、系统复位和备份区域复位三种复位形式。
1. 电源复位
当NRST引脚被拉低产生外部复位时,将产生复位脉冲。在复位过程中,芯片内部的复位信号会在NRST引脚上输出,脉冲发生器保证每一个复位源都能保持至少20us的脉冲延时。当以下事件发生的时候将产生电源复位。
(1)上电/掉电复位;
(2)从待机模式中返回。
电源复位将复位除了备份区域外所有寄存器。发生电源复位后,系统的复为入口被固定在地址0x00000004,即系统会从该地址重新运行用户程序。
2.系统复位
当发生以下任意时间时,可以产生一个系统复位,通过查看时钟控制器的RCC_CSR控制器状态的复位状态标志位可以识别复位事件的来源。
(1)NRST引脚上的低电平,即外部复位。
(2)窗口看门狗计数终止(WWDG)复位。
(3)独立看门狗计数终止(IWDG)复位。
(4)软件复位(SW复位)。
(5)低功耗管理复位。
3.备份区域复位
备份区域复位只影响备份区域的寄存器,STM32备份区域支持两个专门的复位操作。可以通过以下两种方式产生备份区域复位。
(1)软件方式:设置备份区域控制寄存器RCC_BDCR中的BDRST位。
(2)在VDD和VBAT两者均掉电的情况下,VDD和VBTA上电将触发备份区域复位。
三、启动配置
STM32F103x因为固定的存储器影像,代码区始终从地址0x0000000开始,通过ICode和DCode总线访问。启动之后,CPU从地址0x0000000获取堆栈顶的地址,并从启动存储器的0x00000004指示的地址开始执行代码。而数据区(SRAM)始终从地址0x20000000开始,通过系统总线访问。
STM32F103x的CPU始终从ICode总线获取复位向量,即启动仅适合于从代码区开始。而常用的程序代码存放在Flash中,因此典型的是从Flash启动;系统还可以从系统存储器或内置SRAM启动。系统复位后,SYSCLK的第4哥上升沿,BOOT0和BOOT1引脚的值将被锁存,可以通过BOOT0和BOOT1引脚选择3中不同启动模式。
作者:嵌入式小白儿