|
前幾天研究了一下STM32的電源控制部分的功能,剛好需要一個(gè) 掉電瞬間保存數(shù)據(jù)到SMT32內(nèi)部的功能,其實(shí)這個(gè)功能也是很簡單的,簡單的配置一下幾個(gè)寄存器的配置,然后打開中斷就可以了。這個(gè)。c文件經(jīng)過我測試過的,470uf的電容LED會(huì)閃爍一下,但是無法保存數(shù)據(jù),換了一個(gè)1000uf的電容可以保存11個(gè)2字節(jié)的數(shù)據(jù)到STM32(只測試這么多了,我實(shí)際上只需要2個(gè)字節(jié)就夠用了,掉電瞬間只是保存關(guān)鍵數(shù)據(jù))C文件如下:
#include "pvd.h"
#include "sys.h"
#include "led.h"
#include "usart.h"
#include "stmflash.h"
#include "BMJ_data_ding_yi.h"//包埋機(jī)數(shù)據(jù)定義頭文件下
//掉電寫入數(shù)據(jù)測試成功 1000uf的電容可以測試寫入了12個(gè)字節(jié)的 數(shù)據(jù) 是沒有什么問題的
void PWR_PVD_Init(void)
{
RCC->APB1ENR|=1<<28; //使能PORTB時(shí)鐘
PWR->CR |= 7<<5; //2.9V 電壓閥值
PWR->CR |= 1<<4; //PVD使能
EXTI->IMR|=1<<16;
//EXTI->FTSR|=1<<16;//這里寫錯(cuò)了 這樣寫進(jìn)入不了中斷,注意上升沿和下降沿產(chǎn)生的中斷剛好是翻過來的,這里感覺是資料翻譯錯(cuò)誤的原因造成的
//改為下面這樣就正常了
EXTI->RTSR|=1<<16;//配置這個(gè)寄存器才是斷電瞬間保存數(shù)據(jù)
EXTI->EMR |=1<<16;
EXTI->SWIER |= 1<<16;
MY_NVIC_Init(1,0,PVD_IRQn,2);//組2,最低優(yōu)先級(jí)
}
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 此函數(shù)內(nèi)部有等待擦出完成
STMFLASH_WriteHalfWord(dou_dong_ci_shu_FLASH_BASE,TSJ_can_shu_she_zhi[0]);//0X08070000地址寫入數(shù)組的第一個(gè)元素BMJ_wen_du_she_zhi[0]
STMFLASH_WriteHalfWord(zhi_liu_shi_jian_FLASH_BASE,TSJ_can_shu_she_zhi[1]);//0X08070000地址寫入數(shù)組的第一個(gè)元素BMJ_wen_du_she_zhi[0]
STMFLASH_WriteHalfWord(bao_hu_gang_hao_FLASH_BASE,TSJ_can_shu_she_zhi[2]);//0X08070000地址寫入數(shù)組的第一個(gè)元素BMJ_wen_du_she_zhi[0]
STMFLASH_WriteHalfWord(ti_qian_jia_wen_FLASH_BASE,TSJ_can_shu_she_zhi[3]);//0X08070000地址寫入數(shù)組的第一個(gè)元素BMJ_wen_du_she_zhi[0]
STMFLASH_WriteHalfWord(kuai_su_Time_FLASH_BASE,TSJ_can_shu_she_zhi[4]);//0X08070000地址寫入數(shù)組的第一個(gè)元素BMJ_wen_du_she_zhi[0]
STMFLASH_WriteHalfWord(shi_gang_la_wen_FLASH_BASE,TSJ_can_shu_she_zhi[5]);//0X08070000地址寫入數(shù)組的第一個(gè)元素BMJ_wen_du_she_zhi[0]
STMFLASH_WriteHalfWord(shi_yi_gang_la_wen_FLASH_BASE,TSJ_can_shu_she_zhi[6]);//0X08070000地址寫入數(shù)組的第一個(gè)元素BMJ_wen_du_she_zhi[0]
STMFLASH_WriteHalfWord(shi_er_gang_la_wen_FLASH_BASE,TSJ_can_shu_she_zhi[7]);//0X08070000地址寫入數(shù)組的第一個(gè)元素BMJ_wen_du_she_zhi[0]
STMFLASH_WriteHalfWord(shi_gang_kuai_su_la_wen_FLASH_BASE,TSJ_can_shu_she_zhi[8]);//0X08070000地址寫入數(shù)組的第一個(gè)元素BMJ_wen_du_she_zhi[0]
STMFLASH_WriteHalfWord(shi_yi_gang_kuai_sula_wen_FLASH_BASE,TSJ_can_shu_she_zhi[9]);//0X08070000地址寫入數(shù)組的第一個(gè)元素BMJ_wen_du_she_zhi[0]
STMFLASH_WriteHalfWord(shi_er_gang_kuai_sula_wen_FLASH_BASE,TSJ_can_shu_she_zhi[10]);//0X08070000地址寫入數(shù)組的第一個(gè)元素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, 下載次數(shù): 8)
2020-3-4 13:47 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|