微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32外部中断操作

STM32外部中断操作

时间:11-17 来源:互联网 点击:
内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有76个中断,包括16个内核中断和60个可屏蔽中断,具有16级可编程的中断优先级。

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top