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

是STM32掉进HardFault_Handler

[复制链接]
hqw 提问时间:2018-4-22 10:44 /
一旦有数据发送给STM32(哪怕只是几个字节),就会掉到这里:
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}

void uart_receive_input(unsigned char value)
{


  if((queue_in > queue_out) && ((queue_in - queue_out) >= sizeof(wifi_queue_buf)))
  {

  }
  else if((queue_in < queue_out) && ((queue_out  - queue_in) == 0))
  {

  }
  else
  {
    if(queue_in >= (unsigned char *)(wifi_queue_buf + sizeof(wifi_queue_buf)))
    {
      queue_in = (unsigned char *)(wifi_queue_buf);
    }

    *queue_in ++ = value;//如果这句屏蔽就不会
  }
}

     网上有关HardFault_Handler的述说也是有的,但我还是没弄清楚我这个是如何产生的及怎样解决。多谢大家的指教

desk(改自空气净化器) - 0331 - AA.rar

下载

4.37 MB, 下载次数: 2, 下载积分: ST金币 -1

收藏 评论5 发布时间:2018-4-22 10:44

举报

5个回答
feixiang20 回答时间:2018-4-23 01:05:44
本帖最后由 feixiang20 于 2018-4-23 01:07 编辑

仅作参考,STM32进入HardFault_Handler处理办法HardFault_Handler出现的情况一般有两种:
一种是:数组越界
一种是:堆栈溢出,程序指针指飞
1.在中断HardFault_Handler中的while()处打上断点,让程序执行到此处停止。
在Registers里面找到R14(LR)的值,我的这里是:0xFFFFFFF9
说明一下:
0xFFFFFFF9对应的是要看MSP寄存器
0xFFFFFFFD对应的是要看PSP寄存器
所以这里需要查找的内存地址是MSP的值:0x20008828
2.进入 HardFault_Handler 可以查看M3,4,0 的内核寄存器看是哪里的问题,把接收buffer改小一点试试
3.参考https://www.stmcu.org.cn/module/forum/thread-612166-1-1.html





评分

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

查看全部评分

springvirus 回答时间:2018-4-23 16:24:03
请仔细检查程序,我遇到过接手别人程序,对长度做减1操作,但执行前未做非法值的判断,结果运行当中,会有机率出现对0做减1,导致死机,仿真跟了一段时间才找出这个错误

评分

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

查看全部评分

回答时间:2018-4-23 17:00:49
数组溢出导致,楼主好好算一下使用数组是不是超出最大长度了。

评分

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

查看全部评分

hqw 回答时间:2018-4-26 15:40:28
大家讲的都有道理,但就是没有人点出问题是在哪里。
*queue_in ++ = value;我已经知道它掉进HardFault_Handler前,就是运行到这里。(换言之,它如果运行到*queue_in ++ = value;就会掉进HardFault_Handler)。但为什会进去,大家能把问题的根源缩小下吗?
vlivli 回答时间:2018-4-26 16:13:05
学习下。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版