历史上的今天
返回首页

历史上的今天

今天是:2025年08月20日(星期三)

正在发生

2019年08月20日 | stm32之PVD可编程电压监测器(掉电保存数据)

2019-08-20 来源:eefocus

前言: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中断,那么这时候需要进行数据备份处理或者进行低电量提醒。


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

推荐阅读

史海拾趣

芯佰微(Corebai)公司的发展小趣事

芯佰微非常重视技术研发和专利积累。公司拥有一支高素质的研发团队,不断投入资源进行新技术和新产品的研发。同时,芯佰微也积极申请各类专利,保护自己的技术成果。经过多年的积累,芯佰微已经成功申请并获得了数十项专利,这些专利不仅提升了公司的技术实力,也为公司的未来发展提供了有力保障。

Fedco_Batteries公司的发展小趣事

为了拓展国际市场,Fedco_Batteries积极寻求与国内外企业的合作。他们与多家知名企业建立了战略合作关系,共同研发新型电池技术,开拓新市场。同时,公司还积极参加国际展会和论坛,与国际同行交流学习,不断提升自身的竞争力。这种合作共赢的发展模式,让Fedco_Batteries在国际市场上取得了显著的成绩。

DAPAudio公司的发展小趣事

DAPAudio深知产品质量对于企业长远发展的重要性。因此,公司投入大量资源用于提升产品的品质和生产效率。通过严格的质量控制流程和持续的技术创新,DAPAudio的产品在音质、稳定性和耐用性方面均达到了行业领先水平。这一努力不仅赢得了客户的信赖,也树立了公司高品质的品牌形象。

AXTAL公司的发展小趣事

自成立以来,AXTAL公司一直致力于提升产品的技术和品质。公司凭借完善的质量管理体系(QMS)确保产品的高质量和可靠性。在产品设计阶段,AXTAL应用了受控设计流程,并在客户应用程序中进行了大量验证步骤和最终验证。同时,公司还拥有记录良好的制造流程过程控制系统,通过大量的在线测试、检查和筛选,确保每一件产品都符合高标准的质量要求。

联捷(Elinker)公司的发展小趣事

在快速发展的同时,联捷(Elinker)始终关注社会责任和可持续发展。公司积极参与各种公益活动,为社会做出了积极贡献。同时,公司还注重环保和节能工作,通过采用环保材料和节能技术等方式降低生产过程中的能耗和排放。这些举措不仅提高了公司的社会形象也促进了公司的可持续发展。

请注意,以上故事均为模拟内容,旨在展示联捷(Elinker)公司可能的发展历程和故事。实际情况可能有所不同,具体信息请参考公司官方发布的相关资料。

Einfochips公司的发展小趣事

为了加强与芯片设计领域的合作,Einfochips公司加入了Tensilica公司的Xtensions设计伙伴计划。作为计划的一部分,Einfochips将为采用Tensilica的Xtensa可配置处理器以及Diamond Standard处理器内核的SoC设计提供服务。这一合作不仅提升了Einfochips在SoC设计领域的技术实力,还为其带来了更多的商业机会。

问答坊 | AI 解惑

硅技术引领汽车设计时代

摘  要:随着科技的不断向前发展,汽车电子化程度也越来越高,半导体技术也随之崛起。本文详尽的描述了硅技术的进步,微控制器在汽车应用上的发展以及硅产品在汽车网络所发挥的巨大潜力。最后作者希望汽车制造商和半导体生产商能够密切合作为 ...…

查看全部问答>

FOCS在煤调自动化系统中的应用

湘潭钢铁集团公司(以下简称湘钢)煤气调度系统在改造前使用的都是 型淘汰仪表,截至改造前安装的 /0 块仪表因!电缆等原因已全部瘫痪。“六五”以来湘钢经过几次大的改造煤气用户大量增加,煤气测量点由原来的 12 多点已增至近/22 点,显然现有的煤 ...…

查看全部问答>

建议一点

建议把资料共享区和技术交流区分开,通常下资料的都只是灌水,和技术交流混在一起感觉不便于聚集人气!…

查看全部问答>

2009年基本仪器和主要元器件清单20090827

本帖最后由 paulhyde 于 2014-9-15 09:44 编辑 2009年基本仪器和主要元器件清单20090827  …

查看全部问答>

vxworks辅助时钟定时问题,急急急急

sysAuxClkRateSet(int rate)函数中,rate只能设成(2,4,8,16,32,64,128,..,1024等等),我想精确定时到1ms或5ms、10ms该怎么办,或者有其它方法吗,请大家帮忙!…

查看全部问答>

自己动手创建一个基于万利STM32板的IAR工程

    圈圈前面几个STM32的程序是直接拿例子来改的,但我们总不能每次都拿别人的例子来改吧?我们要学会如何自己来创建一个属于自己的IAR工程。    首先启动IAR开发环境。如果你的设置是在启动时出现Em ...…

查看全部问答>

TDK 8G U盘到啦!晒一下!

祝我们的论坛越办越好!! [ 本帖最后由 anananjjj 于 2012-4-23 13:16 编辑 ]…

查看全部问答>

关于PID运算,一种10个时钟周期的另一种算法。

首先是@dontium 。共同讨论C2000系列中的CLA的一个计算方法。 图片截取自网络。其中第一项是比例项,第二项是积分项,第三项是微分项。对应的系数是kp,ki,kd。然后根据这个表达式的恒等变换可以得到最后一个表达式。如果计算第一个表达式。每次 ...…

查看全部问答>

AD转换检测的问题

AD转换时怎么检测上升沿下降沿,我是想让电压上升的时候让灯亮着,下降的时候灯灭,电压变化范围在1.2V~2.0V,是把先后采集到的数据进行比较吗,怎么把采集到的电压值储存起来再比较 …

查看全部问答>