前言:stm32系列提供了可编程电压检测器PVD,它是实时检测VDD的电压,当检测到电压低于或者高于PVD设置的阈值时,会想内核产生一个PVD中断(EXTI线中断)以使内核在复位前进行紧急处理。该电压阈值可通过PWR_CSR设置。

PVD可配置8个等级:

代码设计:

#include "stm32f10x.h"
#include "stdio.h"static void EXTI_Configuration(void);
static void PVD_NVIC_Configuration(void);
static void USART1_Config(void);
static void Delay(__IO u32 nCount);int main(void)
{   USART1_Config();//使用串口1来打印调试信息RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PVD电压检测模块的时钟//通过执行下面两个中断配置函数后,当VDD电压高于或者低于阈值时,就会进入PVD_IRQHandler中断EXTI_Configuration();//配置EXTI_Line16外部中断PVD_NVIC_Configuration();//PVD中断优先级PWR_PVDLevelConfig(PWR_PVDLevel_2V9);//设置PVD阈值PWR_PVDCmd(ENABLE);//使能PVD电压检测while(1){Delay(0xfffff);printf("STM32正常工作中...\r\n");//去掉上面两个中断配置函数,也可以在while循环里不断查询PWR状态来判断VDD电压是否高于或低于阈值,如下#if 0if(PWR_GetFlagStatus(PWR_FLAG_PVDO)){ printf("电压低于阈值.\r\n");}else{printf("电压高于阈值.\r\n");}#endif}
}void EXTI_Configuration(void)
{EXTI_InitTypeDef EXTI_InitStructure;EXTI_DeInit();EXTI_StructInit(&EXTI_InitStructure);EXTI_InitStructure.EXTI_Line = EXTI_Line16;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//上升沿和下降沿都触发EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);
}void PVD_NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}void USART1_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;//配置串口1(USART1)时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);//配置串口1(USART1 Tx (PA.09))GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//配置串口1 USART1 Rx (PA.10)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);//串口1模式(USART1 mode)配置 USART_InitStructure.USART_BaudRate = 9600;//一般设置为9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No ;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);USART_Cmd(USART1, ENABLE); //使能串口
}int fputc(int ch, FILE *f)//重写标准库的fputc函数
{//将Printf内容发往串口USART_SendData(USART1, (unsigned char) ch);while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);    return (ch);
}void Delay(__IO u32 nCount)     //简单的延时函数
{for(; nCount != 0; nCount--);
} 

在stm32f10x_it.c文件加入:

void PVD_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line16) != RESET){if(PWR_GetFlagStatus(PWR_FLAG_PVDO)==0) //高于阈值{                                         printf("进入PVD中断,电压高于阈值\r\n");}else                                    //低于阈值{printf("进入PVD中断,电压低于阈值\r\n");}      EXTI_ClearITPendingBit(EXTI_Line16);}
}

代码附带了不少注释,相信不难理解。编译下载到板子后,还需要一个可调电源来改变芯片的供电电压,当电压低于或者高于阈值的时候,就会进入PVD_IRQHandler中断,在PC端串口上位机可接受到进入中断打印的信息。

只要电压超过2.0v芯片就能正常工作,不是低于阈值就不能工作。所以在实际运用中,如果是用电池给芯片供电,当电池电量不足时,电池的供电电压就会下降,下降到低于阈值时就会触发PVD中断,那么这时候需要进行数据备份处理或者进行低电量提醒。

如果直接切断电源,进入中断只能维持很短很短的时间,连一句打印信息也无法完整输出。解决这个问题,需要在电源输入点加大电容,当掉电的时候由电容提供电源维持芯片运行一段时候,以做紧急数据保存。所选用电容的参数影响掉电后芯片维持运行的时间,根据掉电中断处理所需的时间长短来选用电容。

<< 骐骥一跃,不能十步;驽马十驾,功在不舍。———荀子 >>

stm32之PVD可编程电压监测器(掉电保存数据)相关推荐

  1. 【干货】STM32通过ADC模拟看门狗实现掉电保存

    1.前言 很多时候我们需要将程序中的一些参数.数据等存储在EEPROM或者Flash中,达到掉电保存的目的.但有些情况下,程序需要频繁的修改这些参数,如果每次修改参数都进行一次保存,那将大大降低存储器 ...

  2. quartus管脚分配后需要保存吗_掉电保存数据到EEPROM

    我想在掉电时保存数据(3 个字节)到 EEPROM 中,用 BOD掉电检测,不知怎样使用.望高手指点: 1. 在 BOOT 区设置好 BODEN,BODLEVEL,后软件还要怎样设置? 2. 掉电中断 ...

  3. 技能梳理7@stm32+OLED+flash掉电保存+按键

    学校违纪分数记录,按键,1.3寸OLED显示,数据掉电保存 1.项目简介 2.实现逻辑 #如上图为显示屏显示内容 #三个物理按键,一个是选择对哪一项进行控制,两个是加减对应项的分数 #控制范围±10, ...

  4. 新手必看!单片机掉电检测与数据掉电保存方案

    单片机在正常工作时,因某种原因造成突然掉电,将会丢失数据存储器(RAM)里的数据.在某些应用场合如测量.控制等领域,单片机正常工作中采集和运算出一些重要数据,待下次上电后需要恢复这些重要数据. 因此, ...

  5. STM32----FLASH掉电保存动态平衡方案

    stm32是支持对自身Flash(code区)进行读写的.所以,在某些需要掉电保存的场合,我们可以利用这一特性节省一个外部的Flash或者EEPROM,对数据进行保存. 但是,如果需要经常性的保存数据 ...

  6. 大彩串口屏如何实现掉电保存功能

    一.概述 本文主要阐述的是如何在串口屏中实现掉电保存的功能,即用户在对文本输入之后,设置了保存的操作之后,能够实现屏幕在掉电重新上电的情况下实现数据保存的功能,即重新上电还是显示上次输入的文本内容.本 ...

  7. C语言掉电保存的变量,求解释,怎么能让程序里的变量在关闭后依然保存呢?...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include int main(){ int c,q; //定义c为余额 q为存取额 char choice; // choice为 ...

  8. stm32flash存储掉电不失数据

    先页擦除再写入 写入范围:0x08000000+程序大小<写入地址+写入字节〈flash大小 程序大小: program size:code:1032rodata:336rwdata:12zid ...

  9. STM32关于PVD低电压能检测的知识

    在实际工程运用中需要对突发情况作出及时的相应,通常都需要考虑当系统电压下降或断电时,需要对控制系统加以保护.这时候就需要在程序中加入系统电压监测(PVD).供电电压降低到某一个电压值时,需要系统进入保 ...

最新文章

  1. 关于spring事务管理
  2. 动态sql语句输出参数
  3. springmvc二十二:annotation-driven标签
  4. Python中数字以及算数运算符的相关使用
  5. sple表达式_学习Spring表达式语言(SpEL)
  6. 200+猫在线待撸!来pick你最爱的那只!
  7. 值类型 引用类型 堆栈 堆 之 异想
  8. java additem 错,Java错误:IllegalArgumentException:向容器添加窗口
  9. 经典排序算法(9)——桶排序算法详解
  10. swing 选择对话框_Java Swing –日期选择器对话框
  11. python相对引用_Python 模块相对引用
  12. 撒贝宁探班威马体验百度Apollo L4级自动驾驶 感慨:确实震撼
  13. 发布一个 Linux 下的 C++ 多线程库
  14. 使用Xshell密钥认证远程登录linux
  15. mpchart点击_MPAndroidChart实现K线面板(一)
  16. 集合框架之Connection(马士兵教育视频教程总结笔记)
  17. while在Java用法_while和do-while的使用方法
  18. 利用LSTM自动生成中文文本
  19. 介绍几款网页数据抓取软件
  20. Jenkins Pipeline声明式流水线

热门文章

  1. python3 随机数 质数 素数 文件操作
  2. Linux中基于snmp协议的mrtg安装及使用
  3. [Asp.net]AspNetPager分页组件
  4. PingingLab传世经典系列《CCNA完全配置宝典》-5.8 静态NAT
  5. 推荐 10 个你没见过的 VsCode 的高效开源神器,YYDS
  6. 最强markdown编辑器typora图床教程-七牛版
  7. linux deepin ubuntu apt安装openjdk-8-jdk
  8. K8S部署工具:KubeOperator集群部署
  9. spark 历史版本下载地址
  10. linux bash中的引号:单双引号、反撇号