电源STM32的工作电压(VDD)为2.0~3.6V。
通过内置的电压调节器提供所需的1.8V电源。
当主电源VDD掉电后,通过VBA T脚为实时时钟(RTC)和备份寄存器提供电源。
由上图可知VDDA.VSSA分别是独立给ADC的电源盒电源地。
ADC需要准确的精度因此需要独立的电源供电。
使用电池或其他电源连接到VBAT脚上,当VDD断电时,可以保存备份寄存器的内容和维持RTC的功能。
以便于RTC、后备区域、一些寄存器工作当然也需要外部振荡器提供时钟,所以也为LSE振荡器供电。
stm32中有上电复位掉电复位电路,可以设置通过设置PVDE位设置PVD阀值,当VDD 电压异常的时候就会复位,可以设置中断。
低功耗模式三种低功耗模式睡眠模式(Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行)停止模式(所有的时钟都已停止而电压还在供给) :是深睡眠模式基础上结合了外设的时钟控制机制,在停止模式下电压调节器可运行在正常或低功耗模式。
此时在1.8V供电区域的的所有时钟都被停止,PLL、HSI和HSE RC振荡器的功能被禁止,SRAM和寄存器内容被保留下来。
在停止模式下,所有的I/O引脚都保持它们在运行模式时的状态。
待机模式(1.8V电源关闭):待机模式可实现系统的最低功耗。
该模式是在Cortex-M3深睡眠模式时关闭电压调节器。
整个1.8V供电区域被断电。
PLL、HSI和HSE振荡器也被断电。
SRAM和寄存器内容丢失。
只有备份的寄存器和待机电路维持供电。
前面是三者的详细介绍,初一看看不出有什么区别,我当时都看的晕呼呼地,做笔记时候才发现他们真正的不同。
现在讲解一下。
睡眠模式只是关掉了CM3的内核,外设都在运行包过内部外部时钟、IO口、中断NVIC 等等。
停止模式是进一步的睡眠模式它是关掉了所有的外设时钟,但是仍旧在供电。
待机模式是最低功耗的模式,它连时钟供电全部禁止除了备份的寄存器和待机电路维持供电。
(有待进一步的深入研究并修正)Stm32降低功耗的三种方法:1.低功耗模式2.降低系统时钟3.关掉外设如题降低系统时钟通过对预分频寄存器进行编程,可以降低任意一个系统时钟(SYSCLK、HCLK、PCLK1、PCLK2)的速度。
从而降低功耗。
但是我有疑问就是:如何在系统运行的情况下切换系统时钟的时钟源?是否可以随时改变预分频系数?RCC_SYSCLKConfig 设置系统时钟(SYSCLK)RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);/* Wait till HSI is used as system clock source */while(RCC_GetSYSCLKSource() != 0x00)这个函数只是配置好系统时钟不是随时改变系统时钟的函数。
所以有待做实验研究此处关闭外设:在运行模式下,任何时候都可以通过停止为外设和内存提供时钟(HCLK和PCLKx)来减少功耗。
通过设置AHB外设时钟使能寄存器(RCC_AHBENR)、APB2外设时钟使能寄存器(RCC_APB2ENR)和APB1外设时钟使能寄存器(RCC_APB1ENR)来开关各个外设模块的时钟。
以下介绍怎么进入这三种模式:进入睡眠模式:void PWR_EnterSLEEPMode(u32 SysCtrl_Set, u8 PWR_SLEEPEntry){//if (SysCtrl_Set)// *(vu32 *) SCB_SysCtrl |= SysCtrl_SLEEPONEXIT_Set; // Set SLEEPONEXIT //else// *(vu32 *) SCB_SysCtrl &= ~SysCtrl_SLEEPONEXIT_Set; // Reset SLEEPONEXIT*(vu32 *) SCB_SysCtrl &= ~SysCtrl_SLEEPDEEP_Set; // Clear SLEEPDEEP bitif(PWR_SLEEPEntry == PWR_SLEEPEntry_WFI) // Select SLEEP mode entry __WFI(); // Request Wait For Interrupt else__WFE(); // Request Wait For Event}可惜库函数种没有睡眠模式这个函数。
进入待机模式:看stm32手册进入停止模式方法附表:void PWR_EnterSTANDBYMode(void){PWR->CR |= CR_CWUF_Set; // 清除Wake-up 标志PWR->CR |= CR_PDDS_Set; // 选择进入STANDBY 模式// 置位SLEEPDEEP位*(vu32 *) SCB_SysCtrl |= SysCtrl_SLEEPDEEP_Set;__WFI(); // 等待中断请求}库函数就非常简单,直接调用PWR_EnterSTANDBYMode();进入停止模式看stm32手册进入停止模式方法附表:与进入待机模式对比可以发现不同的是停止模式电压调节器还是在继续工作的,待机模式是笔停止模式更近一步的低功耗模式。
(程序下一次再做出来)库函数非常简单直接调用PWR_EnterSTOPMode(u32 PWR_Regulator, u8 PWR_STOPEntry);另外还有不得不提的就是上电复位(POR)和掉电复位(PDR):stm32中有上电复位掉电复位电路,可以设置通过设置P VDE位设置PVD阀值,当VDD电压异常的时候就会复位,可以设置中断。
电源这一块应该记下的寄存器LPDS:停止模式下电压调节器的工作模式0:开启1:关闭PDDS:睡眠模式下进入停止模式还是待机模式。
0:待机模式1:停止模式。
CWUF:清除唤醒位CSBF:清除待机位SBFPVDE:电源监视器是否使能PLS:选择电源电压监测器的电压阀值DBP:后备区域的写保护?EWUF:使能wkup这个IO口0:不能唤醒1:唤醒。
在系统复位时软件清0。
SBF:用于查询是否处于待机状态。
WUF:唤醒标志。
是否被唤醒标志位。
发生唤醒事件或者RTC闹钟事件备份寄存器学stm32这么久了一直知道备份寄存器这个东西但是却一直没有过深入研究,只是知道他是是一个在低功耗模式下仍然可以工作的一个寄存器。
下面我将好好学习这个寄存器把他搞明白。
备份寄存器:VDD被切断,VBA T为其提供电源,它们不会应为系统复位而复位。
备份域复位来复位或(如果侵入检测引脚TAMPER功能被开启时)由侵入引脚事件复位。
BKP中三个位是必须知道。
TPAL:TAMPER高电平会清除备份区域寄存器。
TPE:TAMPER这个引脚作为通用IO口还是作为侵入检测用。
TPIE:检测到侵入事件时是否产生一个中断。
为方便测量,RTC时钟可以经64分频输出到侵入检测引脚TAMPER上。
通过设置RTC 校验寄存器(BKP_RTCCR)的CCO位来开启这一功能。
问题是怎么校准?RTC的时钟被输出到TAMPER上。
(去网上找线索)。
主要是一些标志位,以及设置中断,清除一些标志位。
时钟时钟这一块真的不知道看了多少遍,啥也不说了直接上图。
没错就是时钟树的图先来几个容易忽略的小知识点。
1、时钟源被直接或通过PLL间接作为系统时钟时,它将不能被停止。
只有当某个时钟源准备就绪之后时钟源切换才会发生。
并且那一个准备好就选定那个位系统的时钟源。
(这个事真的吗?不行我得亲身试试看,先研究控制和状态寄存器,再做实验)2、PLL倍频系数。
只有在PLL关闭的情况下才可被写入3、PLL输入时钟源。
只能在关闭PLL时才能写入此位。
由此看来时钟切换容易实现。
先开好要的时钟源然后等待期准备好在设置SW位来设置系统时钟源。
但是倍频怎么在运行的时候切换呢?想法1:先进入待机或者停止模式(时钟将会被关闭)从停止模式返回的话会默认为HSI 作为系统时钟。
之后重新配置时钟源的输入,和PLL的配平系数。
RTCCLK时钟源可以由HSE/128、LSE或LSI时钟提供。
除非备份域复位,此选择不能被改变。
为什么会这样呢除非备份域和RTC有很大的关系(关系是什么呢?我现在是不懂)备份域复位的两种方法:软件复位,备份区域复位可由设置备份域控制寄存器(RCC_BDCR)(见6.3.9节)中的BDRST位产生。
在VDD和VBAT两者掉电的前提下,VDD或VBAT上电将引发备份区域复位我有很多疑惑在这里还没有搞清楚。
哎,,,不能操之过急。
只有慢慢来搞了。
但是学习方法已经总结出来就是寄存器操作和库函数一起看。
应为库函数的操作都是寄存器里面提到过得,分开二者完全不行。
边做笔记懂原理记寄存器懂库函数。
复位有三种复位:系统复位、电源复位和后备域复位。
系统复位:复位除时钟控制寄存器CSR中的复位标志和备份区域中的寄存器以外的所有寄存器。
当以下事件中的一件发生时,产生一个系统复位:1. NRST引脚上的低电平(外部复位)2. 窗口看门狗计数终止(WWDG复位)3. 独立看门狗计数终止(IWDG复位)4. 软件复位(SW复位)5. 低功耗管理复位可通过查看RCC_CSR控制状态寄存器中的复位状态标志位识别复位事件来源。
电源复位当以下事件中之一发生时,产生电源复位:电源复位将复位除了备份区域外的所有寄存器1. 上电/掉电复位(POR/PDR复位)2. 从待机模式中返回以下介绍寄存器这些都是必须记住的结合库函数看。