搜索
bottom↓
回复: 0
打印 上一主题 下一主题

《ATK-DFPGL22G之FPGA开发指南_V1.0》第二十八章 PVD电压监控实验

[复制链接]

出0入234汤圆

跳转到指定楼层
1
发表于 2023-7-7 14:56:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1)实验平台:正点原子 DFZU2EG_4EV MPSoC开发板
2)购买链接:https://item.taobao.com/item.htm?&id=692368045899
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-340252-1-1.html
4)正点原子官方B站:https://space.bilibili.com/394620890
5)正点原子FPGA交流群:994244016





第二十八章 PVD电压监控实验


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


28.1 硬件设计
28.1.1 例程功能

1. 当MCU电源电压低于2.7V时,LED1亮起,并且LCD显示相应的提示;当MCU电源电压恢复至高于2.7V时,LED1熄灭,并且LCD显示相应的提示
2. LED0闪烁,指示程序正在运行
28.1.2 硬件资源
1. LED
        LED0 - PB5
        LED1 - PE5
2. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
3. PVD
28.1.3 原理图
本章实验使用的PVD为APM32E103的片上资源,因此没有对应的连接原理图。
28.2 程序设计
28.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);
该函数的形参描述,如下表所示:
表28.2.1.1 函数PMU_ConfigPVDLevel()形参描述

该函数的返回值描述,如下表所示:
表28.2.1.2 函数PMU_ConfigPVDLevel()返回值描述

该函数的使用示例,如下所示:
#include "apm32e10x.h"
#include "apm32e10x_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);
该函数的形参描述,如下表所示:
表28.2.1.3 函数PMU_EnablePVD()形参描述

该函数的返回值描述,如下表所示:
表28.2.1.4 函数PMU_EnablePVD()返回值描述

该函数的使用示例,如下所示:
#include "apm32e10x.h"
#include "apm32e10x_pmu.h"

void example_fun(void)
{
    /* 使能PVD */
    PMU_EnablePVD();
}
28.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时钟 */
/* 设置PVD电压阈值 */
    PMU_ConfigPVDLevel((PMU_PVD_LEVEL_T)pls);
   
    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)
{   /* 判断事件线16中断标志 */
    if (EINT_ReadIntFlag(EINT_LINE_16) == SET)
    {
        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在监测到电源电压低于设定的电压阈值时,会有相应的操作,但是由于电压过低可能导致无法观察到部分操作的现象。
28.2.3 实验应用代码
本实验的应用代码,如下所示:
int main(void)
{
    uint8_t t = 0;
   
    NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_4); /* 设置中断优先级分组为组4 */
    sys_apm32_clock_init(15);                        /* 配置系统时钟 */
    delay_init(120);                                /* 初始化延时功能 */
    usart_init(115200);                             /* 初始化串口 */
    led_init();                                     /* 初始化LED */
    lcd_init();                                     /* 初始化LCD */
    pmu_pvd_init(PMU_PVD_LEVEL_2V7);                /* 初始化PVD电压阈值为2.7V */
   
    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。
28.3 下载验证
在完成编译和烧录操作后,若系统的供电正常,便可以在LCD上看到“PVD Voltage OK!”的提示,并且LED1也处于熄灭状态;若系统的供电低于设置的PVD电压阈值2.7V时,便可以在LCD上看到“PVD Low Voltage!”的提示,并且LED1也会亮起(系统供电过低时,可能出现跟多意想不到的结果,因此可能会看不到部分现象)。
正常情况下开发板的供电都是正常的,若读者强制影响开发板的供电,可能导致不可逆的硬件损坏。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 20:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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