你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
小肥羊dsf 提问时间:2018-7-6 14:06 /
我打算用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. //开机读数据出来
  54. void CreanZore(void)
  55. {
  56.     ReadAccountFlash();
  57.     if(CreanZoren!=CREANFALG)
  58.     {
  59.         CreanZoren=CREANFALG;
  60.                 GameRunSt.Address=36;
  61.                 WriteAccountFlash();
  62.         }

  63. }
复制代码




收藏 4 评论9 发布时间:2018-7-6 14:06

举报

9个回答
STMCU-管管 回答时间:2018-7-6 14:25:24
技术问题有专门的求助和讨论版块,请下次注意
小肥羊dsf 回答时间:2018-7-6 15:46:38
没有人吗
小肥羊dsf 回答时间:2018-7-6 17:43:52
没有人吗?
小肥羊dsf 回答时间:2018-7-7 10:35:47
huangyanga 回答时间:2018-7-7 15:20:50
JTAG有给电路板供电吗??

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

小肥羊dsf 回答时间:2018-7-9 09:26:27
huangyanga 发表于 2018-7-7 15:20
JTAG有给电路板供电吗??

分情况,如果把先把JTAG拔掉就可以,再断电源就可以一直保存了。
如果先关电源再拔JTAG,那就以后一直都不能保存了
小肥羊dsf 回答时间:2018-7-11 11:32:29
馒头弟 回答时间:2018-7-17 10:38:12
本帖最后由 馒头弟 于 2018-7-17 10:41 编辑
小肥羊dsf 发表于 2018-7-9 09:26
分情况,如果把先把JTAG拔掉就可以,再断电源就可以一直保存了。
如果先关电源再拔JTAG,那就以后一直都 ...

这个问题比较重要。但是,他问你JTAG有对板子供电吗?你还分情况?

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

zhdzhd 回答时间:2018-7-17 11:01:26
建议检查一下JTAG调试的设置参数是不是有问题;还有调试器对板子的供电设置以及电压值跟程序中的设定擦除值是否相同。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版