找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1507|回复: 1
收起左侧

STM32 PVD寄存器版本源程序

[复制链接]
ID:161657 发表于 2020-3-4 13:46 | 显示全部楼层 |阅读模式
前几天研究了一下STM32的电源控制部分的功能,刚好需要一个 掉电瞬间保存数据到SMT32内部的功能,其实这个功能也是很简单的,简单的配置一下几个寄存器的配置,然后打开中断就可以了。这个。c文件经过我测试过的,470uf的电容LED会闪烁一下,但是无法保存数据,换了一个1000uf的电容可以保存11个2字节的数据到STM32(只测试这么多了,我实际上只需要2个字节就够用了,掉电瞬间只是保存关键数据)C文件如下:
#include "pvd.h"
#include "sys.h"
#include "led.h"
#include "usart.h"
#include "stmflash.h"
#include "BMJ_data_ding_yi.h"//包埋机数据定义头文件下
//掉电写入数据测试成功  1000uf的电容可以测试写入了12个字节的 数据 是没有什么问题的
void PWR_PVD_Init(void)
{      
    RCC->APB1ENR|=1<<28;    //使能PORTB时钟
    PWR->CR |= 7<<5; //2.9V 电压阀值
    PWR->CR |= 1<<4; //PVD使能   
    EXTI->IMR|=1<<16;
    //EXTI->FTSR|=1<<16;//这里写错了 这样写进入不了中断,注意上升沿和下降沿产生的中断刚好是翻过来的,这里感觉是资料翻译错误的原因造成的
   //改为下面这样就正常了
   EXTI->RTSR|=1<<16;//配置这个寄存器才是断电瞬间保存数据
    EXTI->EMR |=1<<16;
    EXTI->SWIER |= 1<<16;
    MY_NVIC_Init(1,0,PVD_IRQn,2);//组2,最低优先级
}
void PVD_IRQHandler(void)
{
   EXTI->PR |=1<<16;//清中断   
   if (((PWR->CSR)&(1<<2))!=0)
         {
                                                        ZLG_LED=0;
                                                        LLZ_LED=0;
                                                        ZLH_LED=0;
                                                        YLH_LED1=0;
                                                        CZT_LED=0;
                                         
                                                                         TSJ_can_shu_she_zhi[0]=1;
                                                                         TSJ_can_shu_she_zhi[1]=2;
                                                                         TSJ_can_shu_she_zhi[2]=3;
                                                                         TSJ_can_shu_she_zhi[3]=4;
                                                                         TSJ_can_shu_she_zhi[4]=5;
                                                                         TSJ_can_shu_she_zhi[5]=6;
                                                                         TSJ_can_shu_she_zhi[6]=7;
                                                                         TSJ_can_shu_she_zhi[7]=8;
                                                                         TSJ_can_shu_she_zhi[8]=9;
                                                                         TSJ_can_shu_she_zhi[9]=10;
                                                                         TSJ_can_shu_she_zhi[10]=11;
                                                                        STMFLASH_Unlock();//解锁
                                                                        STMFLASH_ErasePage(dou_dong_ci_shu_FLASH_BASE);//擦除地址 0X08070000  此函数内部有等待擦出完成
                                                                        STMFLASH_WriteHalfWord(dou_dong_ci_shu_FLASH_BASE,TSJ_can_shu_she_zhi[0]);//0X08070000地址写入数组的第一个元素BMJ_wen_du_she_zhi[0]
                                                                        STMFLASH_WriteHalfWord(zhi_liu_shi_jian_FLASH_BASE,TSJ_can_shu_she_zhi[1]);//0X08070000地址写入数组的第一个元素BMJ_wen_du_she_zhi[0]
                                                                        STMFLASH_WriteHalfWord(bao_hu_gang_hao_FLASH_BASE,TSJ_can_shu_she_zhi[2]);//0X08070000地址写入数组的第一个元素BMJ_wen_du_she_zhi[0]
                                                                        STMFLASH_WriteHalfWord(ti_qian_jia_wen_FLASH_BASE,TSJ_can_shu_she_zhi[3]);//0X08070000地址写入数组的第一个元素BMJ_wen_du_she_zhi[0]
                                                                        STMFLASH_WriteHalfWord(kuai_su_Time_FLASH_BASE,TSJ_can_shu_she_zhi[4]);//0X08070000地址写入数组的第一个元素BMJ_wen_du_she_zhi[0]               
                                                                        STMFLASH_WriteHalfWord(shi_gang_la_wen_FLASH_BASE,TSJ_can_shu_she_zhi[5]);//0X08070000地址写入数组的第一个元素BMJ_wen_du_she_zhi[0]
                                                                        STMFLASH_WriteHalfWord(shi_yi_gang_la_wen_FLASH_BASE,TSJ_can_shu_she_zhi[6]);//0X08070000地址写入数组的第一个元素BMJ_wen_du_she_zhi[0]
                                                                        STMFLASH_WriteHalfWord(shi_er_gang_la_wen_FLASH_BASE,TSJ_can_shu_she_zhi[7]);//0X08070000地址写入数组的第一个元素BMJ_wen_du_she_zhi[0]
                                                                        STMFLASH_WriteHalfWord(shi_gang_kuai_su_la_wen_FLASH_BASE,TSJ_can_shu_she_zhi[8]);//0X08070000地址写入数组的第一个元素BMJ_wen_du_she_zhi[0]
                                                                        STMFLASH_WriteHalfWord(shi_yi_gang_kuai_sula_wen_FLASH_BASE,TSJ_can_shu_she_zhi[9]);//0X08070000地址写入数组的第一个元素BMJ_wen_du_she_zhi[0]
                                                                        STMFLASH_WriteHalfWord(shi_er_gang_kuai_sula_wen_FLASH_BASE,TSJ_can_shu_she_zhi[10]);//0X08070000地址写入数组的第一个元素BMJ_wen_du_she_zhi[0]
                                                                        STMFLASH_Lock();//上锁
//                     
//                STMFLASH_Unlock();                                            
//                FLASH->SR|=1<<2; //清除PGERR位.
//                FLASH->SR|=1<<4; //清除WRPRT位.   
//                FLASH->SR|=1<<5; //清除WRPRT位.   
//                STMFLASH_Write_NoCheck(FLASH_ENSAVE_ADDR,(u16*)&TEXT_Buffer,sizeof(TEXT_Buffer));
//                  STMFLASH_Lock();                                                  
         }        
}


以上代码资料51hei下载地址:
PVD.rar (1.33 KB, 下载次数: 8)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:161657 发表于 2020-3-4 13:49 | 显示全部楼层
声明一下,附件里面只有一个.c和.h文件,大家可以不需要下载附件,只看文中的代码就行了,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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