//中断优先级NVIC设置 NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; //TIM5中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; //先占优先级2级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器不能断点调试的原因以及解决办法
时间: 2024-01-10 09:02:19 浏览: 170
中断优先级的理解_中断优先级_源码
5星 · 资源好评率100%
这段代码不能断点调试的原因可能是因为在进行中断处理时,CPU会跳转到中断服务函数执行相应的操作,而此时如果在中断服务函数中打上断点,会导致程序停止在断点处,从而影响中断服务的正常执行。这样就可能会出现一些意想不到的问题,导致程序无法正常运行。
解决办法是可以在设置断点之前,先在代码中加入一个条件判断语句,判断是否处于中断服务函数中,如果是,则跳过断点,继续执行程序。具体的代码实现可以参考以下示例:
```
//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; //TIM5中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; //先占优先级2级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
//加入条件判断语句,跳过中断服务函数中的断点
if ((CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk) && (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk))
{
__asm volatile ("NOP");
}
```
这样就可以在调试时避免影响中断服务的正常执行,同时也能够进行断点调试。
阅读全文