STM32H745 M4核:能否在HSEM中断服务中响应SysTick中断?
问题解答
1. 是否可配置MCU使SysTick中断在其他中断服务期间运行?
可以实现。STM32H745的M4核中断优先级由抢占优先级和子优先级决定,数值越小优先级越高:
- SysTick属于内核中断,其优先级可通过
SCB->SHPR3寄存器(或HAL库的NVIC_SetPriority(SysTick_IRQn, priority)函数)配置 - HSEM是外设中断,优先级可通过NVIC的
IPR寄存器(或HAL库的HAL_NVIC_SetPriority(HSEM_IRQn, preempt_prio, sub_prio)函数)配置
只需将SysTick的抢占优先级设置得比HSEM中断更高(数值更小),就能让SysTick中断抢占正在运行的HSEM中断服务程序。例如,假设系统采用优先级分组2(抢占优先级占2位),可将SysTick的抢占优先级设为0,HSEM的抢占优先级设为1,这样SysTick就能打断HSEM的ISR。
2. 这种做法是否属于不良实践?
不一定,取决于SysTick中断服务程序(ISR)的复杂度:
- 如果SysTick的ISR仅做简单的1ms计数,无耗时操作、无共享资源访问冲突,这种配置是安全的,不属于不良实践
- 但如果SysTick的ISR包含复杂逻辑、耗时操作,或者会访问HSEM ISR中使用的共享资源,那么中断嵌套可能引发以下问题:
- HSEM中断响应延迟,可能导致核间同步超时(HSEM常用于M4/M7核间资源互斥)
- 栈溢出风险(中断嵌套会增加栈的使用深度)
- 共享资源访问的竞态条件(未加保护时)
因此,若要采用这种方案,必须保证SysTick ISR尽可能简洁,且做好栈空间评估和资源冲突防护。
3. 是否必须修改代码让HSEM中断的退出不依赖SysTick?
不是必须,但修改代码会更稳妥。
- 若不想修改现有代码,调整中断优先级是可行的替代方案,只要满足上述优先级配置和ISR简洁性要求
- 更优的方案是修改HSEM中断的退出逻辑,摆脱对SysTick的依赖:
- 使用硬件定时器(如TIM6/TIM7)的比较匹配功能实现毫秒级计时,无需依赖中断
- 利用内核DWT计数器(
DWT->CYCCNT)实现高精度延时,通过读取时钟周期数计算时间,完全无需中断
内容的提问来源于stack exchange,提问作者Alex Jegers
相关产品推荐
相关产品推荐

