江科大学习笔记 _17.低功耗
一、修改主频
看一下STM32标准库提供的system_stm32f10x.h和system_stm32f10x.c两个文件
它们提供了 SystemInit()和SystemCoreClockUpdate()两个可供外部调用的函数和
提供了一个SystemCoreClock可供外部调用的变量。
SystemInit():用来配置时钟树
SystemCoreClock:表示主频频率的值
SystemCoreClockUpdate():根据当前时钟树的配置,更新SystemCoreClock,也就是更新主频频率的值。
看一下SystemInit()函数:

SystemInit()中 ,在各种恢复默认配置之后,调用了如下函数:

追进去看:
根据不同的宏定义,执行不同的配置函数
所以 只要对 宏定义 进行 注释或解除注释,就能修改主频

继续追进去看:





最后,如果设置HSE失败,那么就会使用HSI作为时钟(8M),
用户可以在HSE设置失败里添加一些调试代码,失败的原因可以找找外部晶振问题。
以上就是SystemInit()函数进行的操作。
查看系统主频:这里使用了江科大的OLED显示工程
显示是72M,正确
在查看SystemInit()函数中说过,对宏定义进行注释或解除注释,就能修改主频

把system_stm32f10x.h和system_stm32f10x.c两个文件的只读属性去掉,修改注释。

显示是36M,修改完成。
修改主频后,涉及时间的计算都需要修改,所以谨慎修改主频。
二、睡眠模式

睡眠模式:CPU关,外设继续运行;可以产生中断
这里使用睡眠模式来省电,在之前的串口发送接收工程上进行代码修改添加:
追进去看:

在while()循环最后添加 __WFI(); 睡眠模式就完成了。
三、停止模式
查看标准库pwr头文件 stm32f1.x_pwr.h
这里使用江科大的红外计次工程

使用了PWR_EnterSTOPMode()函数,追进去查看:

第一个参数是:低功耗还是停止模式
第二个参数是:唤醒是中断还是事件
开启PWR时钟:
开启停止模式,中断触发:

退出停止模式之后,会默认使用HSI时钟,导致程序运行变慢,
要恢复HSE时钟,只需要再调用一次SystemInit(),在最后加上
四、待机模式
这里使用江科大的RTC实时时钟工程,设置一个闹钟,在闹钟时间到达后从待机模式唤醒。
修改如下:

1.设定一个10s的闹钟

到设定时间后,闹钟标志位置一,
使用RTC_GetFlagStatus(RTC_FLAG_ALR)函数查看 闹钟标志位
代码如下:
当CNT等于ALR时,ALRF标志位置一。
2.添加待机功能
需要开启pwr时钟
在stm32f1.x_pwr.h 头文件中:

整体代码如下:

每次闹钟时间到达后程序运行一次,之后进入待机模式。