OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 763|回复: 0

《M144Z-M3最小系统板使用指南——STM32F103版》第二十八章 PVD电压监控实验

[复制链接]

1117

主题

1128

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4667
金钱
4667
注册时间
2019-5-8
在线时间
1224 小时
发表于 2024-4-19 11:03:06 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2024-4-17 09:42 编辑

第二十八章 PVD电压监控实验
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板

2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版


4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boar ... _mini_sysboard.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子STM32技术交流QQ群:725095144

155537c2odj87vz1z9vj6l.jpg

155537nfqovl2gg9faaol9.png

本章介绍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,其函数原型如下所示:
  1. voidHAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD);
复制代码
该函数的形参描述,如下表所示:
QQ截图20240417094055.png
表28.2.1.1 函数HAL_PWR_ConfigPVD()形参描述
该函数的返回值描述,如下表所示:
QQ截图20240417094112.png
表28.2.1.2 函数HAL_PWR_ConfigPVD()返回值描述
该函数使用PWR_PVDTypeDef类型的结构体变量传入PVD的配置参数,该结构体的定义如下所示:
  1. typedef struct
  2. {
  3.     uint32_t PVDLevel;  /* 等级 */
  4.     uint32_t Mode;      /* 模式 */
  5. }PWR_PVDTypeDef;
复制代码
该函数的使用示例,如下所示:
  1. #include "stm32f1xx_hal.h"
  2. void example_fun(void)
  3. {
  4.    PWR_PVDTypeDef config = {0};
  5.    
  6.     /* 配置PVD */
  7.    config.PVDLevel = PWR_PVDLEVEL_7;
  8.    config.Mode =PWR_PVD_MODE_IT_RISING_FALLING;
  9.    HAL_PWR_ConfigPVD(&config);
  10. }
复制代码
②:使能PVD
该函数用于使能PVD,其函数原型如下所示:
  1. voidHAL_PWR_EnablePVD(void);
复制代码
该函数的形参描述,如下表所示:
QQ截图20240417094119.png
表28.2.1.3 函数HAL_PWR_EnablePVD()形参描述
该函数的返回值描述,如下表所示:
QQ截图20240417094129.png
表28.2.1.4 函数HAL_PWR_EnablePVD()返回值描述
该函数的使用示例,如下所示:
  1. #include "stm32f1xx_hal.h"
  2. void example_fun(void)
  3. {
  4.     /* 使能PVD */
  5.     HAL_PWR_EnablePVD();
  6. }
复制代码

28.2.2 PWR驱动
本章实验的PWR驱动主要负责向应用层提供PVD的初始化函数,并实现PVD的中断回调函数。本章实验中,PWR的驱动代码包括pwr.c和pwr.h两个文件。
PWR驱动中,初始化PVD的函数,如下所示:
  1. /**
  2. *@brief   初始化PVD
  3. *@param   pl: 电压等级
  4. *@retval  无
  5. */
  6. void pwr_pvd_init(uint32_t pl)
  7. {
  8.    PWR_PVDTypeDef pwr_pvd_struct = {0};
  9.    
  10.    __HAL_RCC_PWR_CLK_ENABLE();
  11.    
  12.    HAL_NVIC_SetPriority(PVD_IRQn, 0, 0);
  13.    HAL_NVIC_EnableIRQ(PVD_IRQn);
  14.    
  15.     /* 配置并使能PVD */
  16.    pwr_pvd_struct.PVDLevel = pl;
  17.    pwr_pvd_struct.Mode =PWR_PVD_MODE_IT_RISING_FALLING;
  18.    HAL_PWR_ConfigPVD(&pwr_pvd_struct);
  19.    HAL_PWR_EnablePVD();
  20. }
复制代码
从上面的代码中可以看到,PVD的初始化函数中,根据函数传入的参数配置了PVD的电压阈值,并开启了PVD的相关中断和使能PVD。
PWR驱动中,PVD的中断回调函数,如下所示:
  1. /**
  2. *@brief   HAL库PVD中断回调函数
  3. *@param   无
  4. *@retval  无
  5. */
  6. voidHAL_PWR_PVDCallback(void)
  7. {
  8.     if (__HAL_PWR_GET_FLAG(PWR_FLAG_PVDO) != RESET)
  9.     {
  10.          /* 电压低于设置的电压等级,进行相应提示 */
  11.          LED1(0);
  12.          lcd_show_string(30, 130, 200, 16, 16, "PVD LowVoltage!", RED);
  13.     }
  14.     else
  15.     {
  16.          /* 电压不低于设置的电压等级,进行相应提示  */
  17.          LED1(1);
  18.          lcd_show_string(30, 130, 200, 16, 16, "PVD VoltageOK! ", BLUE);
  19.     }
  20. }
复制代码
从PVD的中断回调函数中可以看到,当PVD监测到电源电压小于设定的电压阈值时,会在LCD上显示电压低的提示并点亮LED1,在PVD监测到电源电压恢复至设定的电压阈值时,会在LCD上显示电压正常的提示并熄灭LED1。
虽然PVD在监测到电源电压低于设定的电压阈值时,会有相应的操作,但是由于电压过低可能导致无法观察到部分操作的现象。

28.2.3 实验应用代码
本章实验的应用代码,如下所示:
  1. int main(void)
  2. {
  3.     uint8_t t = 0;
  4.    
  5.    HAL_Init();                         /* 初始化HAL库 */
  6.    sys_stm32_clock_init(RCC_PLL_MUL9); /* 配置时钟,72MHz */
  7.    delay_init(72);                     /* 初始化延时 */
  8.    usart_init(115200);                 /* 初始化串口 */
  9.    led_init();                         /* 初始化LED */
  10.    lcd_init();                         /* 初始化LCD */
  11.    pwr_pvd_init(PWR_PVDLEVEL_7);       /* 初始化PVD */
  12.    
  13.    lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
  14.    lcd_show_string(30, 70, 200, 16, 16, "PVDTEST", RED);
  15.    lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
  16.    
  17.    lcd_show_string(30, 130, 200, 16, 16, "PVD VoltageOK! ", BLUE);
  18.    
  19.     while (1)
  20.     {
  21.          if (++t == 20)
  22.          {
  23.              t = 0;
  24.              LED0_TOGGLE();
  25.          }
  26.          
  27.          delay_ms(10);
  28.     }
  29. }
复制代码
本实验的应用代码很简单,主要就是配置了PVD的阈值电压为2.7V。

28.3 下载验证
在完成编译和烧录操作后,若系统的供电正常,便可以在LCD上看到“PVD Voltage OK!”的提示,并且LED1也处于熄灭状态;若系统的供电低于设置的PVD电压阈值2.7V时,便可以在LCD上看到“PVD Low Voltage!”的提示,并且LED1也会亮起(系统供电过低时,可能出现跟多意想不到的结果,因此可能会看不到部分现象)。
正常情况下开发板的供电都是正常的,若读者强制影响开发板的供电,可能导致不可逆的硬件损坏。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 00:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表