1、问题描述:mio板M2口连接雷达(即can口有数据时),程序跑到can中断使能代码时,程序跳转到“HardFault_Handler”,见下图:
代码跑到此处
解决历程:
1、修改堆栈
先是网上搜索此问题,大致两个解决方法:
A、内存溢出或者访问越界
B、堆栈溢出
此代码在第一版mio上工作正常,排除A的可能性;怀疑不小心修改了配置,改变了堆栈大小。
于是,去修改堆栈的大小。可,无论怎么增加size,都还是一样的错误。
2、查看map文件
修改堆栈大小不起作用时,感觉好疑惑,怎么会这样?后与同事沟通,建议看看map文件,会不会can中断服务程序没有被编译?
在map文件里,找到定时器和串口中断服务函数,的的确确没有can中断服务函数。
3、can中断配置
这个时候,有点不理解,MY_NVIC_Init(1,0,USB_LP_CAN1_RX0_IRQn,2);对应配置了中断抢占优先级、响应优先级、中断编号和中断分组,并没有注册中断函数,那么中断函数是怎么关联的呢?
网上搜索:若要调用相关的中断功能,在NVIC中配置相关的中断优先级和中断号,
STM32内部会根据配置的中断号在启动文件中寻找相应的中断函数的相应的入口函数。
另外:ST公司在提供的启动文件startup_stm32fXXX.s中都对相应的中断号对应的中断处理函数的入口都已经规定好了,即必须按照他提供的启动文件的名字来在相关文件(可以不是stm32fxxx_it.c中写驱动)写中断函数。
4、启动文件
工程里包含的所有启动文件,通过编译发现,工程使用的是startup_stm32f10x_md_vl.s启动文件。
stm32根据flash大小选择不同的启动文件:
flash容量<=32k 选择 ld
64k<= <=128k 选择 md
256<= <=512k 选择 hd
mio板使用芯片型号stm32F103ZE,512K字节,应选择startup_stm32f10x_hd.s。
hd文件里包含USB_LP_CAN1_RX0_IRQHandler中断函数,即can中断服务程序,而md文件里缺少此函数,所以当 接上雷达,产生中断时,中断得不到处理从而进入HardFault_Hander。
那么怎么修改启动文件呢?网上搜索,通过选择芯片类型device,但实际上没有成功。
后来,强制修改hd名字为md,这样异常中断的问题就解决了。但也不能这样解决问题,待续。。。
参考链接:https://blog.csdn.net/c1063891514/article/details/81545601
https://www.cnblogs.com/qingfeng2018/p/6574548.html
来源:CSDN
作者:昵称_搬砖
链接:https://blog.csdn.net/zhiyijue7762/article/details/103807182