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

原子的例程,写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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版