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

发布者:温馨家园最新更新时间:2019-08-20 来源: eefocus关键字:stm32  PVD  可编程电压监测器  掉电保存数据 手机看文章 扫描二维码
随时随地手机看文章

前言: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正常工作中...rn");

//去掉上面两个中断配置函数,也可以在while循环里不断查询PWR状态来判断VDD电压是否高于或低于阈值,如下

#if 0

if(PWR_GetFlagStatus(PWR_FLAG_PVDO)){ 

printf("电压低于阈值.rn");

}else{

printf("电压高于阈值.rn");

}

#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中断,电压高于阈值rn");

       }

       else                                    //低于阈值

       {

          printf("进入PVD中断,电压低于阈值rn");

       }      

       EXTI_ClearITPendingBit(EXTI_Line16);

    }

}

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


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


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

关键字:stm32  PVD  可编程电压监测器  掉电保存数据 引用地址:stm32之PVD可编程电压监测器(掉电保存数据)

上一篇:stm32之备份寄存器(BKP)应用(侵入检测中断)
下一篇:stm32之电源管理(实现低功耗)

推荐阅读最新更新时间:2024-11-12 03:32

关于STM32定时器中TI1FP1 与TI1FP2及相关话题
整体来讲,STM32各个系列的TIMER外设基本框架和功能是类似的,大体分高级定时器、通用定时器和基本定时器。除了基本定时器外,每个高级定时器或部分通用定时器都可以产生4对中间信号,分别是TI1FP1 与TI1FP2,TI2FP1 与TI2FP2,TI3FP3 与TI3FP4,TI4FP3 与TI4FP4,即每个输入通道可以生产1对信号。这里以STM32F103系列为例聊聊T这个 TImFPn,。 在SMT32各系列的参考手册的定时器部分,在描述高级定时器或通用定时器时都可以看到如下的一副图。图中对那4对信号被清晰地描绘了出来。 这四对信号可以统一写为:TImFPn,其中 m代表滤波和边沿检测器前的输入通道号,n代表经过滤
[单片机]
关于<font color='red'>STM32</font>定时器中TI1FP1 与TI1FP2及相关话题
STM32直接驱动ov7670 开发笔记
很久没更新技术日志了,最近在调试OV7670摄像头,之中遇见了不少的麻烦。什么花屏啦,彩条不正常呀,等等,很多很多。经过一周的调试可算是调试出来了;期间在网上也查了很多,我想大家都会发现尽然都不能用,网上配置的寄存器表都是有错误的(对于没有fifo的,有fifo的我没试过),我花了一天时间认认真真的把OV7670的英文手册看了一遍,发现中文手册错的的太多了,就算是英文手册里有几个寄存器也没说清楚,实验和手册说的不统一。直接驱动摄像头的话STM32可以做到一帧(网上说用DMA方式,我是没办法实现),虽然做出来意义不大,但是可以学习摄像头这方面很多知识。 经过我的调试发现,要成功的关键:首先是时钟的初始化,直接驱动时时钟设置和寄存器设定
[单片机]
stm32 升级程序方案
STM32芯片自带固化的ISP程序,在芯片上电的时候会检查BOOT0 BOOT1电平状态,如果 BOOT0=1 BOOT1=0 则会进入自带的ISP程序,基本可以满足程序升级需要。 但是如何进入这个模式,是一个问题,网上有人使用串口的握手信号来控制,但是这样会超过3条线(RX TX GND)。 昨天测试了一个方法,上位机发出一个指令,STM32用户自己的程序解析后,利用自己的IO口,控制一个简单的延时电路来拉高BOOT0,然后芯片重新启动,则进入ISP。刷新完成后,跳入用户程序运行,控制权交回用户程序。 程序中设置PB8为 ISP_DRV ,推挽输出;输出一定时间后,充满电容后,可以使用NVIC_SystemReset(
[单片机]
STM32 USB接口介绍
以下内容基于STM32H7系列进行介绍,同样适用于STM32F4/F7系列芯片。 USB on-the-go 高速(OTG_HS) STM32的USB接口支持OTG模式,芯片手册上描述如下: USB OTG 是一款双角色设备 (DRD) 控制器,同时支持从机功能和主机功能,完全符合 USB 2.0 规范的 On-The-Go 补充标准。此外,该控制器也可配置为“仅主机”模式或“仅从机” 模式,完全符合 USB 2.0 规范。 OTG通俗一点来说,就是既可以作为从设备和主机通信(比如电脑读写手机上的内容),又可以作为主机和从设备通信(比如手机读写U盘) USB 通信速率 STM32 USB支持三种速度模式,高速模式(High Spe
[单片机]
<font color='red'>STM32</font> USB接口介绍
STM32 RTC 时钟
6.2.8 RTC 时钟 通过设置备份域控制寄存器(RCC_BDCR)里的RTCSEL 位,RTCCLK时钟源可以由 HSE/128、LSE或LSI时钟提供。除非备份域复位,此选择不能被改变。 LSE时钟在备份域里,但HSE和LSI时钟不是。因此: ● 如果LSE被选为RTC时钟: ─ 只要V BAT 维持供电,尽管V DD 供电被切断,RTC仍继续工作。 ● 如果LSI被选为自动唤醒单元(AWU)时钟: ─ 如果V DD 供电被切断, AWU状态不能被保证。有关LSI校准,详见6.2.559/754节LSI时钟。 ● 如果HSE时钟128分频后作为RTC时钟: ─ 如果V DD 供电被切断或内部电压调压器
[单片机]
<font color='red'>STM32</font> RTC 时钟
STM32学习之:USART中断方式
前面我们接收了串口通信的查询方式,现在我们来介绍中断方式。 步骤一:初始化GPIO GPIO_InitTypeDef GPIO_InitStructure; /* Configure USART1 Tx (PA.09) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_Init
[单片机]
FreeModbus 移植于STM32 实现Modbus RTU通信
毕业设计自己要做个基于STM32的PLC能直接跑语句表的,现在看来好像没有什么创新的地方,不过实现的方式绝对够创新的了...呵呵。自己写的开题报告中说了要有高级的通信功能。现在做以太网有点来不及了,CAN又感觉不搭调,硬件上也没准备。串口上跑Modbus感觉不错。本来西门子的S7-200就能跑Modbus,STM32-PLC当然也要支持Modbus 什么 组态软件,触摸屏都可以连上,不过FreeModbus只支持从机有点可惜,当然本来协议也不难而且也必要实现全协议栈。 Modbus中文协议.PDF STM32移植FreeModbus的步骤: 首先去 http://www.freemodbus.org 下载文件 一定要是
[单片机]
FreeModbus 移植于<font color='red'>STM32</font> 实现Modbus RTU通信
STM32_DCMI
1:DCMI简介 DCMI是STM32F4芯片自带的一个数字摄像头接口,该接口是一个同步并行接口,能够接受外部8位、10位、12位、14位CMOS摄像头模块发出的高速数据流 可支持的数据格式: YCbCr4:2:2 RGB565逐行视频 压缩数据 (JPEG) 2:DCMI功能概述 数字摄像头接口是一个同步并行接口,可接收 高速(可达 54 MB/s)数据流 。该接口包含多 达 14 条数据线 (D13-D0) 和一条像素时钟线 (PIXCLK)。像素时钟的极性可以编程,因此可 以在像素时钟的上升沿或下降沿捕获数据。 这些数据被放到 32 位数据寄存器 (DCMI_DR) 中,然后通过通用 DMA 进行传输。 图
[单片机]
STM32_DCMI
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved