[应用相关] 有些情况会保存不了数据

[复制链接]
710|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
 楼主| houcs 发表于 2020-3-14 13:34 | 显示全部楼层
保存不了数据,以后都不能保存数据
zwll 发表于 2020-3-14 13:38 | 显示全部楼层

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因
 楼主| 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();
        }

}
 楼主| houcs 发表于 2020-3-14 13:45 | 显示全部楼层
哪位大神知道这是怎么回事
 楼主| houcs 发表于 2020-3-14 13:47 | 显示全部楼层
读写flash是没有问题的
stly 发表于 2020-3-14 13:58 | 显示全部楼层
产生中断时如果正在读写,那肯定会出问题,这其实是不重入的问题
 楼主| houcs 发表于 2020-3-14 14:01 | 显示全部楼层
我就一个地方写入,不存在这个问题
yinxiangh 发表于 2020-3-14 14:03 | 显示全部楼层
建议关中断
 楼主| houcs 发表于 2020-3-14 14:06 | 显示全部楼层
我在中断 加了while(1);还是一样
lium 发表于 2020-3-14 14:09 | 显示全部楼层
while(1)不等于关中断
wangpe 发表于 2020-3-14 14:12 | 显示全部楼层

怎么可以这样玩,这个单片机擦除就需要几十ms,电都没有了,MCU怎么工作
gongche 发表于 2020-3-14 14:19 | 显示全部楼层
而且擦除可能会加大用电,不靠谱的保存方案。
bqyj 发表于 2020-3-14 14:24 | 显示全部楼层
掉电太快了,没有足够的时间保存
zwll 发表于 2020-3-14 14:27 | 显示全部楼层
需要从硬件修改电源电路,增加电容,让掉电减缓。
renyaq 发表于 2020-3-14 14:31 | 显示全部楼层
不太清楚STM32的这个机理。
 楼主| houcs 发表于 2020-3-14 14:33 | 显示全部楼层
好像是硬件问题我用其他板试了没用出现这种问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

743

主题

8382

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部