打印
[应用相关]

有些情况会保存不了数据

[复制链接]
439|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
houcs|  楼主 | 2020-3-14 13:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
打算用PVD实现掉电保存数据,然后就遇到一些奇怪的问题,读写flash是没有问题的。但是就是有些情况会保存不了数据,有些情况保存的了数据。

使用特权

评论回复
沙发
guoyt| | 2020-3-14 13:24 | 只看该作者

还有什么现象?能再详细描述下吗?

使用特权

评论回复
板凳
houcs|  楼主 | 2020-3-14 13:27 | 只看该作者
在调试的时候把调试JTAG拔掉,然后就可以保存数据了,然后以后都能保存数据

使用特权

评论回复
地板
huwr| | 2020-3-14 13:30 | 只看该作者
如果先断电在拔掉JTAG

使用特权

评论回复
5
houcs|  楼主 | 2020-3-14 13:34 | 只看该作者
保存不了数据,以后都不能保存数据

使用特权

评论回复
6
zwll| | 2020-3-14 13:38 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
7
houcs|  楼主 | 2020-3-14 13:42 | 只看该作者
void PWR_PVD_Init(void)
{   
    NVIC_InitTypeDef NVIC_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
     
    //RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);//使能PWR和BKP外设时钟

    NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;           //使能PVD所在的外部中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       //子优先级0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;          //使能外部中断通道
    NVIC_Init(&NVIC_InitStructure);
     
    EXTI_StructInit(&EXTI_InitStructure);
    EXTI_InitStructure.EXTI_Line = EXTI_Line16;             //PVD连接到中断线16上
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;     //使用中断模式
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  //电压低于阀值时产生中断
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;               //使能中断线
    EXTI_Init(&EXTI_InitStructure);                         //初始

        EXTI_ClearITPendingBit(EXTI_Line16);//清中断
    PWR_PVDLevelConfig(PWR_PVDLevel_2V9);//设定监控阀值
    PWR_PVDCmd(ENABLE);//使能PVD     
}


void PVD_IRQHandler(void)
{
    EXTI_ClearITPendingBit(EXTI_Line16);//清中断
    WriteAccountFlash();
        
}
  
//线擦除
void Init_FlashP(u32 address)
{
  Erase_Flash(address);
}



//保存账目
void WriteAccountFlash(void)
{
    u16 buf[50];
        memcpy(&buf[0],&CreanZoren,4);
        memcpy(&buf[2],&GameRunSt.Address,4);
        STMFLASH_Write(ACCTION_ADDR,buf,50);

}

//读账目
void ReadAccountFlash(void)
{
    u16 buf[50];
        STMFLASH_Read(ACCTION_ADDR,buf,50);
        memcpy(&CreanZoren,                  &buf[0],4);
        memcpy(&GameRunSt.Address,            &buf[2],4);        
        Init_FlashP(ACCTION_ADDR);

}


void CreanZore(void)
{
    ReadAccountFlash();
    if(CreanZoren!=CREANFALG)
    {
        CreanZoren=CREANFALG;
                GameRunSt.Address=36;
                WriteAccountFlash();
        }

}

使用特权

评论回复
8
houcs|  楼主 | 2020-3-14 13:45 | 只看该作者
哪位大神知道这是怎么回事

使用特权

评论回复
9
houcs|  楼主 | 2020-3-14 13:47 | 只看该作者
读写flash是没有问题的

使用特权

评论回复
10
stly| | 2020-3-14 13:58 | 只看该作者
产生中断时如果正在读写,那肯定会出问题,这其实是不重入的问题

使用特权

评论回复
11
houcs|  楼主 | 2020-3-14 14:01 | 只看该作者
我就一个地方写入,不存在这个问题

使用特权

评论回复
12
yinxiangh| | 2020-3-14 14:03 | 只看该作者
建议关中断

使用特权

评论回复
13
houcs|  楼主 | 2020-3-14 14:06 | 只看该作者
我在中断 加了while(1);还是一样

使用特权

评论回复
14
lium| | 2020-3-14 14:09 | 只看该作者
while(1)不等于关中断

使用特权

评论回复
15
wangpe| | 2020-3-14 14:12 | 只看该作者

怎么可以这样玩,这个单片机擦除就需要几十ms,电都没有了,MCU怎么工作

使用特权

评论回复
16
gongche| | 2020-3-14 14:19 | 只看该作者
而且擦除可能会加大用电,不靠谱的保存方案。

使用特权

评论回复
17
bqyj| | 2020-3-14 14:24 | 只看该作者
掉电太快了,没有足够的时间保存

使用特权

评论回复
18
zwll| | 2020-3-14 14:27 | 只看该作者
需要从硬件修改电源电路,增加电容,让掉电减缓。

使用特权

评论回复
19
renyaq| | 2020-3-14 14:31 | 只看该作者
不太清楚STM32的这个机理。

使用特权

评论回复
20
houcs|  楼主 | 2020-3-14 14:33 | 只看该作者
好像是硬件问题我用其他板试了没用出现这种问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

743

主题

8382

帖子

5

粉丝