OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6475|回复: 5

掉电存储前寄存器复位,急!!

[复制链接]

1

主题

2

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-3-1
在线时间
17 小时
发表于 2022-12-17 19:08:22 | 显示全部楼层 |阅读模式
20金钱
各位大佬,我是实在没办法了,调了很久。是这样的,我用的单片机芯片是STM32F103C8T6芯片,最近想做一个掉电瞬间,通过PVD中断检测到低于掉电阈值,然后存储数据到flash里面,这样掉电以后就能够保存数据,下一次上电的时候读取flash就可以。但是经过我反复测试,当我进入PVD中断再执行flash存储的时候,我之前在main.c定义的几个数组,实时变化的数组里面的数据都复位了,站在我的角度来看就是,当我已经检测到掉电阈值附近的时候,flash要保存的数据已经被复位了,我保存的数组全部都是0了,就根本没有起到原本的作用。但这个时候我要是再对保存的数组赋值是可以存储完所有数据并再下一次上电的时候读取到的,证明我这段时间存储数据完全没有问题,但是检测到掉电的时候我所有的变量都已经复位了,有人遇到过这个么,实在是没办法了代码如下,A_Parameter是我用来掉电瞬间存入的数组,B_Parameter是上电读取的,IN_Parameter是我跑程序的时候要存储保存的数据数组,但问题就是这个IN_Parameter在掉电前是存有数据的,掉电检测了以后就直接复位了,所以再存的话我的数据也只能是0,起不到掉电保存的作用

#include "memory.h"
#include "stmflash.h"
#include "stm32f10x_pwr.h"
#include "delay.h"
#include "main.h"
u16 A_Parameter[36],B_Parameter[36];  //存储数据数组
/**************************************************************************
函数功能:从Flash读取指定数据
入口参数:无
返回  值:无
**************************************************************************/
void Flash_Read(void)
{
        STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)B_Parameter,36);
}       

/**************************************************************************
函数功能:向Flash写入数据
入口参数:无
返回  值:无
**************************************************************************/
void Flash_Write(void)
{       
  A_Parameter[0]=IN_Parameter[0];
        STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)A_Parameter,36);       
}


void PVD_Init(void)
{  
                NVIC_InitTypeDef NVIC_InitStruct;
                EXTI_InitTypeDef EXTI_InitStructure;

                NVIC_InitStruct.NVIC_IRQChannel = PVD_IRQn;
                NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
                NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
                NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStruct);//允许中断

                EXTI_ClearITPendingBit(EXTI_Line16);
                EXTI_InitStructure.EXTI_Line                 = EXTI_Line16;
                EXTI_InitStructure.EXTI_Mode                 = EXTI_Mode_Interrupt;
                EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//EXTI_Trigger_Falling   ;//EXTI_Trigger_Rising;
                EXTI_InitStructure.EXTI_LineCmd = ENABLE;
                EXTI_Init(&EXTI_InitStructure);


}
void PVD_Init_0(void)
{
          RCC_APB1PeriphClockCmd( RCC_APB1Periph_PWR, ENABLE); //_PWR, ENABLE); // 这个是必需的       
                PWR_PVDLevelConfig(PWR_PVDLevel_2V9);
                PWR_PVDCmd(ENABLE);
}
               



void PVD_IRQHandler(void)
{
        EXTI_ClearITPendingBit(EXTI_Line16); //必须在if外面。
        if(PWR_GetFlagStatus(PWR_FLAG_PVDO)) //
        {
                Flash_Write();       
                PWR_ClearFlag(PWR_FLAG_PVDO);
                //__set_PRIMASK(1);        //关闭总中断

                //STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,11);本想在这里进行存储操作
        }       
}



最佳答案

查看完整内容[请看2#楼]

这么做失败率太高了,先不说触发PVD中断的时候RAM会不会复位,就算不复位怎么保证在你写入Flash的这几十ms内供电可以保证MCU的工作,保证flash的供电呢?极端一点的情况就是刚触发PVD中断MCU就断电了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4588
金钱
4588
注册时间
2015-1-10
在线时间
574 小时
发表于 2022-12-17 19:08:23 | 显示全部楼层
这么做失败率太高了,先不说触发PVD中断的时候RAM会不会复位,就算不复位怎么保证在你写入Flash的这几十ms内供电可以保证MCU的工作,保证flash的供电呢?极端一点的情况就是刚触发PVD中断MCU就断电了
回复

使用道具 举报

2

主题

582

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2690
金钱
2690
注册时间
2014-5-23
在线时间
188 小时
发表于 2022-12-19 10:44:48 | 显示全部楼层
要有相关电路设计来保证写入
回复

使用道具 举报

54

主题

347

帖子

0

精华

高级会员

Rank: 4

积分
948
金钱
948
注册时间
2022-4-20
在线时间
356 小时
发表于 2022-12-20 10:01:27 | 显示全部楼层
没记错的话STMFLASH_Write里面是会有擦除动作的,挺耗电,你试试先擦了,再看看在PVD里能写出正常数据不
又菜又爱指点
回复

使用道具 举报

5

主题

134

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1387
金钱
1387
注册时间
2019-5-29
在线时间
163 小时
发表于 2022-12-20 14:33:35 | 显示全部楼层
或者你可以改变一下设计思路,在参数改变的时候直接保存参数,没必要非要等到断电的时候再保存参数,同时保存参数的过程当中,关闭所有中断,保存完毕打开中断,保证不会被干扰
偷偷摸鱼
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2022-12-21 22:21:33 | 显示全部楼层
你得在电路设计上做保障!!不能光靠默认那点滤波电容来提供掉电供电, 超级电容可以看看.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 19:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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