LV16-29-电源管理-02-三种模式实现
本文主要是STM32开发——电源管理中三种模式的实现的一些基础知识相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows | windows11 |
Ubuntu | Ubuntu16.04的64位版本 |
VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
SecureCRT | Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日 |
开发板 | 正点原子 i.MX6ULL Linux阿尔法开发板 |
uboot | NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) |
linux内核 | linux-4.15(NXP官方提供) |
STM32开发板 | 正点原子战舰V3(STM32F103ZET6) |
点击查看本文参考资料
- 通用
分类 | 网址 | 说明 |
官方网站 | https://www.arm.com/ | ARM官方网站,在这里我们可以找到Cotex-Mx以及ARMVx的一些文档 |
https://www.st.com/content/st_com/zh.html | ST官方网站,在这里我们可以找到STM32的相关文档 | |
https://www.stmcu.com.cn/ | 意法半导体ST中文官方网站,在这里我们可以找到STM32的相关中文参考文档 | |
http://elm-chan.org/fsw/ff/00index_e.html | FatFs文件系统官网 | |
教程书籍 | 《ARM Cortex-M3权威指南》 | ARM公司专家Joseph Yiu(姚文祥)的力作,中文翻译是NXP的宋岩 |
《ARM Cortex-M0权威指南》 | ||
《ARM Cortex-M3与Cortex-M4权威指南》 | ||
开发论坛 | http://47.111.11.73/forum.php | 开源电子网,正点原子的资料下载及问题讨论论坛 |
https://www.firebbs.cn/forum.php | 国内Kinetis开发板-野火/秉火(刘火良)主持的论坛,现也做STM32和i.MX RT | |
https://www.amobbs.com/index.php | 阿莫(莫进明)主持的论坛,号称国内最早最火的电子论坛,以交流Atmel AVR系列单片机起家,现已拓展到嵌入式全平台,其STM32系列帖子有70W+。 | |
http://download.100ask.net/index.html | 韦东山嵌入式资料中心,有些STM32和linux的相关资料也可以来这里找。 | |
博客参考 | http://www.openedv.com/ | 开源网-原子哥个人博客 |
http://blog.chinaaet.com/jihceng0622 | 博主是原Freescale现NXP的现场应用工程师 | |
cortex-m-resources | 这其实并不算是一个博客,这是ARM公司专家Joseph Yiu收集整理的所有对开发者有用的官方Cortex-M资料链接(也包含极少数外部资源链接) |
- STM32
STM32 | STM32 HAL库开发实战指南——基于F103系列开发板 | 野火STM32开发教程在线文档 |
STM32库开发实战指南——基于野火霸道开发板 | 野火STM32开发教程在线文档 |
- SD卡
SD Association | 提供了SD存储卡和SDIO卡系统规范 |
点击查看相关文件下载
STM32F103xx英文数据手册 | STM32F103xC/D/E系列的英文数据手册 |
STM32F103xx中文数据手册 | STM32F103xC/D/E系列的中文数据手册 |
STM32F10xxx英文参考手册(RM0008) | STM32F10xxx系列的英文参考手册 |
STM32F10xxx中文参考手册(RM0008) | STM32F10xxx系列的中文参考手册 |
Arm Cortex-M3 处理器技术参考手册-英文版 | Cortex-M3技术参考手册-英文版 |
STM32F10xxx Cortex-M3编程手册-英文版(PM0056) | STM32F10xxx/20xxx/21xxx/L1xxxx系列Cortex-M3编程手册-英文版 |
SD卡相关资料——最新版本 | 有关SD卡的一些资料可以从这里下载 |
SD卡相关资料——历史版本 | 有关SD卡的一些历史版本资料可以从这里下载,比如后边看的SD卡2.0协议 |
SD 2.0 协议标准完整版 | 这是一篇关于SD卡2.0协议的中文文档,还是比较有参考价值的,可以一看 |
一、通用配置
1. 硬件设计
硬件主要使用到了按键、 LED 以及使用串口输出调试信息。
2. STM32CubeMX配置
2.1 时钟树
2.2 初始化LED
就是两个LED的初始化。
2.3 初始化按键
这里的按键需要开启中断,这里使用KEY0,按下的时候为低电平,所以配置成中断的时候,对应的GPIO设置为上拉。
2.4 中断配置
接下来配置一下NVIC:
2.5 串口配置
就按正常的打开串口即可,另外需要做一下printf的移植。
3. 中断服务函数
实现下边的函数:
1 | void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) |
4. 恢复时钟函数
与睡眠模式不一样,系统从停止模式被唤醒时,是使用 HSI 作为系统时钟的,在 STM32F103 中,HSI 时钟一般为 8MHz,与我们常用的 72MHz 相关太远,它会影响各种外设的工作频率。所以在系统从停止模式唤醒后,若希望各种外设恢复正常的工作状态,就要恢复停止模式前使用的系统时钟,这里定义了一个 SYSCLKConfig_STOP 函数,用于恢复系统时钟 :
1 | /** |
5. 无法下载了?
【注意】有当系统处于睡眠模式低功耗状态时 (包括后面的停止模式及待机模式),使用 DAP 下载器是无法给芯片下载程序的,所以下载程序时要先把系统唤醒。或者使用如下方法:按着板子的复位按键,使系统处于复位状态,然后点击电脑端的下载按钮下载程序,这时再释放复位按键,就能正常给板子下载程序了。 但是我用的JLink好像没什么影响,当无法下载程序的时候知道这样操作即可。
二、睡眠模式
1. 软件设计
(1)初始化用于唤醒的中断按键;
(2)进入睡眠状态;
(3)使用按键中断唤醒芯片;
2. 睡眠模式唤醒实现
1 | int main(void) |
我们根据上边的提示,可以看到对应的现象,同时串口的输出信息如下:
三、停止模式
1. 软件设计
(1)初始化用于唤醒的中断按键;
(2)选择电压调节器的工作模式并进入停止状态;
(3)使用按键中断唤醒芯片;
(4)重启 HSE 时钟,使系统完全恢复停止前的状态。
2. 停止模式唤醒实现
1 | int main(void) |
然后会看到串口有如下的打印:
可以看到,唤醒后的打印都是乱码,当重新配置后,串口恢复正常。
四、待机模式
1. 软件设计
(1)清除 WUF 标志位;
(2)使能 WKUP 唤醒功能;
(3)进入待机状态。
【注意】这里其实我们需要用到的是PA0,也就是WK UP唤醒引脚,这个引脚接在了KEY_UP上,当按键按下的时候会产生一个高电平,即便这个引脚不进行初始化,照样可以产生唤醒事件,但是由于没有进行初始化,所以这种情况下不能作为普通按键使用。另外这里KEY0的中断也开着,但是实验中没有什么用。
2. 待机模式唤醒实现
1 | int main(void) |
会看到这样的打印:
按下KEY_UP唤醒一次,然后在下一次进入待机模式前,按下复位,会看到打印出非待机唤醒复位。但是有一个bug,就是按下复位后,进入待机状态,总会自己再产生一次唤醒复位,目前还不清楚原因,可能是逻辑写的有问题,后边知道了再补充修改吧。
五、电源监控
我们可以使用 PVD 监控 STM32 芯片的 VDD 引脚,当监测到供电电压低于阈值时会产生 PVD 中断,系统进入中断服务函数进入紧急处理过程。 这里我们实现一个掉电检测的程序。
1. 软件设计
(1)初始化 PVD 中断;
(2)设置 PVD 电压监控等级并使能 PVD;
(3)编写 PVD 中断服务函数,处理紧急任务。
2. 掉电检测实现
STM32CubeMX中没有相关配置,我们直接使用HAL库自己编写。
2.1 初始化 PVD
1 | void PVD_Config(void) |
(1)使能电源管理时钟。
(2)配置 PVD 的中断优先级。由于电压下降是非常危急的状态,所以尽量把它配置成最高优先级。
(3)使用库函数 HAL_PWR_ConfigPVD 设置 PVD 监控的电压阈值等级,各个阈值等级表示的电压值需要查阅 STM32 的数据手册。
(4)最后使用库函数 HAL_PWR_EnablePVD 使能 PVD 功能。
2.2 PVD 中断服务函数
我们可以从启动文件中找到这个中断服务函数:
1 | void PendSV_Handler(void) |
然后我们需要实现一个回调函数:
1 | void HAL_PWR_PVDCallback(void) |
注意这个中断服务函数的名是 PVD_IRQHandler 而不是 EXTI16_IRQHandler(STM32 没有这样的中断函数名),示例中我们仅点亮了 LED 红灯,不同的应用中要根据需求进行相应的紧急处理。
2.3 main函数
1 | int main(void) |
3. 实验效果
正常来讲,当断电的时候,或者电压低于阈值的时候,会进入中断服务函数,中断服务函数中可以做一些保存数据的操作等,这里例程还没有支持存储设备,就先写在这,后边知道怎么写就行了。