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

[复制链接]
4646|20
 楼主| 肥羊 发表于 2018-7-6 13:58 | 显示全部楼层 |阅读模式
本帖最后由 肥羊 于 2018-7-6 14:07 编辑



我打算用PVD实现掉电保存数据,然后就遇到一些奇怪的问题,读写flash是没有问题的。但是就是有些情况会保存不了数据,有些情况保存的了数据。
1.在调试的时候把调试JTAG拔掉,然后就可以保存数据了,然后以后都能保存数据
2.如果先断电在拔掉JTAG就会保存不了数据,以后都不能保存数据
  1. void PWR_PVD_Init(void)
  2. {   
  3.     NVIC_InitTypeDef NVIC_InitStructure;
  4.     EXTI_InitTypeDef EXTI_InitStructure;
  5.      
  6.     //RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟
  7.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);//使能PWR和BKP外设时钟

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

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


  24. void PVD_IRQHandler(void)
  25. {
  26.     EXTI_ClearITPendingBit(EXTI_Line16);//清中断
  27.     WriteAccountFlash();
  28.         
  29. }
  30.   
  31. //线擦除
  32. void Init_FlashP(u32 address)
  33. {
  34.   Erase_Flash(address);
  35. }



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

  43. }

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

  52. }


  53. void CreanZore(void)
  54. {
  55.     ReadAccountFlash();
  56.     if(CreanZoren!=CREANFALG)
  57.     {
  58.         CreanZoren=CREANFALG;
  59.                 GameRunSt.Address=36;
  60.                 WriteAccountFlash();
  61.         }

  62. }
 楼主| 肥羊 发表于 2018-7-6 13:59 | 显示全部楼层
哪位大神知道这是怎么回事
 楼主| 肥羊 发表于 2018-7-6 14:00 | 显示全部楼层
读写flash是没有问题的
ayb_ice 发表于 2018-7-6 14:32 | 显示全部楼层
产生中断时如果正在读写,那肯定会出问题,这其实是不重入的问题
 楼主| 肥羊 发表于 2018-7-6 15:47 | 显示全部楼层
ayb_ice 发表于 2018-7-6 14:32
产生中断时如果正在读写,那肯定会出问题,这其实是不重入的问题

我就一个地方写入,不存在这个问题
ayb_ice 发表于 2018-7-6 16:00 | 显示全部楼层
肥羊 发表于 2018-7-6 15:47
我就一个地方写入,不存在这个问题

建议关中断
 楼主| 肥羊 发表于 2018-7-6 17:08 | 显示全部楼层

我在中断 加了while(1);还是一样
ayb_ice 发表于 2018-7-6 17:17 | 显示全部楼层
肥羊 发表于 2018-7-6 17:08
我在中断 加了while(1);还是一样

while(1)不等于关中断
 楼主| 肥羊 发表于 2018-7-7 10:34 | 显示全部楼层
有没有大神啊解答啊
 楼主| 肥羊 发表于 2018-7-9 09:16 | 显示全部楼层
自己帮自己顶一下
菜鸟同学 发表于 2018-7-9 10:22 | 显示全部楼层
怎么可以这样玩,这个单片机擦除就需要几十ms,电都没有了,MCU怎么工作,而且擦除可能会加大用电,不靠谱的保存方案。

评论

加了电容可以吧  发表于 2018-7-11 11:34
huangcunxiake 发表于 2018-7-9 15:45 | 显示全部楼层
掉电太快了,没有足够的时间保存,需要从硬件修改电源电路,增加电容,让掉电减缓。

评论

1.在调试的时候把调试JTAG拔掉,然后就可以保存数据了,然后以后都能保存数据 这样操作的时候可以保存啊  发表于 2018-7-11 11:35
huangcunxiake 发表于 2018-7-11 16:44 | 显示全部楼层
不太清楚STM32的这个机理。我在新唐的版块看到有人发帖,是新唐官方的资料,介绍这个保存500个字节的供电电路电容选择计算方法。以及推荐的电容,说的就是这个掉电保存。
 楼主| 肥羊 发表于 2018-7-21 16:36 | 显示全部楼层
好像是硬件问题我用其他板试了没用出现这种问题
八层楼 发表于 2018-7-23 08:56 | 显示全部楼层
延时一段时间再掉电
 楼主| 肥羊 发表于 2018-7-25 15:36 | 显示全部楼层
八层楼 发表于 2018-7-23 08:56
延时一段时间再掉电

程序没有问题应该是硬件的问题
dongnanxibei 发表于 2018-7-25 16:32 | 显示全部楼层
你正常运行的时候保存就行啊,
八层楼 发表于 2018-7-26 08:14 | 显示全部楼层
肥羊 发表于 2018-7-25 15:36
程序没有问题应该是硬件的问题

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

评论

硬件方案有问题  发表于 2018-7-31 17:20
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

287

帖子

1

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