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

原子的例程,写FLASH时读取SR状态报错,进入HardFault_Handler

[复制链接]
weidni2009 提问时间:2018-10-10 18:35 /
本帖最后由 游者幻魂 于 2019-2-26 17:48 编辑

使用正点原子的例程写代码,发现有如下的问题:
1、读取 Flash的内容时,读到最后0x0803 FFFE的值为0xFFFF AAAA ,结果报错进入HardFault_Handler死循环;#define FLASH_USER_EEROM        0x0803fc00
  1. STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);
复制代码
后来把 FLASH_USER_EEROM0x0803fc00改为0x0803f400,结果才不会报错。
2、改完后继续运行又有报错,单步调试发现是如下红色的代码时出错,一时找不到出问题的地方。
  1. FLASHSRSTATUS STMFLASH_GetStatus(void)
  2. {        
  3. u32 Flash_SR_Temp;        
  4. <font color="#ff0000">Flash_SR_Temp=FLASH->SR;   //出错的地方</font>

  5. if(Flash_SR_Temp&FLASH_SR_BSY_Msk)
  6. return Flash_SR_Busy;
  7. else if(Flash_SR_Temp&FLASH_SR_PGERR_Msk)
  8. return Flash_SR_PgErr;
  9. else if(Flash_SR_Temp&FLASH_SR_WRPRTERR_Msk)
  10. return Flash_SR_WrPrtErr;
  11. else
  12. return Flash_SR_EOP;
  13. }
复制代码
寄存器状态如下:

QQ图片20181010183014.png


查了一天时间,知道是读取flash地址0X0803FFFE出错,但是不知道怎么解决!
error.png
查表是“精确的数据访问违例”
BFSR.png

收藏 1 评论9 发布时间:2018-10-10 18:35

举报

9个回答
weidni2009 回答时间:2018-10-11 20:32:45
  1.         static unsigned int stacked_r0;
  2.         static unsigned int stacked_r1;
  3.         static unsigned int stacked_r2;
  4.         static unsigned int stacked_r3;
  5.         static unsigned int stacked_r12;
  6.         static unsigned int stacked_lr;
  7.         static unsigned int stacked_pc;
  8.         static unsigned int stacked_psr;
  9.         static unsigned int SHCSR;
  10.         static unsigned char MFSR;
  11.         static unsigned char BFSR;
  12.         static unsigned short int UFSR;
  13.         static unsigned int HFSR;
  14.         static unsigned int DFSR;
  15.         static unsigned int MMAR;
  16.         static unsigned int BFAR;

  17.         stacked_r0 = ((unsigned long) hardfault_args[0]);
  18.         stacked_r1 = ((unsigned long) hardfault_args[1]);
  19.         stacked_r2 = ((unsigned long) hardfault_args[2]);
  20.         stacked_r3 = ((unsigned long) hardfault_args[3]);
  21.         stacked_r12 = ((unsigned long) hardfault_args[4]);
  22.         stacked_lr = ((unsigned long) hardfault_args[5]);
  23.         stacked_pc = ((unsigned long) hardfault_args[6]);
  24.         stacked_psr = ((unsigned long) hardfault_args[7]);
  25.         SHCSR = (*((volatile unsigned long *)(0xE000ED24)));
  26.         MFSR = (*((volatile unsigned char *)(0xE000ED28)));       
  27.         BFSR = (*((volatile unsigned char *)(0xE000ED29)));
  28.         UFSR = (*((volatile unsigned short int *)(0xE000ED2A)));
  29.         HFSR = (*((volatile unsigned long *)(0xE000ED2C)));  
  30.         DFSR = (*((volatile unsigned long *)(0xE000ED30)));
  31.         MMAR = (*((volatile unsigned long *)(0xE000ED34)));
  32.         BFAR = (*((volatile unsigned long *)(0xE000ED38)));
复制代码
正点原子-122954 回答时间:2018-10-11 20:52:58
你的MCU flash空间是够的吧?
另外,如果有我们开发板的话,直接在我们例程基础上修改看看。

评分

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

查看全部评分

weidni2009 回答时间:2018-10-11 21:19:03
空间是足够的,STM32F105VCT6B,256KB的ROM空间,设置里面的起始地址是0x0800 0000 ,SIZE是0x4 0000,FLASH开始读取的地址是0x0803 FC00,后面的1K数据就是作为模拟EEPROM使用。
weidni2009 回答时间:2018-10-11 21:20:24
正点原子-122954 发表于 2018-10-11 20:52
你的MCU flash空间是够的吧?
另外,如果有我们开发板的话,直接在我们例程基础上修改看看。 ...


空间是足够的,STM32F105VCT6B,256KB的ROM空间,设置里面的起始地址是0x0800 0000 ,SIZE是0x4 0000,FLASH开始读取的地址是0x0803 FC00,后面的1K数据就是作为模拟EEPROM使用。
weidni2009 回答时间:2018-10-11 21:29:23
正点原子-122954 发表于 2018-10-11 20:52
你的MCU flash空间是够的吧?
另外,如果有我们开发板的话,直接在我们例程基础上修改看看。 ...

在原子的开发板上开发例程里面调试没有发现这个问题,移植到我的工程里面才有这个问题,已经移植了一段时间了,没有用到就没发现,现在用到了才发现这个问题。解决不了就把我的工程文件一个个移出去、屏蔽不需要的变量,只保留读写FALSH的文件,还是一样出错,另外设置保持和你们原子的设置一样的
weidni2009 回答时间:2018-10-11 21:37:00
本帖最后由 游者幻魂 于 2018-10-12 15:06 编辑

出问题的工程

test.rar

下载

6.94 MB, 下载次数: 123, 下载积分: ST金币 -1

更新

shenxiaolin_mai 回答时间:2018-10-17 09:03:58
你说的出错的得放是引用的光放的库,而这个函数只是获取了状态而已,所以出错应当是调用该函数之前,而并不是这个函数,你重新定问一下问题应该不难,而且Flash操作本来也很简单。

评分

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

查看全部评分

weidni2009 回答时间:2018-10-19 16:15:58
xiaoshen-372360 发表于 2018-10-17 09:03
你说的出错的得放是引用的光放的库,而这个函数只是获取了状态而已,所以出错应当是调用该函数之前,而并不 ...

我使用的是HAL库,不是标准库,然后出错的函数是正点原子编写读取FALSH状态的函数,在写FALSH前第一次读取CR是OK,写完FLASH第二次读取CR状态就报错!困扰我的问题是找不到第二次读取CR的值时出错的原因,使用HaedFault_handler中断函数调试出来的寄存器原因是“精准的数据访问违例”,如果是HAL库出问题应该是直接进报错中断函数了!或者是库函数出来的时候FALSH的访问地址就出错了,导致下一次的FALSH读取时出错!我想这个问题不能定性为越界或者内存出错的问题,应该是指针出错,而且是在库函数出来的那一刻FLASH地址被串改了!下一次用到时就报错
weidni2009 回答时间:2018-10-19 16:17:08
xiaoshen-372360 发表于 2018-10-17 09:03
你说的出错的得放是引用的光放的库,而这个函数只是获取了状态而已,所以出错应当是调用该函数之前,而并不 ...

现在移植到标准库了,没有报错!

所属标签

相似问题

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