前几天研究了一下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)
|