电子产业一站式赋能平台

PCB联盟网

搜索
查看: 10|回复: 0
收起左侧

STM32移植freeModbus触发HardFault_Handler

[复制链接]
匿名  发表于 前天 08:15 |阅读模式

移植freeModbus,根据文档的提示看似非常的简单,在实际过程中还是遇到不少问题的,其中一个问题就是在移植freeModbus之后系统进入硬件HardFault_Handler。
freeModbus需要开启一个定时器用于通信超时处理
调试定时器时发现定时没有启动,原来STM32CubeMx配置后,需要手动调用HAL_TIM_Base_Start_IT,否则定时器没有启动
关于定时器的配置可以看下这篇文章
“HAL库 CubeMX 配置 高级定时器 TIM1 详解”
但是开启定时器后,系统在启动定时器时即进入HardFault_Handler,后续的代码都没有再执行。
经过各种分析,也是一筹莫展。
后来把定时器中断回调函数中调用的prvvTIMERExpiredISR屏蔽后,系统正常运行
为什么调用prvvTIMERExpiredISR会导致系统硬件异常呢?
HardFault_Handler的错误原因可能是
中断冲突STM32 的定时器中断优先级可能与其他中断(如 UART 中断或 FreeRTOS 的 Systick 中断)冲突,导致异常。
非法指针操作,确保定时器超时回调函数调用时,相关资源已经正确分配。
堆栈溢出,如果定时器中断回调函数执行的代码较多(例如调用了复杂的 Modbus 函数),可能会导致堆栈溢出,从而触发 HardFault。
后来经过分析
是我把HAL_TIM_Base_Start_IT放在的main开始之前的初始化位置
而调用HAL_TIM_Base_Start_IT之后系统即触发定时器中断
中断中调用prvvTIMERExpiredISR
而prvvTIMERExpiredISR存在指针函数的赋值和调用
从而导致空指针存在的情况
所以
HAL_TIM_Base_Start_IT需要在eMBInit 或 eMBEnable 之后调用。
基于此,我认为还是freemodbus防出错机制不够健全。
官方有必要增加一个启动定时器的移植。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表