STM32外部中断操作
NVIC
NVICNestedVectoredInterruptController嵌套向量中断控制。在STM32的标准外设库和MDK定义的中断相关的变量和结构体类型,大多都是以NVIC开头的,例如NVIC_InitTypeDef。
NVIC_Type
NVIC寄存器结构体。在MDK380a中,这个结构体是定义在stm32f10x_map.h中,具体的定义如下
typedefstruct
{
vu32ISER[2];
u32RESERVED0[30];
vu32ICER[2];
u32RSERVED1[30];
vu32ISPR[2];
u32RESERVED2[30];
vu32ICPR[2];
u32RESERVED3[30];
vu32IABR[2];
u32RESERVED4[62];
vu32IPR[15];
}NVIC_TypeDef;
ISERInterruptSet-EnableRegister中断使能寄存器组,两个字,共63位,用了60位,一个位对应一个中断,写1中断有效,写0无意义。
ICERInterruptClear-EnableRegister中断除能寄存器组,也是两个字,和上面的使能寄存器组功能刚好相反,写1中断失效,写0无意义。
ISPRInterruptSet-PendingRegister中断挂起控制寄存器组。用了60个位,对应60个中断。写1有效,可以将正在运行的中断挂起,从而执行同级别或者更高级别的中断。写0无意义。
ICPRInterruptClear-PendingRegister中断解挂寄存器组。和上面的挂起寄存组功能刚好相反。写1有效,写0无意义。
IABRInterruptActiveBitRegister中断激活标志位寄存器组。这是一个只读寄存器,通过读这个寄存器,可以知道那个中断正在被执行,对应的位会被置1。中断执行完后对应位清零。
IPRInterruptPriorityRegister中断优先级寄存器15个字,共60个字节,每个字节对应一个中断,每个字节只用到了高四位,剩余四位保留。这有效4位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据SCB->AIRCR中中断分组的设置来决定。
SCB->AIRCR
STM32的中断分组:STM32将中断分为5个组,组0~4。该分组的设置是由SCB->AIRCR寄存器的bit10~8来定义的。具体的分配关系如下表所示:组 | AIRCR[10:8] | bit[7:4]分配情况 | 分配结果 |
0 | 111 | 0:4 | 0位抢占优先级,4位响应优先级 |
1 | 110 | 1:3 | 1位抢占优先级,3位响应优先级 |
2 | 101 | 2:2 | 2位抢占优先级,2位响应优先级 |
3 | 100 | 3:1 | 3位抢占优先级,1位响应优先级 |
4 | 011 | 4:0 | 4位抢占优先级,0位响应优先级 |
通过这个表,我们就可以清楚的看到组0~4对应的配置关系,例如组设置为3,那么此时所有的60个中断,每个中断的中断优先寄存器的高四位中的最高3位是抢占优先级,低1位是响应优先级。每个中断,你可以设置抢占优先级为0~7,响应优先级为1或0。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。
这里需要注意2点:
1,如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行。
2,高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。
而在老版本的STM32标准外设库中也是有这样一个stm32f10x_map.h文件的。定义和上面的差不多,不同地方可能就是长度不同。
我现在手里拿的是最新的STM32标准外设库(3.5版),里面已经没有了stm32f10x_map.h这个文件了,要知道stm32f10x_map.h这个文件中定义了所有外设寄存器的结构和内存映射,像各个寄存器的结构体,基址,地址等等。
在新版的STM32的标准外设库中,将这些文件分开定义了,去掉了stm32f10x_map.h这个头文件后,新加入了stm32f10x.h和core_cm3.h两个头文件。
在core_cm3.h中,定义了:
1.NVIC_Type,
2.SCB_Type,
3.ITM_Type,
4.InterruptType_Type,
5.MPU_Type,
6.CoreDebug_Type。
在stm32f10x.h,定义了
7.ADC_TypeDef,
8.BKP_TypeDef,
9.CAN_TxMailBox_TypeDef,
10.CAN_FIFOMailBox_TypeDef,
11.CAN_FilterRegister_TypeDef,
12.CAN_TypeDef,
13.CEC_TypeDef,
14.CRC_TypeDef,
15.DAC_TypeDef,
16.DBGMCU_TypeDef,
17.DMA_Channel_TypeDef,
18.DMA_TypeDef,
19.ETH_TypeDef,
20.EXTI_TypeDef,
21.FLASH_TypeDef,
22.OB_TypeDef,
23.FSMC_Bank1_TypeDef,
24.FSMC_Bank1E_TypeDef,
25.FSMC_Bank2_TypeDef,
26.FSMC_Bank3_TypeDef,
27.FSMC_Bank4_TypeDef,
28.GPIO_TypeDef,
29.AFIO_TypeDef,
30.I2C_TypeDef,
31.IWDG_TypeDef,
32.PWR_TypeDef,
33.RCC_TypeDef,
34.RTC_TypeDef,
35.SDIO_TypeDef,
36.SPI_TypeDef,
37.TIM_TypeD
STM32外部中 相关文章:
- STM32笔记之外部中断GPIO(12-03)
- STM32学习之外部中断(12-02)
- STM32学习之--外部中断(11-26)
- STM32外部中断易出错总结(11-26)
- STM32中EXTI(外部中断)和NVIC(嵌套向量中断)的关系(11-25)
- STM32外部中断的使用(11-23)