您的位置 首页 5G

STM32掉电检测+Flash存取

STM32有PVD的掉电检测功能,flash也可以直接存取;就动了用flash掉电保存参数的念头。1、搞定Flash擦、写函数。voidF_ErasePage(u32Page_Ad…

STM32有PVD的掉电检测功用,flash也能够直接存取;就动了用flash掉电保存参数的想法。
1、搞定Flash擦、写函数。
voidF_ErasePage(u32Page_Address)
{
U32tmp;
while((FLASH->SR&FLASH_FLAG_BSY)==FLASH_FLAG_BSY)
{//PutCnstStr2Usart1(“waiting\n”);}
FLASH->SR|=FLASH_FLAG_PGERR;
FLASH->CR|=CR_PER_Set;
FLASH->AR=Page_Address;
FLASH->CR|=CR_STRT_Set;
while((FLASH->SR&FLASH_FLAG_BSY)==FLASH_FLAG_BSY)
{//PutCnstStr2Usart1(“waiting\n”);}
FLASH->CR&=~CR_PER_Set;//这个不能忘
}
voidFLASH_Program(u32Address,u16Data)
{
U32tmp;
Fstart:
if((FLASH->CR&CR_LOCK_Set)==CR_LOCK_Set)//假如写被锁死
{
FLASH->KEYR=FLASH_KEY1;
FLASH->KEYR=FLASH_KEY2;
//PutCnstStr2Usart1(“Unclock\n”);
}
while((FLASH->SR&FLASH_FLAG_BSY)==FLASH_FLAG_BSY)
{
//PutCnstStr2Usart1(“waiting\n”);
}
FLASH->CR|=CR_PG_Set;
*(vu16*)Address=Data;
FLASH->CR&=~CR_PG_Set;
if((FLASH->SR&FLASH_FLAG_PGERR)==FLASH_FLAG_PGERR)
{
//PutCnstStr2Usart1(“Noearase\n”);
F_ErasePage(Address);
gotoFstart;//居然用了goto,咳咳^_^
}
}
有了这两个函数根本就行了,横竖一非必须擦一个page,全拿过来保存参数就行了,比较牢靠。
U16constflashdata[1024]__at(0x08001000);//因为flash一次能且只能写16bit,别的拜访奇地址会犯错。
还有不要忘了#include,肯定定位全赖它了。
即将保存的参数放到一个结构里边,每次上电复位的时分加载,需求存储时写入flash
2、搞定掉电检测

voidPVD_Init(void)
{
NVIC_InitTypeDefNVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=PVD_IRQChannel;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0x00;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=0x00;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3|
RCC_APB1Periph_TIM4|RCC_APB1Periph_USART2|RCC_APB1Periph_PWR,ENABLE);//_PWR,ENABLE);//这个是必需的
PWR->CR|=1<<4;//使能
PWR->CR|=0xE0;//2.9V检测
NVIC_Init(&NVIC_InitStruct);//借用一下库,答应中止
}
寄存器设置有用,手动置相应中止标志可进入中止
3、联合作业,失利
voidPVD_IRQHandler(void)
{
U16i;
U32tmp;
tmp=0x08001000;

if((PWR->CSR&PWR_FLAG_PVDO)==PWR_FLAG_PVDO)//低于阈值(电压上升也会中止)
{
F_ErasePage(tmp);
for(i=0;i<2000;i++)
{
FLASH_Program(tmp,i);
tmp+=2;
}
}

}
剖析:1、Vdda通过LC滤波或许会比Vdd掉的慢,而听说stm32会因而发生检测问题。2、电源回路电容量小,时刻来不及。
测验:从ATX电源上拆了一个1000uF的电容,接上,无改进。
考虑:把掉电检测跟电源脚做在一同真实含义不大,一般情况下MCU的电源都是通过LDO稳压的,掉电检测运用专门的IO,能够用稳压器前的电压用于检测。
因为现在还不能对电路板进行破坏性改造,手头也没有示波器,可调电源,暂时抛弃对此做进一步的研讨。
套用某大人物的逻辑,这次测验是部分失利

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/268330.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部