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