电源框图,如下:
STM32的工作电压Vdd为2.0~3.6V,通过内置的电压调节器提供所需的1.8V电源。Vdd与1.8V的供电区域如上图所示。Vss表示工作电压Vdd的地。
Vdda 和Vssa从Vdd和Vss中独立开来,是为了获得更少干扰的电源供这部分模拟电路使用。它们在芯片外部还是与Vdd和Vss相连接的。
外部参考电压Vref+和Vref-是为了使ADC获得更好的精度,由用户提供的独立的外部参考电压。如果封装中没有这两个引脚,他们在芯片内部与ADC的电源Vdda和地Vssa相联。
Vbat的供电区域除上图所示外,PC13至PC15也由Vbat供电。
如果Vdd电压正常,后备供电区域将由Vdd供电,此时内部模拟开关连接到Vdd。当低电压检测器将检测到Vdd掉电时,掉电复位模块中的掉电复位功能将内部模拟开关切换到Vbat,如果Vbat连接了电池或其他电源,则可以保存住备份寄存器的内容、维持RTC运行等功能。
具体是由Vbat还是Vdd供电,PC13~PC15的功能使不一样的。具体见《STM32中文参考手册 4.12》。
电压调节器有三种不同的工作模式:
PVD监控Vdd的电压,与可编程的电压比较值(PVD 阀值)比较,根据设置可产生外部中断。这一特性可用于执行紧急关闭任务。
在系统或电源复位后,微控制器处于运行状态。当CPU不需继续运行时,可以利用多种低功耗模式来节省功耗。STM32F10xxx有三种低功耗模式,如下表:
如果想在运行模式下,想降低功耗,可通过下列方式:
CM3提供三种复位信号:
STM32F10xxx支持三种复位形式:系统复位、上电复位、备份区域复位。
除了RCC_CSR寄存器中的复位标志位(用来识别复位事件来源)和备份区域中的寄存器外,系统复位将复位所有的寄存器至它们的复位状态。
当发生以下任一事件时,产生一个系统复位:
将SYSRESETREQ位置1,可实现软件复位。
通过设置用户选择字节中的nRST_STDBY=1或nRST_STOP=1,在进入待机模式或停止模式时产生低功耗管理复位,而不是进入相应低功耗模式。
电源复位将复位除了备份区域外的所有寄存器。
当以下事件之一发生时,产生电源复位:
上图,上拉电阻Rpu式System reset信号默认为高电平,非有效复位信号。当NRST拉低时,System reset有效,产生复位信号。另外,当WWDG reset/IWDG reset/Power reset/Software reset/Low-power management reset其中之一(或门)产生低电平复位信号时,Pulse generator产生至少20us的复位低电平,三级管导通,System reset有效,同时NRST也置位低。
系统上电时,如果Vdd或Vdda大于Vpor,将在延迟Trettempo产生上电复位。如果Vdd/Vdda下降到Vpdr以下时,产生掉电复位。
Vpor和Vpdr是不一样的,Vpor-Vpdr=40mv.如下图:
备份区域复位只影响备份区域,它会使备份区域寄存器复位。
当以下事件中之一发生时,产生备份区域复位:
STM32F10X的时钟树:
SYSCLK可以从HIS、PLLCLK、HSE三者之一选择。PLLCLK的源为HSI/2、HSE或HSE/2二者之一,然后经过PLL倍频器产生的。SYSCLK最大值为72MHz(当HIS/2作为PLL时钟源时,SYSCLK最大为64MHz),经过AHB预分频器分频及各子系统分频器分频后,提供各种时钟信号供芯片子系统使用。
Cortex System timer(SysTick)的外部时钟可从HCLK/8或HCLK中选择。
FCLK acts as Cortex-M3’s free-running clock,意思是与CM3核的运行时钟HCLK独立开来,即使HCLK停止了,FCLK也可独立运行。
LSE供RTC使用,LSI可供RTC和独立看门狗使用。
HSE可由两种时钟源产生:外部时钟或晶体/陶瓷振荡器,它们的连接方式如下:
当使用外部时钟源时,时钟源的最高频率最高可达25MHz,输入到SOC_IN脚,OSC_OUT脚悬空。通过时钟控制寄存器的HSEBYP和HSEON位来选择此模式。
外部谐振器的频率为4~16MHz。RCC_CR:HSERDY、RCC_CIR、RCC_CR:HSEON为相关寄存器位。
HSI时钟信号由内部8MHz的RC振荡器产生,能够在不需要任何外部器件的条件下提供系统时钟,但其时钟频率精度较差。
HSICAL[7:0],HSITRIM[4:0]为HSI校准相关寄存器。HSIRDY、HSION为HSI工作相关寄存器。
内部PLL可用来倍频HIS RC或HSE晶体的输出时钟。PLL的设置(选择HSI振荡器除2或HSE晶体为PLL的输入时钟,选择倍频因子)必须在其被激活前完成。一旦PLL被激活,这些参数就不能被改动了。
PLL准备就绪后可产生中断,PLL中断在时钟中断寄存器里设置。
LSE时钟源也与HSE时钟源一样,可从外部时钟或LSE晶体中选择,二者都须为32.768kHz。LSE为RTC或其他定时功能提供时钟源。
使用LSE晶体时,相关寄存器为RCC_BDCR:LSEON、RCC_BDCR:LSERDY、时钟中断寄存器相关位。
使用外部时钟源时,相关寄存器为RCC_BDCR:LSEBYP和LSEON。
LSI由RC振荡器产生,大约为40kHz,可以在停机和待机模式下保持运行,为独立看门狗和自动唤醒单元提供时钟。
LSI的相关寄存器为:RCC_CSR:LSION、RCC_CSR:LSIRDY、RCC_CIR相关位。
系统复位后,HSI振荡器被选为系统时钟,只有当目标时钟源准备就绪了(经过启动稳定阶段的延迟或PLL稳定),才会切换到目标时钟源上。
相关寄存器:RCC_CR
RTCCLK的时钟源可由HSE/128、LSE或LSI提供,通过RCC_BDCR: RTCSEL[1:0]来选择,除非备份域复位,此选择不能被改变。
IWDG的时钟由LSI振荡器提供。
上电时先使用内部时钟(HIS)运行程序,然后在程序里面配置使用外部时钟(HSE)作PLL的时钟源,并设置HSE分频系数M、PLL倍频系数N、PLL分频系数P后得到所需的PLL时钟SYSCLK, 系统时钟HCLK、APB1、APB2。
使用标准外设库设置PLL时钟。
以STM32F427芯片为例。
上电时,进入复位中断,执行Startup_stm32f427x.s:Reset_Handler中断例程。
Reset_Handler调用system_stm32f4xx.c:SystemInit进行时钟初始化,SystemInit函数里面设置使用HSI作为系统时钟,disable HSE 和 PLL(HSE和PLL只能在disable状态下才能进行设置),然后调用system_stm32f4xx.c:SetSysClock设置PLL时钟。
默认配置下,标准外设库是使用HSE作为PLL时钟源,对PLL进行倍频分频后得到所需的HSE/APB1/APB2等时钟。
HCLK/ APB1/ APB2分频系数
STM32F427 HCLK的分频为1,即不对PLL输出的时钟SYSCLK进行分频,HCLK=SYSCLK。
APB2的分频为2,即APB2 CLK = SYSCLK/2.
APB1的分频为4,即APB1 CLK = SYSCLK/4.
PLL配置在RCC_PLLCFGR寄存器。
上式中,PLL clock input即HSE时钟,一般为外部晶振的时钟。
PLL general clock output即SYSCLK。PLLN, PLLM, PLLP, PLLQ为真实的分频or倍频系数,非寄存器里的编码。
外设标准库中,PLLN, PLLM, PLLP, PLLQ在system_stm32f4xx.c中进行宏定义,定义的数值为真实的分频/倍频数,非寄存器里的编码值。
PLLM: PLL clock input首先进行PLLM(M = [2, 63])分频,分频后的时钟作为VCO的输入。必须保证分频后时钟在1MHz~2MHz之间,一般设置为2MHz.
PLLN: PLL clock input M分频后,进行N(N = [192, 432])倍频。N倍频后的时钟必须在100MHz~432MHz直接,为VCO的输出时钟(VCO clock)。
PLLP: VCO输出时钟再进行P(P = 2, 4, 6, 8)分频,作为系统时钟SYSCLK. SYSCLK不能超过180MHz(超频模式下为180MHz,正常模式下最大为168MHz).
PLLQ: VCO clock Q分频后,作另一路时钟,供USB OTG FS, SDIO, RNG clock output。
要得到当前的系统时钟(HCLK),可以将SystemCoreClock初始化为正确的HCLK值,直接调用SystemCoreClock变量即可。
或者,设置好正确的HSE_VALUE(stm32f4xx.h或IAR中设置),调用SystemCoreClockUpdate得到正确的SystemCoreClock。
或者,设置好正确的HSE_VALUE(stm32f4xx.h或IAR中设置),调用RCC_GetClocksFreq(stm32f4xx_rcc.c中)得到SYSCLK, HCLK, ABP1CLK, APB2CLK。
Reference
- DM00031020_RM0090 F4 参考手册 Rev4.pdf
- DM00031020 RM0090 F4 Reference Manual Rev11.pdf
- STM32F4x StdPeriph Library