本帖最后由 正点原子运营 于 2024-4-17 09:42 编辑
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板
2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版
6)正点原子STM32技术交流QQ群:725095144
本章介绍STM32F103电源电压监测器(PVD)的使用,PVD可以设置一个电压阈值,当监测到电源电压低于该阈值后,可以触发中断,以完成一些紧急处理。通过本章的学习,读者将学习到PVD的使用。 本章分为如下几个小节: 28.1 硬件设计 28.2 程序设计 28.3 下载验证
28.1 硬件设计 28.1.1 例程功能 1. TFTLCD上显示实验信息 2. 供电不足时,LED1亮起,LCD上提示“PVD Low Voltage!” 3. 供电正常时,LED1熄灭,LCD上提示“PVD Voltage OK! ” 4. LED0闪烁,提示程序正在运行
28.1.2硬件资源 1. LED LED0 - PB5 LED1 - PE5 2. 正点原子2.8/3.5/4.3/7/10寸TFTLCD模块 3. PVD
28.1.3 原理图 本章实验使用的PVD为STM32F103的片上资源,因此没有对应的连接原理图。
28.2 程序设计 28.2.1 HAL库的PWR驱动 本章实验使用的PVD为PWR的子模块,因此对PVD的操作函数都由HAL库中的PWR驱动提供,使用PVD的具体步骤如下: ①:配置PVD ②:使能PVD 在HAL库中对应的驱动函数如下: ①:配置PVD 该函数用于配置PVD,其函数原型如下所示: - voidHAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD);
复制代码该函数的形参描述,如下表所示: 表28.2.1.1 函数HAL_PWR_ConfigPVD()形参描述 该函数的返回值描述,如下表所示: 表28.2.1.2 函数HAL_PWR_ConfigPVD()返回值描述 该函数使用PWR_PVDTypeDef类型的结构体变量传入PVD的配置参数,该结构体的定义如下所示: - typedef struct
- {
- uint32_t PVDLevel; /* 等级 */
- uint32_t Mode; /* 模式 */
- }PWR_PVDTypeDef;
复制代码该函数的使用示例,如下所示: - #include "stm32f1xx_hal.h"
- void example_fun(void)
- {
- PWR_PVDTypeDef config = {0};
-
- /* 配置PVD */
- config.PVDLevel = PWR_PVDLEVEL_7;
- config.Mode =PWR_PVD_MODE_IT_RISING_FALLING;
- HAL_PWR_ConfigPVD(&config);
- }
复制代码②:使能PVD 该函数用于使能PVD,其函数原型如下所示: - voidHAL_PWR_EnablePVD(void);
复制代码该函数的形参描述,如下表所示: 表28.2.1.3 函数HAL_PWR_EnablePVD()形参描述 该函数的返回值描述,如下表所示: 表28.2.1.4 函数HAL_PWR_EnablePVD()返回值描述 该函数的使用示例,如下所示: - #include "stm32f1xx_hal.h"
- void example_fun(void)
- {
- /* 使能PVD */
- HAL_PWR_EnablePVD();
- }
复制代码
28.2.2 PWR驱动 本章实验的PWR驱动主要负责向应用层提供PVD的初始化函数,并实现PVD的中断回调函数。本章实验中,PWR的驱动代码包括pwr.c和pwr.h两个文件。 PWR驱动中,初始化PVD的函数,如下所示: - /**
- *@brief 初始化PVD
- *@param pl: 电压等级
- *@retval 无
- */
- void pwr_pvd_init(uint32_t pl)
- {
- PWR_PVDTypeDef pwr_pvd_struct = {0};
-
- __HAL_RCC_PWR_CLK_ENABLE();
-
- HAL_NVIC_SetPriority(PVD_IRQn, 0, 0);
- HAL_NVIC_EnableIRQ(PVD_IRQn);
-
- /* 配置并使能PVD */
- pwr_pvd_struct.PVDLevel = pl;
- pwr_pvd_struct.Mode =PWR_PVD_MODE_IT_RISING_FALLING;
- HAL_PWR_ConfigPVD(&pwr_pvd_struct);
- HAL_PWR_EnablePVD();
- }
复制代码从上面的代码中可以看到,PVD的初始化函数中,根据函数传入的参数配置了PVD的电压阈值,并开启了PVD的相关中断和使能PVD。 PWR驱动中,PVD的中断回调函数,如下所示: - /**
- *@brief HAL库PVD中断回调函数
- *@param 无
- *@retval 无
- */
- voidHAL_PWR_PVDCallback(void)
- {
- if (__HAL_PWR_GET_FLAG(PWR_FLAG_PVDO) != RESET)
- {
- /* 电压低于设置的电压等级,进行相应提示 */
- LED1(0);
- lcd_show_string(30, 130, 200, 16, 16, "PVD LowVoltage!", RED);
- }
- else
- {
- /* 电压不低于设置的电压等级,进行相应提示 */
- LED1(1);
- lcd_show_string(30, 130, 200, 16, 16, "PVD VoltageOK! ", BLUE);
- }
- }
复制代码从PVD的中断回调函数中可以看到,当PVD监测到电源电压小于设定的电压阈值时,会在LCD上显示电压低的提示并点亮LED1,在PVD监测到电源电压恢复至设定的电压阈值时,会在LCD上显示电压正常的提示并熄灭LED1。 虽然PVD在监测到电源电压低于设定的电压阈值时,会有相应的操作,但是由于电压过低可能导致无法观察到部分操作的现象。
28.2.3 实验应用代码 本章实验的应用代码,如下所示: - int main(void)
- {
- uint8_t t = 0;
-
- HAL_Init(); /* 初始化HAL库 */
- sys_stm32_clock_init(RCC_PLL_MUL9); /* 配置时钟,72MHz */
- delay_init(72); /* 初始化延时 */
- usart_init(115200); /* 初始化串口 */
- led_init(); /* 初始化LED */
- lcd_init(); /* 初始化LCD */
- pwr_pvd_init(PWR_PVDLEVEL_7); /* 初始化PVD */
-
- lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
- lcd_show_string(30, 70, 200, 16, 16, "PVDTEST", RED);
- lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
-
- lcd_show_string(30, 130, 200, 16, 16, "PVD VoltageOK! ", BLUE);
-
- while (1)
- {
- if (++t == 20)
- {
- t = 0;
- LED0_TOGGLE();
- }
-
- delay_ms(10);
- }
- }
复制代码本实验的应用代码很简单,主要就是配置了PVD的阈值电压为2.7V。
28.3 下载验证 在完成编译和烧录操作后,若系统的供电正常,便可以在LCD上看到“PVD Voltage OK!”的提示,并且LED1也处于熄灭状态;若系统的供电低于设置的PVD电压阈值2.7V时,便可以在LCD上看到“PVD Low Voltage!”的提示,并且LED1也会亮起(系统供电过低时,可能出现跟多意想不到的结果,因此可能会看不到部分现象)。 正常情况下开发板的供电都是正常的,若读者强制影响开发板的供电,可能导致不可逆的硬件损坏。 |