前幾天研究了一下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)
2020-3-4 13:47 上傳
點擊文件名下載附件
|