您的位置 首页 电路

怎么选用STM32单片机中断向量控制器NVIC来分配优先级的数量

如何采用STM32单片机中断向量控制器NVIC来分配优先级的数量-先占优先级的概念等同于51单片机中的中断。假设有两中断先后触发,已经在执行的中断先占优先级如果没有后触发的中断 先占优先级更高,就会先处理先占优先级高的中断。也就是说又有较高的先占优先级的中断可以打断先占优先级较低的中断。这是实现中断嵌套的基础。

cortex-m3支撑256个中端,其间包含了16个内核中止,240个外部中止。STM32只要84个中止,包含16个内核中止和68个可屏蔽中止。stm32f103上只要60个中止,f107上才有68个中止。

中止是STM32很根底的一个功用,学会运用中止,才能够更好的运用其他的外设。了解STM32的中止,必需要先从STM32的中止优先级分组是怎么回事。要了解优先级分组,就要先了解什么是先占优先级,和次占优先级。

先占优先级的概念等同于51单片机中的中止。假设有两中止先后触发,已经在履行的中止先占优先级假如没有后触发的中止 先占优先级更高,就会先处理先占优先级高的中止。也便是说又有较高的先占优先级的中止能够打断先占优先级较低的中止。这是完成中止嵌套的根底。

次占优先级只在同一先占优先级的中止一起触发时起作用,先占优先级相同,则优先履行次占优先级较高的中止。次占优先级不会形成中止嵌套。 假如中止的两个优先级都共同,则优先履行坐落中止向量表中方位较高的中止。

还需要注意的一点是 这儿的中止优先级 高是指 是指是否更挨近0级,0级优先级是最高的。

那么最低的优先级能够是多少?这就触及了优先级分组的概念。 STM32 经过一个中止向量控制器(NVIC),来分配先占优先级和次占优先级的数量。

arm cortex-m3 内核中具有一个3位宽度的的PRIGROUP数据区,用来指示一个8位数据序列中的小数点的方位然后表明中止优先级的分组。

举个比如能够更好的了解:假如PRIGROUP 数据位000 即为0 阐明8位数据序列中小数方位在第1位的左面 为xxxxxxx.y 用于表明中止优先级的分组的意义便是 用7位的数据宽度来表明 先占优先级的数量 即为128 用1位的数据宽度来表明 次占优先级数量 即为 2

所以arm cortex-m3中有2的三次方 即为8个优先级分组 。

可是STM32中只要5个优先级分组,表明办法略有不同

MDK中界说的中止相关的寄存器结构体为:

typedef struct

{

vu32 ISER[2];

u32 RESERVED0[30];

vu32 ICER[2];

u32 RSERVED1[30];

vu32 ISPR[2];

u32 RESERVED2[30];

vu32 ICPR[2];

u32 RESERVED3[30];

vu32 IABR[2];

u32 RESERVED4[62];

vu32 IPR[15];

} NVIC_TypeDef;

ISER[2]:中止使能寄存器组

STM32可屏蔽中止共有60个,这儿用了两个32位的寄存器,能够表明64个中止。STM32只用了前60位。 若要使能某个中止,则有必要设置相应的ISER位为1。

详细每一位对应的中止联系如下:(拜见 MDK下的 stm32f10x_nvic.h)

#define WWDG_IRQChannel ((u8)0x00) /* Window WatchDog Interrupt */

#define PVD_IRQChannel ((u8)0x01) /* PVD through EXTI Line detecTIon Interrupt */

#define TAMPER_IRQChannel ((u8)0x02) /* Tamper Interrupt */

#define RTC_IRQChannel ((u8)0x03) /* RTC global Interrupt */

#define FLASH_IRQChannel ((u8)0x04) /* FLASH global Interrupt */

#define RCC_IRQChannel ((u8)0x05) /* RCC global Interrupt */

#define EXTI0_IRQChannel ((u8)0x06) /* EXTI Line0 Interrupt */

#define EXTI1_IRQChannel ((u8)0x07) /* EXTI Line1 Interrupt */

#define EXTI2_IRQChannel ((u8)0x08) /* EXTI Line2 Interrupt */

#define EXTI3_IRQChannel ((u8)0x09) /* EXTI Line3 Interrupt */

#define EXTI4_IRQChannel ((u8)0x0A) /* EXTI Line4 Interrupt */

#define DMA1_Channel1_IRQChannel ((u8)0x0B) /* DMA1 Channel 1 global Interrupt */

#define DMA1_Channel2_IRQChannel ((u8)0x0C) /* DMA1 Channel 2 global Interrupt */

#define DMA1_Channel3_IRQChannel ((u8)0x0D) /* DMA1 Channel 3 global Interrupt */

#define DMA1_Channel4_IRQChannel ((u8)0x0E) /* DMA1 Channel 4 global Interrupt */

#define DMA1_Channel5_IRQChannel ((u8)0x0F) /* DMA1 Channel 5 global Interrupt */

#define DMA1_Channel6_IRQChannel ((u8)0x10) /* DMA1 Channel 6 global Interrupt */

#define DMA1_Channel7_IRQChannel ((u8)0x11) /* DMA1 Channel 7 global Interrupt */

#define ADC1_2_IRQChannel ((u8)0x12) /* ADC1 et ADC2 global Interrupt */

#define USB_HP_CAN_TX_IRQChannel ((u8)0x13) /* USB High Priority or CAN TX Interrupts */

#define USB_LP_CAN_RX0_IRQChannel ((u8)0x14) /* USB Low Priority or CAN RX0 Interrupts */

#define CAN_RX1_IRQChannel ((u8)0x15) /* CAN RX1 Interrupt */

#define CAN_SCE_IRQChannel ((u8)0x16) /* CAN SCE Interrupt */

#define EXTI9_5_IRQChannel ((u8)0x17) /* External Line[9:5] Interrupts */

#define TIM1_BRK_IRQChannel ((u8)0x18) /* TIM1 Break Interrupt */

#define TIM1_UP_IRQChannel ((u8)0x19) /* TIM1 Update Interrupt */

#define TIM1_TRG_COM_IRQChannel ((u8)0x1A) /* TIM1 Trigger and Commutation Interrupt */

#define TIM1_CC_IRQChannel ((u8)0x1B) /* TIM1 Capture Compare Interrupt */

#define TIM2_IRQChannel ((u8)0x1C) /* TIM2 global Interrupt */

#define TIM3_IRQChannel ((u8)0x1D) /* TIM3 global Interrupt */

#define TIM4_IRQChannel ((u8)0x1E) /* TIM4 global Interrupt */

#define I2C1_EV_IRQChannel ((u8)0x1F) /* I2C1 Event Interrupt */

#define I2C1_ER_IRQChannel ((u8)0x20) /* I2C1 Error Interrupt */

#define I2C2_EV_IRQChannel ((u8)0x21) /* I2C2 Event Interrupt */

#define I2C2_ER_IRQChannel ((u8)0x22) /* I2C2 Error Interrupt */

#define SPI1_IRQChannel ((u8)0x23) /* SPI1 global Interrupt */

#define SPI2_IRQChannel ((u8)0x24) /* SPI2 global Interrupt */

#define USART1_IRQChannel ((u8)0x25) /* USART1 global Interrupt */

#define USART2_IRQChannel ((u8)0x26) /* USART2 global Interrupt */

#define USART3_IRQChannel ((u8)0x27) /* USART3 global Interrupt */

#define EXTI15_10_IRQChannel ((u8)0x28) /* External Line[15:10] Interrupts */

#define RTCAlarm_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 */

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/dianlu/346271.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部