STM32F030 SysTick中断处理与启动文件配置技术问询
STM32F030 SysTick 相关问题解答
问题1:禁用SysTick中断后是否仍需空Handler?
- 禁用SysTick中断的方法:直接操作SysTick控制寄存器
SYST_CSR的TICKINT位(第1位),写入0即可关闭中断:
如果使用HAL库,SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;HAL_Init()默认会开启SysTick中断,需在初始化后立即执行上述代码禁用;如果手动配置SysTick,初始化时不设置TICKINT位,就能从根源避免中断触发。 - 是否需要保留空Handler:不需要。只要
TICKINT位为0,SysTick就不会触发中断,自然不会进入任何Handler。只要确保在SysTick计数启动前(或HAL初始化后)及时禁用中断,就不会出现触发Default_Handler的风险。
问题2:自定义弱函数替代启动文件定义的规范方式
不修改启动文件的最优方案
直接在你的共享库中定义一个弱引用的空SysTick Handler,无需修改启动文件:
__weak void SysTick_Handler(void) { // 空实现,默认无操作 }
- 原理:启动文件中
SysTick_Handler是弱定义,当库中存在同样弱定义的函数时,链接器会优先选择库的实现;如果应用层需要自定义SysTick逻辑,只需在项目中定义一个不带__weak的SysTick_Handler,就会自动覆盖库的弱函数。 - 优势:避免修改启动文件(CubeMX重新生成代码时不会覆盖你的修改),库的移植性更强,符合STM32的代码规范。
修改启动文件的备选方案(不推荐)
如果一定要修改启动文件,可将原有的默认Handler替换为自定义空实现:
- 删除启动文件中的以下代码:
.weak SysTick_Handler .thumb_set SysTick_Handler,Default_Handler - 添加自定义的空Handler汇编实现:
.weak SysTick_Handler .thumb_set SysTick_Handler,Empty_SysTick_Handler Empty_SysTick_Handler: BX LR // 直接返回,无操作
- 缺点:启动文件属于CubeIDE自动生成的代码,后续用CubeMX更新项目时,你的修改会被覆盖,维护成本高,不适合跨项目共享的库场景。
内容的提问来源于stack exchange,提问作者ElecDesigner
相关产品推荐
相关产品推荐

