微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > stm32_exti(含NVIC)配置及库函数讲解

stm32_exti(含NVIC)配置及库函数讲解

时间:11-11 来源:互联网 点击:

arm_IRQChannel ((u8)0x29) /* RTC Alarm through EXTI Line Interrupt */
#define USBWakeUp_IRQChannel ((u8)0x2A) /* USB WakeUp from suspend through EXTI Line Interrupt */
#define TIM8_BRK_IRQChannel ((u8)0x2B) /* TIM8 Break Interrupt */
#define TIM8_UP_IRQChannel ((u8)0x2C) /* TIM8 Update Interrupt */
#define TIM8_TRG_COM_IRQChannel ((u8)0x2D) /* TIM8 Trigger and Commutation Interrupt */
#define TIM8_CC_IRQChannel ((u8)0x2E) /* TIM8 Capture Compare Interrupt */
#define ADC3_IRQChannel ((u8)0x2F) /* ADC3 global Interrupt */
#define FSMC_IRQChannel ((u8)0x30) /* FSMC global Interrupt */
#define SDIO_IRQChannel ((u8)0x31) /* SDIO global Interrupt */
#define TIM5_IRQChannel ((u8)0x32) /* TIM5 global Interrupt */
#define SPI3_IRQChannel ((u8)0x33) /* SPI3 global Interrupt */
#define UART4_IRQChannel ((u8)0x34) /* UART4 global Interrupt */
#define UART5_IRQChannel ((u8)0x35) /* UART5 global Interrupt */
#define TIM6_IRQChannel ((u8)0x36) /* TIM6 global Interrupt */
#define TIM7_IRQChannel ((u8)0x37) /* TIM7 global Interrupt */
#define DMA2_Channel1_IRQChannel ((u8)0x38) /* DMA2 Channel 1 global Interrupt */
#define DMA2_Channel2_IRQChannel ((u8)0x39) /* DMA2 Channel 2 global Interrupt */
#define DMA2_Channel3_IRQChannel ((u8)0x3A) /* DMA2 Channel 3 global Interrupt */
#define DMA2_Channel4_5_IRQChannel ((u8)0x3B) /* DMA2 Channel 4 and DMA2 Channel 5 global Interrupt */

例如:EXTI9所对应的中断号为23。

ICER[2]:全称是InterruptClear-EnableRegisters,是一个中断除能寄存器组。该寄存器组与ISER的作用恰好相反,是用来清除某个中断的使能的。这里要与专门设置一个ICER来清除中断位,而不是向ISER写0来清除,是因为NVIC的这些寄存器都是写1有效的,写0无效的。具体为什么这么设计,请看《CM3权威指南》第125页。

ISPR[2]:全称是InterruptSet-PendingRegisters,是一个中断挂起控制寄存器组。每一位对应的中断和ISER是一样的。通过置1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。写0是无效的。

ICPR[2]:全称是:InterruptClear-PendingRegisters,是一个中断解挂控制寄存器组。其作用与ISPR相反,对应位也和ISER是一样的。通过设置1,可以将挂起的中断解挂。写0无效。

IABR[2]:全称是ActiveBitRegisters,是一个中断激活标志位寄存器组。对应位所代表的的中断和ISER一样,如果为1,则表示该位所对应的中断正在被执行。这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。

IPR[15]:全称是InterruptPriorityRegisters,是一个中断优先级控制的寄存器组。这个寄存器组相当重要!STM32的中断分组与这个寄存器组密切相关。IPR寄存器组由15个32bit的寄存器组成,每个可屏蔽中断占用8bit,这样总共可以表示15*4=60个可屏蔽中断。刚好和STM32的可屏蔽中断数相等。IPR[0]的[31~24],[23~16],[15~8],[7~0]分别对应中断3~0,以此类推,总共对应60个外部中断。而每个可屏蔽中断占用的8bit并没有全部使用,而是只用了高4位。这4位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据SCB->AIRCR中中断分组的设置来决定。

这里简单介绍一下STM32的中断分组:STM32将中断分为5各组,组0~4。该分组的设置是由SCB->AIRCR 寄存器的bit10~8来定义的。具体的分配关系如下表所示:

例如:PB9对应中断线EXTI9,NVIC_Priority Group=1,Preemption Priority=1,SubPriority=7,则IAR中的IP5的PRI_23=0xF0。

stm32的固件库中有两个非常重要的结构体,如下

/*------------------------ Nested Vectored Interrupt Controller --------------*/
typedef struct
{
vu32 ISER[2]; //对应IAR中 SETENA0 和 SETENA1
u32 RESERVED0[30];
vu32 ICER[2]; //对应IAR中 CLRENA0 和 CLRENA1
u32 RSERVED1[30];
vu32 ISPR[2]; //对应IAR中 SETPEND0 和 SETPEND1
u32 RESERVED2[30];
vu32 ICPR[2]; //对应IAR中 CLRPEND0 和 CLRPEND1
u32 RESERVED3[30];
vu32 IABR[2]; //对应IAR中 ACTIVE0 和 ACTIVE1
u32 RESERVED4[62];
vu32 IPR[15]; //对应IAR中 IP0 到 IP15
} NVIC_TypeDef;

它们对应ARM手册中的名称为
ISER=InterruptSet-EnableRegisters
ICER=InterruptClear-EnableRegisters
ISPR=InterruptSet-PendingRegister
ICPR=InterruptClear-PendingRegister
IABR=ActiveBitRegister
IPR=InterruptPriorityRegisters

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

网站地图

Top