【正点原子STM32连载】 第三十章 PVD电压监控实验 摘自【正点原子】APM32F407最小系统板使用指南

news2024/11/26 21:35:51

1)实验平台:正点原子stm32f103战舰开发板V4
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html#

第三十章 PVD电压监控实验

本章介绍APM32F407电源电压监测器(PVD)的使用,PVD可以设置一个电压阈值,当监测到电源电压低于该阈值后,可以触发中断,以完成一些紧急处理。通过本章的学习,读者将学习到PVD的使用。
本章分为如下几个小节:
30.1 硬件设计
30.2 程序设计
30.3 下载验证

30.1 硬件设计

30.1.1 例程功能

  1. 当MCU电源电压低于2.7V时,LED1亮起,并且LCD显示相应的提示;当MCU电源电压恢复至高于2.7V时,LED1熄灭,并且LCD显示相应的提示
  2. LED0闪烁,指示程序正在运行
    30.1.2 硬件资源
  3. LED
    LED0 - PF9
    LED1 - PF10
  4. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
  5. PVD
    30.1.3 原理图
    本章实验使用的PVD为APM32F407的片上资源,因此没有对应的连接原理图。
    30.2 程序设计
    30.2.1 Geehy标准库的PMU驱动
    本章实验使用的PVD为PMU的子模块,因此对PVD的操作函数都由Geehy标准库中的PMU驱动提供,使用PVD的具体步骤如下:
    ①:配置PVD电压阈值
    ②:配置PVD输出对应的EINT线
    ③:使能PVD中断,并配置其相关的中断优先级
    ④:使能PVD
    在Geehy标准库中对应的驱动函数如下:
    ①:配置PVD电压阈值
    该函数用于配置PVD的电压阈值,其函数原型如下所示:
    void PMU_ConfigPVDLevel(PMU_PVD_LEVEL_T level);
    该函数的形参描述,如下表所示:
    在这里插入图片描述

表30.2.1.1 函数PMU_ConfigPVDLevel()形参描述
该函数的返回值描述,如下表所示:
在这里插入图片描述

表30.2.1.2 函数PMU_ConfigPVDLevel()返回值描述
该函数的使用示例,如下所示:

#include "apm32f4xx.h"
#include "apm32f4xx_pmu.h"

void example_fun(void)
{
    /* 配置PVD的阈值电压的2.7V */
    PMU_ConfigLVDLevel(PMU_PVD_LEVEL_2V7);
}

②:配置EINT
PVD输出对应的外部中断与事件线为EINT16,其配置方式请见第12.2.3小节中配置EINT的相关内容。
③:使能PVD中断
请见第12.2.3小节中配置中断的相关内容。
④:使能PVD
该函数用于使能PVD,其函数原型如下所示:
void PMU_EnablePVD(void);
该函数的形参描述,如下表所示:
形参 描述
无 无
表30.2.1.3 函数PMU_EnablePVD()形参描述
该函数的返回值描述,如下表所示:
返回值 描述
无 无
表30.2.1.4 函数PMU_EnablePVD()返回值描述
该函数的使用示例,如下所示:

#include "apm32f4xx.h"
#include "apm32f4xx_pmu.h"

void example_fun(void)
{
    /* 使能PVD */
    PMU_EnablePVD();
}

30.2.2 PMU驱动
本章实验的PMU驱动主要负责向应用层提供PVD的初始化函数,并实现PVD的中断回调函数。本章实验中,PMU的驱动代码包括pmu.c和pmu.h两个文件。
PMU驱动中,初始化PVD的函数,如下所示:

/**
 * @brief	初始化PVD
 * @param	pls: PVD 电压阈值
 *   @arg	PMU_PVD_LEVEL_2V0: PVD电压阈值设置为2.0V
 *   @arg	PMU_PVD_LEVEL_2V1: PVD电压阈值设置为2.1V
 *   @arg	PMU_PVD_LEVEL_2V3: PVD电压阈值设置为2.3V
 *   @arg	PMU_PVD_LEVEL_2V5: PVD电压阈值设置为2.5V
 *   @arg	PMU_PVD_LEVEL_2V6: PVD电压阈值设置为2.6V
 *   @arg	PMU_PVD_LEVEL_2V7: PVD电压阈值设置为2.7V
 *   @arg	PMU_PVD_LEVEL_2V8: PVD电压阈值设置为2.8V
 *   @arg	PMU_PVD_LEVEL_2V9: PVD电压阈值设置为2.9V
 * @retval	无
 */
void pmu_pvd_init(uint32_t pls)
{
    EINT_Config_T eint_pmu_init_struct;
    
    RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_PMU);			/* 使能PMU时钟 */
    PMU_ConfigPVDLevel((PMU_PVD_LEVEL_T)pls);				/* 设置PVD电压阈值 */
    
    eint_pmu_init_struct.line		= EINT_LINE_16;					/* 事件线16 */
    eint_pmu_init_struct.mode		= EINT_MODE_INTERRUPT;			/* 中断模式 */
    eint_pmu_init_struct.trigger	= EINT_TRIGGER_RISING_FALLING;	/* 双边沿触发 */
    eint_pmu_init_struct.lineCmd	= ENABLE;				/* 使能事件线16 */
    EINT_Config(&eint_pmu_init_struct);						/* 配置事件线16 */
    
    NVIC_EnableIRQRequest(PVD_IRQn, 3, 0);					/* 使能PVD中断 */
    PMU_EnablePVD();											/* 使能PVD */
}

从上面的代码中可以看到,PVD的初始化函数中,根据函数传入的参数配置了PVD的电压阈值,并开启了PVD的相关中断和使能PVD。
PMU驱动中,PVD的中断回调函数,如下所示:

/**
 * @brief	PVD中断回调函数
 * @param	无
 * @retval	无
 */
void PVD_IRQHandler(void)
{
    if (EINT_ReadIntFlag(EINT_LINE_16) == SET)	/* 判断事件线16中断标志 */
    {
    		if (PMU_ReadStatusFlag(PMU_FLAG_PVDO) == SET)
    		{
    			/* LCD显示电压低 */
    			lcd_show_string(30, 130, 200, 16, 16, "PVD Low Voltage!", RED);
    			LED1(0);							/* 点亮LED1 */
    		}
    		else
    		{
    			/* LCD显示电压正常 */
    			lcd_show_string(30, 130, 200, 16, 16, "PVD Voltage OK! ", BLUE);
    			LED1(1);							/* 熄灭LED1 */
    		}
    		
    		EINT_ClearIntFlag(EINT_LINE_16);		/* 清除事件线16中断标志 */
    }
}

从PVD的中断回调函数中可以看到,当PVD监测到电源电压小于设定的电压阈值时,会在LCD上显示电压低的提示并点亮LED1,在PVD监测到电源电压恢复至设定的电压阈值时,会在LCD上显示电压正常的提示并熄灭LED1。
虽然PVD在监测到电源电压低于设定的电压阈值时,会有相应的操作,但是由于电压过低可能导致无法观察到部分操作的现象。
30.2.3 实验应用代码
本章实验的应用代码,如下所示:

int main(void)
{
    uint8_t t = 0;
    
    NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_3);	/* 设置中断优先级分组为组3 */
    sys_apm32_clock_init(336, 8, 2, 7);					/* 配置系统时钟 */
    delay_init(168);										/* 初始化延时功能 */
    usart_init(115200);									/* 初始化串口 */
    led_init();											/* 初始化LED */
    lcd_init();											/* 初始化LCD */
    /* 初始化PVD电压阈值为2.7V */
    pmu_pvd_init(PMU_PVD_LEVEL_2V7);
    
    lcd_show_string(30, 50, 200, 16, 16, "APM32", RED);
    lcd_show_string(30, 70, 200, 16, 16, "PVD TEST", RED);
    lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
    
    /* LCD默认显示电压正常 */
    lcd_show_string(30, 110, 200, 16, 16, "PVD Voltage OK! ", BLUE);
    
    while (1)
    {
    		if ((t % 20) == 0)
    		{
    			LED0_TOGGLE();
    		}
    		
    		t++;
    		delay_ms(10);
    }
}

本实验的应用代码很简单,主要就是配置了PVD的阈值电压为2.7V。
30.3 下载验证
在完成编译和烧录操作后,若系统的供电正常,便可以在LCD上看到“PVD Voltage OK!”的提示,并且LED1也处于熄灭状态;若系统的供电低于设置的PVD电压阈值2.7V时,便可以在LCD上看到“PVD Low Voltage!”的提示,并且LED1也会亮起(系统供电过低时,可能出现跟多意想不到的结果,因此可能会看不到部分现象)。
正常情况下开发板的供电都是正常的,若读者强制影响开发板的供电,可能导致不可逆的硬件损坏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1005047.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VUE 的eslint 代码规范检查

报错: You may use special comments to disable some warnings. Use // eslint-disable-next-line to ignore the next line. Use /* eslint-disable */ to ignore all warnings in a file. 解决: 注释:...(config.dev.useEslint ? [creat…

ThreadLocal功能实现

模拟ThreadLocal功能实现 当前线程任意方法内操作连接对象 一个栈对应一个线程 , 一个方法调用另一个方法都是在一个线程内 , 只有执行了线程的start方法才会创建一个线程 定义一个Map集合 , key是当前线程(Thread.currentThread) , value是要绑定的数据(Connection对象) 以…

2023年澳大利亚标普ASX200指数研究报告

第一章 指数概况 1.1 指数基本情况 澳大利亚标普ASX200(S&P/ASX200)指数是由标准普尔(S&P)和澳大利亚证券交易所(Australian Securities Exchange, ASX)共同编制的主要股票市场指数,简…

【Linux-Day10-信号量,共享内存,消息队列】

信号量 信号量描述 信号量是一个特殊的变量,一般取正数值。它的值代表允许访问的资源数目,获取资源 时,需要对信号量的值进行原子减一,该操作被称为 P 操作。 当信号量值为 0 时,代表没有资源可用,P 操作…

腾讯云服务器购买详细流程_配置选择_新手入门

腾讯云服务器购买流程直接在官方秒杀活动上购买比较划算,在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵,但是自定义购买云服务器CPU内存带宽配置选择范围广,活动上购买只能选择固定的活动机,选择范围窄,但是…

消息队列--必须掌握的两个基础模式

目录 队列模式有什么设计的问题? 发布订阅模式生产者如何确认消息发往哪个队列? 总结 队列模式 我们都知道队列是一种数据结构吗,它的特性是先进先出,就跟我们平时在食堂打饭排队一样,排在前面的同学打完饭了就走了&a…

数据结构——排序算法——希尔排序

希尔排序本质上是对插入排序的一种优化,它利用了插入排序的简单,又克服了插入排序每次只交换相邻两个元素的缺点。它的基本思想是: 1.将待排序数组按照一定的间隔分为多个子数组,每组分别进行插入排序。这里按照间隔分组指的不是…

Optional<T>

java中的 Optional类&#xff1a; //Optional用于处理可能为空的值的容器类&#xff0c;目的为了解决空指针问题 public final class Optional<T>{//Return true if there is a value present, otherwise false.//Returns:true if there is a value present, otherwise…

Spring Boot @Value读不到Nacos配置中心的值。(properties配置文件)

读不到配置中心的值&#xff0c; 配置中心的配置文件名字&#xff08;Data ID的值&#xff09;要以.properties结尾。 如果是yaml&#xff0c;就以yaml命名。

大数据Flink(七十八):SQL 的水印操作(Watermark)

文章目录 SQL 的水印操作(Watermark) 一、为什么要有 WaterMark

计算由于海洋温度和盐度变化产生的比容海平面变化

近些年由于全球气候变暖&#xff0c;全球的海平面不断上升。目前的研究显示&#xff0c;造成海平面变化的原因主要有两个&#xff1a;一个是由于陆地质量的流入&#xff08;比如两级冰川的融化&#xff0c;冰雪以径流的形式汇入海洋&#xff0c;总体上使得海洋的总质量产生变化…

Redis新篇一:认识Redis

首先&#xff0c;很抱歉小伙伴们&#xff0c;前段时间一直都没有更新&#xff0c;我很抱歉&#xff0c;现在开始持续更新Redis相关内容啦&#xff01;有需要的小伙伴们可以持续关注一下小博主的新篇哦~ 希望对你们有帮助&#xff01; 作者&#xff1a;爱撸猫的程序员 博客地址…

<C++> 基于SSE实现图像二值化

基于SSE实现图像二值化 SSE介绍及使用可见&#xff1a;https://blog.csdn.net/thisiszdy/article/details/132512686 本文使用SSE指令集来实现图像二值化算法&#xff0c;同时对比OpenCV二值化算子及for循环求解二值化的效果及性能。 // opencvTest.cpp : 此文件包含 "m…

2011-2022年北大法宝省市县环保行政处罚数据

2011-2022年北大法宝省市县环保行政处罚数据 1、时间&#xff1a;2011-2022年 2、范围&#xff1a;全国各省份、各城市、各区县 3、来源&#xff1a;北大法宝 4、数据指标&#xff1a;地区代码、地区名称、地区等级、所属省份、所属城市、处罚年份、主题分类、案件数目 5、…

如何使用谷歌浏览器连接linux服务器SSH服务

环境&#xff1a; 谷歌浏览器 版本 116.0.5845.141&#xff08;正式版本&#xff09; &#xff08;64 位&#xff09; Win10 专业版 安全外壳 (SSH)v.0.58 问题描述&#xff1a; 如何使用谷歌浏览器连接linux服务器SSH服务 解决方案&#xff1a; 1.找了有台安装好了这个插…

数据结构——排序算法——堆排序

堆排序过程如下&#xff1a; 1.用数列构建出一个大顶堆&#xff0c;取出堆顶的数字&#xff1b; 2.调整剩余的数字&#xff0c;构建出新的大顶堆&#xff0c;再次取出堆顶的数字&#xff1b; 3.循环往复&#xff0c;完成整个排序。 构建大顶堆有两种方式&#xff1a; 1.从 0 开…

2023更新:多功能短视频去水印工具微信小程序源码,带流量主功能(教程含源码)

简介&#xff1a; 这是一个自带去水印接口的多功能小程序&#xff0c;支持各大平台短视频去水印&#xff0c;保存封面、图集、标题等等&#xff0c;还可以本地图片去水印&#xff0c;图片拼接&#xff0c;九宫格切图&#xff0c;修改视频的MD5等等。当然&#xff0c;也支持流量…

LeetCode算法心得——和为k的子数组(前缀和+HashMap)

大家好&#xff0c;我是晴天学长&#xff0c;这是一个很重要的前缀和hash运用的题&#xff0c;为后面很多的题打基础&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。 1) .和为k的子数组 2) .算法思路 和为k的子数组 1.首先是前缀和 2.根据关系 s【…

Ceph入门到精通-S3 基准测试工具warp使用入门

S3 基准测试工具。 下载 下载适用于各种平台的二进制版本。 配置 可以使用命令行参数或环境变量配置 Warp。 可以使用 、 在命令行上指定要使用的 S3 服务器&#xff0c;也可以选择指定 TLS 和自定义区域。--host--access-key--secret-key--tls--region 也可以使用 、、 和…

22.Xaml TabControl 控件--->选项卡控件

1.运行效果 2.运行源码 a.Xaml源码 <Window x:Class="testView.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic…