STM32F103外部中断禁用后如何重新启用?
你可以根据你用的固件库或者开发需求选以下任意一种方式实现,两种方式本质都是操作NVIC的ISER/ICER寄存器,区别只是要不要自己手写寄存器操作:
- 第一种:复用现有标准库配置(最稳妥,不需要手动改寄存器)
只要你之前存配置的NVIC_InitStructure变量里的其他参数(中断通道、抢占优先级、响应优先级)没有被后续代码修改过,直接重新执行你最开始的启用代码即可:
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
NVIC_Init标准库函数内部会自动计算你配置的中断通道对应的位,自动写ISER寄存器完成使能,不需要你手动操作寄存器,也不会改动其他中断的配置。
- 第二种:直接操作寄存器(适合对寄存器映射熟悉,需要极致精简代码的场景)
ARM Cortex内核的NVIC设计里,ISER(中断设置使能寄存器)是只写1生效的寄存器,写0不会改动任何位,所以直接给对应通道的位写1就能完成使能:
// 举个例子,假如你要使能的是EXTI0_IRQn,对应通道号是6 NVIC->ISER[EXTI0_IRQn >> 5] = 1 << (EXTI0_IRQn & 0x1F);
同理禁用的时候写ICER寄存器即可:
NVIC->ICER[EXTI0_IRQn >> 5] = 1 << (EXTI0_IRQn & 0x1F);
注意如果是外部中断的话,重新使能前最好先清掉EXTI对应的挂起位,避免之前触发的未处理中断在使能后立刻执行。
- 第三种:如果你用的是HAL库,直接调用官方封装的接口即可,不需要维护结构体配置:
HAL_NVIC_EnableIRQ(EXTI0_IRQn); // 传入你要使能的外部中断号即可
内容的提问来源于stack exchange,提问作者jiangyin first brother
相关产品推荐
相关产品推荐

