打印
[STM32F1]

stm32 用PVD实现掉电保存数据遇到奇怪的问题

[复制链接]
4210|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
肥羊|  楼主 | 2018-7-6 13:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 肥羊 于 2018-7-6 14:07 编辑



我打算用PVD实现掉电保存数据,然后就遇到一些奇怪的问题,读写flash是没有问题的。但是就是有些情况会保存不了数据,有些情况保存的了数据。
1.在调试的时候把调试JTAG拔掉,然后就可以保存数据了,然后以后都能保存数据
2.如果先断电在拔掉JTAG就会保存不了数据,以后都不能保存数据
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();
        }

}
沙发
肥羊|  楼主 | 2018-7-6 13:59 | 只看该作者
哪位大神知道这是怎么回事

使用特权

评论回复
板凳
肥羊|  楼主 | 2018-7-6 14:00 | 只看该作者
读写flash是没有问题的

使用特权

评论回复
地板
ayb_ice| | 2018-7-6 14:32 | 只看该作者
产生中断时如果正在读写,那肯定会出问题,这其实是不重入的问题

使用特权

评论回复
5
肥羊|  楼主 | 2018-7-6 15:47 | 只看该作者
ayb_ice 发表于 2018-7-6 14:32
产生中断时如果正在读写,那肯定会出问题,这其实是不重入的问题

我就一个地方写入,不存在这个问题

使用特权

评论回复
6
ayb_ice| | 2018-7-6 16:00 | 只看该作者
肥羊 发表于 2018-7-6 15:47
我就一个地方写入,不存在这个问题

建议关中断

使用特权

评论回复
7
肥羊|  楼主 | 2018-7-6 17:08 | 只看该作者

我在中断 加了while(1);还是一样

使用特权

评论回复
8
ayb_ice| | 2018-7-6 17:17 | 只看该作者
肥羊 发表于 2018-7-6 17:08
我在中断 加了while(1);还是一样

while(1)不等于关中断

使用特权

评论回复
9
肥羊|  楼主 | 2018-7-7 10:34 | 只看该作者
有没有大神啊解答啊

使用特权

评论回复
10
肥羊|  楼主 | 2018-7-9 09:16 | 只看该作者
自己帮自己顶一下

使用特权

评论回复
11
菜鸟同学| | 2018-7-9 10:22 | 只看该作者
怎么可以这样玩,这个单片机擦除就需要几十ms,电都没有了,MCU怎么工作,而且擦除可能会加大用电,不靠谱的保存方案。

使用特权

评论回复
评论
肥羊 2018-7-11 11:34 回复TA
加了电容可以吧 
12
huangcunxiake| | 2018-7-9 15:45 | 只看该作者
掉电太快了,没有足够的时间保存,需要从硬件修改电源电路,增加电容,让掉电减缓。

使用特权

评论回复
评论
肥羊 2018-7-11 11:35 回复TA
1.在调试的时候把调试JTAG拔掉,然后就可以保存数据了,然后以后都能保存数据 这样操作的时候可以保存啊 
13
huangcunxiake| | 2018-7-11 16:44 | 只看该作者
不太清楚STM32的这个机理。我在新唐的版块看到有人发帖,是新唐官方的资料,介绍这个保存500个字节的供电电路电容选择计算方法。以及推荐的电容,说的就是这个掉电保存。

使用特权

评论回复
14
肥羊|  楼主 | 2018-7-21 16:36 | 只看该作者
好像是硬件问题我用其他板试了没用出现这种问题

使用特权

评论回复
15
八层楼| | 2018-7-23 08:56 | 只看该作者
延时一段时间再掉电

使用特权

评论回复
16
肥羊|  楼主 | 2018-7-25 15:36 | 只看该作者
八层楼 发表于 2018-7-23 08:56
延时一段时间再掉电

程序没有问题应该是硬件的问题

使用特权

评论回复
17
dongnanxibei| | 2018-7-25 16:32 | 只看该作者
你正常运行的时候保存就行啊,

使用特权

评论回复
18
八层楼| | 2018-7-26 08:14 | 只看该作者
肥羊 发表于 2018-7-25 15:36
程序没有问题应该是硬件的问题

哦哦哦 那查到是什么问题 吗

使用特权

评论回复
评论
肥羊 2018-7-31 17:20 回复TA
硬件方案有问题 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

271

帖子

1

粉丝