请选择 进入手机版 | 继续访问电脑版
搜索
查看: 2882|回复: 9

[已解决] 原子的例程,写FLASH时读取SR状态报错,进入HardFault_Handler

[复制链接]

该用户从未签到

3

主题

45

帖子

0

蝴蝶豆

金牌会员

最后登录
2021-2-1
发表于 2018-10-10 18:35:12 | 显示全部楼层 |阅读模式
本帖最后由 游者幻魂 于 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

回复

使用道具 举报

该用户从未签到

3

主题

45

帖子

0

蝴蝶豆

金牌会员

最后登录
2021-2-1
 楼主| 发表于 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)));
复制代码
回复 支持 反对

使用道具 举报

该用户从未签到

24

主题

36

帖子

2

蝴蝶豆

初级会员

最后登录
2020-2-27
发表于 2018-10-11 20:52:58 | 显示全部楼层
你的MCU flash空间是够的吧?
另外,如果有我们开发板的话,直接在我们例程基础上修改看看。

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

45

帖子

0

蝴蝶豆

金牌会员

最后登录
2021-2-1
 楼主| 发表于 2018-10-11 21:19:03 | 显示全部楼层
空间是足够的,STM32F105VCT6B,256KB的ROM空间,设置里面的起始地址是0x0800 0000 ,SIZE是0x4 0000,FLASH开始读取的地址是0x0803 FC00,后面的1K数据就是作为模拟EEPROM使用。
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

45

帖子

0

蝴蝶豆

金牌会员

最后登录
2021-2-1
 楼主| 发表于 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使用。
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

45

帖子

0

蝴蝶豆

金牌会员

最后登录
2021-2-1
 楼主| 发表于 2018-10-11 21:29:23 | 显示全部楼层
正点原子-122954 发表于 2018-10-11 20:52
你的MCU flash空间是够的吧?
另外,如果有我们开发板的话,直接在我们例程基础上修改看看。 ...

在原子的开发板上开发例程里面调试没有发现这个问题,移植到我的工程里面才有这个问题,已经移植了一段时间了,没有用到就没发现,现在用到了才发现这个问题。解决不了就把我的工程文件一个个移出去、屏蔽不需要的变量,只保留读写FALSH的文件,还是一样出错,另外设置保持和你们原子的设置一样的
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

45

帖子

0

蝴蝶豆

金牌会员

最后登录
2021-2-1
 楼主| 发表于 2018-10-11 21:37:00 | 显示全部楼层
本帖最后由 游者幻魂 于 2018-10-12 15:06 编辑

出问题的工程

test.rar

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

更新

回复 支持 反对

使用道具 举报

该用户从未签到

32

主题

449

帖子

34

蝴蝶豆

金牌会员

最后登录
2021-5-6
发表于 2018-10-17 09:03:58 | 显示全部楼层
你说的出错的得放是引用的光放的库,而这个函数只是获取了状态而已,所以出错应当是调用该函数之前,而并不是这个函数,你重新定问一下问题应该不难,而且Flash操作本来也很简单。

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

45

帖子

0

蝴蝶豆

金牌会员

最后登录
2021-2-1
 楼主| 发表于 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地址被串改了!下一次用到时就报错
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

45

帖子

0

蝴蝶豆

金牌会员

最后登录
2021-2-1
 楼主| 发表于 2018-10-19 16:17:08 | 显示全部楼层
xiaoshen-372360 发表于 2018-10-17 09:03
你说的出错的得放是引用的光放的库,而这个函数只是获取了状态而已,所以出错应当是调用该函数之前,而并不 ...

现在移植到标准库了,没有报错!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-3-29 05:21 , Processed in 1.207485 second(s), 46 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表