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

操作内部FLASH导致进入HardFault

[复制链接]
海迹天涯 提问时间:2017-1-18 11:58 /
在做IAP升级程序的时候有段程序一执行就会跳入到HardFault_Handler中,求各位大神支个招,产生错误的代码如下:
PXDV9A@[5TZ`SMZKD3D[I{S.png
收藏 1 评论17 发布时间:2017-1-18 11:58

举报

17个回答
迷雾向前 回答时间:2017-1-20 11:29:13
是不是地址访问的问题? 如果 tempaddr 如果不能被4整除,还强制uint32_t*访问的话会出硬件异常。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

Dylan疾风闪电 回答时间:2017-1-19 19:24:38
海迹天涯 发表于 2017-1-18 13:38
地址在上层函数中已经限定,这个子函数只管编程1Kb的内部flash,基本流程是先看看这1K的空间是否被写过, ...
参考这样写:
  1.   for (i=0; i<len; i++)
  2.       {
  3.         if((*(volatile uint16_t*) (addr + (i<<1))) != pData[i])
  4.           return FALSE;
  5.       }
复制代码
海迹天涯 回答时间:2017-1-18 13:38:05
Dylan疾风闪电 发表于 2017-1-18 12:44
需要限定 tempaddr 的取值范围,否则可能 读取 不存在/或者 其它异常的地址,导致错误发生 ...

地址在上层函数中已经限定,这个子函数只管编程1Kb的内部flash,基本流程是先看看这1K的空间是否被写过,没写过直接编程,写过就先擦除再编程
moyanming2013 回答时间:2017-1-18 12:26:23
本帖最后由 moyanming2013 于 2017-1-18 12:27 编辑

count如果是uint8,其值最大是255,那么永远也出不来for循环。
然后,tempaddr就会越位了。越位后访问了不该访问的地址,进而产生HardFault异常。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

海迹天涯 回答时间:2017-1-18 12:31:04
moyanming2013 发表于 2017-1-18 12:26
count如果是uint8,其值最大是255,那么永远也出不来for循环。
然后,tempaddr就会越位了。越位后访问了不 ...

是UINT32_T
zoomdy 回答时间:2017-1-18 12:43:39
你这个是什么核心的,如果是Cortex-M3及以上,可以查看SCB->CFSR, SCB->HFSR, SCB->MMFAR, SCB->BFAR这几个寄存器来确定出错的原因。如果是Cortex-M0,那么查看一下反汇编,看看执行的是什么指令。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

Dylan疾风闪电 回答时间:2017-1-18 12:44:37
需要限定 tempaddr 的取值范围,否则可能 读取 不存在/或者 其它异常的地址,导致错误发生

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

海迹天涯 回答时间:2017-1-18 13:36:02
zoomdy 发表于 2017-1-18 12:43
你这个是什么核心的,如果是Cortex-M3及以上,可以查看SCB->CFSR, SCB->HFSR, SCB->MMFAR, SCB->BFAR这几个 ...

STM32F051  M0内核的
moyanming2013 回答时间:2017-1-18 14:25:30

内部flash能这样直接读?不考虑总线时间吗?!
你可以一次性的读到一个内存中,然后在内存中再判断。
海迹天涯 回答时间:2017-1-18 15:12:32
moyanming2013 发表于 2017-1-18 14:25
内部flash能这样直接读?不考虑总线时间吗?!
你可以一次性的读到一个内存中,然后在内存中再判断。 ...

太占内存了,数据很大的,1024个字节
海迹天涯 回答时间:2017-1-20 08:46:08

我试试看
迷雾向前 回答时间:2017-1-20 11:30:08
是不是地址访问的问题? 如果 tempaddr 如果不能被4整除,还强制uint32_t*访问的话会出硬件异常。
海迹天涯 回答时间:2017-1-20 13:34:16
迷雾向前 发表于 2017-1-20 11:30
是不是地址访问的问题? 如果 tempaddr 如果不能被4整除,还强制uint32_t*访问的话会出硬件异常。 ...

正解,果然是这样
shuolang126 回答时间:2017-1-21 08:33:41
tempaddr变量的数值有问题吗?如果读取的数据时程序代码本身所处的位置,就会触发错误。
使用指针读取内容,不是任何位置都可以读取的

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版