STM32中断的使能

时间:2022-08-12 19:32:18

lib_V3.0.0 的头文件misc.c的void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)说: 


/* Enable the Selected IRQ Channels ---------------*/
 NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);


 


============================


STM32有"60 maskable interrupt channels (not including the 16 interrupt lines of Cortex-M3)"[翻译]60个可屏蔽中断通道(不包含16个Cortex-M3的中断线),这60个可屏蔽中断通道的Position依次为0——59


所以尽管在core_cm3.h(Copyright (C) 2009 ARM Limited.)定义了__IO uint32_t  ISER[8]; ,实际上只用到了ISER[0]ISER[1]


其中Position0——31的使能位放到ISER[0]里,Position32——59的使能位放到ISER[1]里。


因此NVIC_InitStruct->NVIC_IRQChannel >> 0x05的值要么等于0,要么等于1。(Position0——31右移5位得0,Position32——59右移5位得1)


 


 


 


========================================


注意 : 0x1F的数据类型是(uint8_t)


注意: MDK无符号位右移为"逻辑右移",即右移后,左边空出的部分用0填补。