1、STM32 (Cortex-M3) 中的優(yōu)先級(jí)概念
STM32(Cortex-M3)中有兩個(gè)優(yōu)先級(jí)的概念:搶占式優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí),也把響應(yīng)優(yōu)先級(jí)稱作“亞優(yōu)先級(jí)”或“副優(yōu)先級(jí)”,每個(gè)中斷源都需要被指定這兩種優(yōu)先級(jí)。
1. 何為占先式優(yōu)先級(jí)(pre-emption priority)
高占先式優(yōu)先級(jí)的中斷事件會(huì)打斷當(dāng)前的主程序/中斷程序運(yùn)行—搶斷式優(yōu)先響應(yīng),俗稱中斷嵌套。
2. 何為副優(yōu)先級(jí)(subpriority)
在占先式優(yōu)先級(jí)相同的情況下,高副優(yōu)先級(jí)的中斷優(yōu)先被響應(yīng);
在占先式優(yōu)先級(jí)相同的情況下,如果有低副優(yōu)先級(jí)中斷正在執(zhí)行,高副優(yōu)先級(jí)的中斷要等待已被響應(yīng)的低副優(yōu)先級(jí)中斷執(zhí)行結(jié)束后才能得到響應(yīng)—非搶斷式響應(yīng)(不能嵌套)。
3. 判斷中斷是否會(huì)被響應(yīng)的依據(jù)
首先是占先式優(yōu)先級(jí),其次是副優(yōu)先級(jí);
占先式優(yōu)先級(jí)決定是否會(huì)有中斷嵌套;
Reset、NMI、Hard Fault 優(yōu)先級(jí)為負(fù)(高于普通中斷優(yōu)先級(jí))且不可調(diào)整。
4. 優(yōu)先級(jí)沖突的處理
具有高搶占式優(yōu)先級(jí)的中斷可以在具有低搶占式優(yōu)先級(jí)的中斷處理過程中被響應(yīng),即中斷的嵌套,或者說高搶占式優(yōu)先級(jí)的中斷可以嵌套低搶占式優(yōu)先級(jí)的中斷。
當(dāng) 兩個(gè)中斷源的搶占式優(yōu)先級(jí)相同時(shí),這兩個(gè)中斷將沒有嵌套關(guān)系,當(dāng)一個(gè)中斷到來后,如果正在處理另一個(gè)中斷,這個(gè)后到來的中斷就要等到前一個(gè)中斷處理完之后 才能被處理。如果這兩個(gè)中斷同時(shí)到達(dá),則中斷控制器根據(jù)他們的響應(yīng)優(yōu)先級(jí)高低來決定先處理哪一個(gè);如果他們的搶占式優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)都相等,則根據(jù)他們 在中斷表中的排位順序決定先處理哪一個(gè)。
5. Cortex-M3中對(duì)中斷優(yōu)先級(jí)的定義
既然每個(gè)中斷源都需要被指定這兩種優(yōu)先級(jí),就需要有相應(yīng)的寄存器位記錄每個(gè)中斷的優(yōu)先級(jí);在Cortex-M3中定義了8個(gè)比特位用于設(shè)置中斷源的優(yōu)先級(jí),這8個(gè)比特位可以有8種分配方式,如下:
所有8位用于指定響應(yīng)優(yōu)先級(jí)
最高1位用于指定搶占式優(yōu)先級(jí),最低7位用于指定響應(yīng)優(yōu)先級(jí)
最高2位用于指定搶占式優(yōu)先級(jí),最低6位用于指定響應(yīng)優(yōu)先級(jí)
最高3位用于指定搶占式優(yōu)先級(jí),最低5位用于指定響應(yīng)優(yōu)先級(jí)
最高4位用于指定搶占式優(yōu)先級(jí),最低4位用于指定響應(yīng)優(yōu)先級(jí)
最高5位用于指定搶占式優(yōu)先級(jí),最低3位用于指定響應(yīng)優(yōu)先級(jí)
最高6位用于指定搶占式優(yōu)先級(jí),最低2位用于指定響應(yīng)優(yōu)先級(jí)
最高7位用于指定搶占式優(yōu)先級(jí),最低1位用于指定響應(yīng)優(yōu)先級(jí)
這就是優(yōu)先級(jí)分組的概念。
6. stm32中對(duì)中斷優(yōu)先級(jí)的定義
Cortex-M3允許具有較少中斷源時(shí)使用較少的寄存器位指定中斷源的優(yōu)先級(jí),因此STM32把指定中斷優(yōu)先級(jí)的寄存器位減少到4位,這4個(gè)寄存器位的分組方式如下:
第0組:所有4位用于指定響應(yīng)優(yōu)先級(jí)
第1組:最高1位用于指定搶占式優(yōu)先級(jí),最低3位用于指定響應(yīng)優(yōu)先級(jí)
第2組:最高2位用于指定搶占式優(yōu)先級(jí),最低2位用于指定響應(yīng)優(yōu)先級(jí)
第3組:最高3位用于指定搶占式優(yōu)先級(jí),最低1位用于指定響應(yīng)優(yōu)先級(jí)
第4組:所有4位用于指定搶占式優(yōu)先級(jí)
AIRC(Application Interrupt and Reset Register)寄存器中有用于指定優(yōu)先級(jí)的 4 bits。這4個(gè)bits用于分配preemption優(yōu)先級(jí)和sub優(yōu)先級(jí),在STM32的固件庫中定義如下:
/* Preemption Priority Group */
#define NVIC_PriorityGroup_0 ((u32)0x700) /* 0 bits for pre-emption priority
4 bits for subpriority */
#define NVIC_PriorityGroup_1 ((u32)0x600) /* 1 bits for pre-emption priority
3 bits for subpriority */
#define NVIC_PriorityGroup_2 ((u32)0x500) /* 2 bits for pre-emption priority
2 bits for subpriority */
#define NVIC_PriorityGroup_3 ((u32)0x400) /* 3 bits for pre-emption priority
1 bits for subpriority */
#define NVIC_PriorityGroup_4 ((u32)0x300) /* 4 bits for pre-emption priority
0 bits for subpriority */
可以通過調(diào)用STM32的固件庫中的函數(shù)NVIC_PriorityGroupConfig()選擇使用哪種優(yōu)先級(jí)分組方式,這個(gè)函數(shù)的參數(shù)有下列5種:
NVIC_PriorityGroup_0 => 選擇第0組
NVIC_PriorityGroup_1 => 選擇第1組
NVIC_PriorityGroup_2 => 選擇第2組
NVIC_PriorityGroup_3 => 選擇第3組
NVIC_PriorityGroup_4 => 選擇第4組
接下來就是指定中斷源的優(yōu)先級(jí),下面以一個(gè)簡(jiǎn)單的例子說明如何指定中斷源的搶占式優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí):
// 選擇使用優(yōu)先級(jí)分組第1組
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//定義NVIC的結(jié)構(gòu)體變量
NVIC_InitTypeDef NVIC_InitStructure;
// 使能EXTI0中斷
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //指定搶占式優(yōu)先級(jí)別1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定響應(yīng)優(yōu)先級(jí)別0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 使能EXTI9_5中斷
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //指定搶占式優(yōu)先級(jí)別0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定響應(yīng)優(yōu)先級(jí)別1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
-------------------------------------------------------------------------------
要注意的幾點(diǎn)是:
1. 如果指定的搶占式優(yōu)先級(jí)別或響應(yīng)優(yōu)先級(jí)別超出了選定的優(yōu)先級(jí)分組所限定的范圍,將可能得到意想不到的結(jié)果;
2. 搶占式優(yōu)先級(jí)別相同的中斷源之間沒有嵌套關(guān)系;
3. 如果某個(gè)中斷源被指定為某個(gè)搶占式優(yōu)先級(jí)別,又沒有其它中斷源處于同一個(gè)搶占式優(yōu)先級(jí)別,則可以為這個(gè)中斷源指定任意有效的響應(yīng)優(yōu)先級(jí)別。
2、開關(guān)總中斷
在STM32/Cortex-M3中是通過改變CPU的當(dāng)前優(yōu)先級(jí)來允許或禁止中斷。
PRIMASK位:只允許NMI和hard fault異常,其他中斷/異常都被屏蔽(當(dāng)前CPU優(yōu)先級(jí)=0)。
FAULTMASK位:只允許NMI,其他所有中斷/異常都被屏蔽(當(dāng)前CPU優(yōu)先級(jí)=-1)。
在STM32固件庫中(stm32f10x_nvic.c和stm32f10x_nvic.h) 定義了四個(gè)函數(shù)操作PRIMASK位和FAULTMASK位,改變CPU的當(dāng)前優(yōu)先級(jí),從而達(dá)到控制所有中斷的目的。
下面兩個(gè)函數(shù)等效于關(guān)閉總中斷:
void NVIC_SETPRIMASK(void);
void NVIC_SETFAULTMASK(void);
下面兩個(gè)函數(shù)等效于開放總中斷:
void NVIC_RESETPRIMASK(void);
void NVIC_RESETFAULTMASK(void);
上面兩組函數(shù)要成對(duì)使用,但不能交叉使用。
例如:
第一種方法:
NVIC_SETPRIMASK(); //關(guān)閉總中斷 ,只允許NMI和hard fault異常
NVIC_RESETPRIMASK();//開放總中斷
第二種方法:
NVIC_SETFAULTMASK(); //關(guān)閉總中斷 ,只允許NMI
NVIC_RESETFAULTMASK();//開放總中斷
常常使用:
NVIC_SETPRIMASK(); // Disable Interrupts
NVIC_RESETPRIMASK(); // Enable Interrupts
可以用:
#define CLI() __set_PRIMASK(1) //關(guān)閉總中斷
#define SEI() __set_PRIMASK(0) //打開總中斷
來實(shí)現(xiàn)開關(guān)總中斷的功能。
二、寄存器介紹:
1、 在core_cm3.h中定義了:
typedef struct
{
__IO uint32_t ISER[8]; /*Offset:0x000(R/W)Interrupt Set Enable Register*/
//SETENA:中斷0-239的使能寄存器;地址為:0xE000-E100——0xE000-E11C;復(fù)位值:0
uint32_t RESERVED0[24];//未定義的寄存器
__IO uint32_t ICER[8]; /*Offset: 0x080 (R/W)Interrupt ClearEnable Register*/
//CLRENA:中斷0-239的除能寄存器;地址為:0xE000-E180——0xE000-E19C;復(fù)位值:0
uint32_t RSERVED1[24]; //未定義的寄存器
__IO uint32_t ISPR[8];/* Offset: 0x100 (R/W)Interrupt Set Pending Register*/
//SETPEND:中斷0-239的懸起寄存器;地址為:0xE000-E200——0xE000-E21C;復(fù)位值:0
uint32_t RESERVED2[24]; //未定義的寄存器
__IO uint32_t ICPR[8];/* Offset: 0x180 (R/W)Interrupt Clear Pending Register*/
//CLRPEND:中斷0-239的解懸寄存器;地址為:0xE000-E280——0xE000-E29C;復(fù)位值:0
uint32_t RESERVED3[24]; //未定義的寄存器
__IO uint32_t IABR[8]; /*Offset: 0x200 (R/W)Interrupt Active bit Register*/
//ACTIVE:中斷0-239的活動(dòng)狀態(tài)寄存器;地址為:0xE000-E300—0xE000-E31C復(fù)位值:0
uint32_t RESERVED4[56]; //未定義的寄存器
__IO uint8_t IP[240];/*Offset:0x300(R/W)Interrupt Priority Register(8Bit wide)*/
//中斷優(yōu)先級(jí)寄存器陣列(8位):中斷0-239的中斷優(yōu)先級(jí);
//地址為:0xE000-E400——0xE000-E4EF;復(fù)位值:0
uint32_t RESERVED5[644]; //未定義的寄存器
__IO uint32_t STIR; /* Offset: 0xE00 (R/W)Software Trigger Interrupt Register*/
//STIR:軟件觸發(fā)中斷寄存器(如寫入8則觸發(fā)中斷8的中斷);
//地址為:0xE000-EF00;復(fù)位值:-
} NVIC_Type;
#define SCS_BASE (0xE000E000) /*System Control Space Base Address */
#define NVIC_BASE (SCS_BASE + 0x0100) /*NVIC Base Address */
#define NVIC ((NVIC_Type *)NVIC_BASE) /*NVIC configuration struct*/
typedef struct
{
__I uint32_t CPUID; /*Offset: 0x000 (R/ ) CPUID Base Register*/
//CPUID: --;地址為:0xE000-ED00;復(fù)位值:0x410fc230
__IO uint32_t ICSR; /*Offset: 0x004(R/W)Interrupt Control and State Register*/
//ICSR:中斷控制及狀態(tài)寄存器;地址為:0xE000-ED04;復(fù)位值:0
__IO uint32_t VTOR; /*Offset: 0x008 (R/W) Vector Table Offset Register*/
//VTOR:向量表偏移寄存器;地址為:0xE000-ED08;復(fù)位值:-
__IO uint32_t AIRCR; /*Offset:0x00C(R/W)Application Interrupt and Reset Control Register*/
__IO uint32_t SCR; /*Offset: 0x010 (R/W) System Control Register*/
__IO uint32_t CCR; /*Offset: 0x014 (R/W) Configuration Control Register*/
__IO uint8_t SHP[12]; /*Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */
__IO uint32_t SHCSR; /*Offset: 0x024 (R/W) System Handler Control and State Register*/
__IO uint32_t CFSR; /*Offset: 0x028 (R/W) Configurable Fault Status Register*/
__IO uint32_t HFSR; /*Offset: 0x02C (R/W) HardFault Status Register */
__IO uint32_t DFSR; /*Offset: 0x030 (R/W) Debug Fault Status Register*/
__IO uint32_t MMFAR; /*Offset: 0x034 (R/W) MemManage Fault Address Register*/
__IO uint32_t BFAR; /*Offset: 0x038 (R/W) BusFault Address Register*/
__IO uint32_t AFSR; /*Offset: 0x03C (R/W) Auxiliary Fault Status Register*/
__I uint32_t PFR[2]; /*Offset: 0x040 (R/ ) Processor Feature Register*/
__I uint32_t DFR; /*Offset: 0x048 (R/ ) Debug Feature Register*/
__I uint32_t ADR; /*Offset: 0x04C (R/ ) Auxiliary Feature Register*/
__I uint32_t MMFR[4];/*Offset: 0x050 (R/ ) Memory Model Feature Register*/
__I uint32_t ISAR[5]; /*Offset: 0x060(R/ )Instruction Set Attributes Register*/
uint32_t RESERVED0[5];
__IO uint32_t CPACR; /*Offset: 0x088 (R/W)Coprocessor Access Control Register*/
} SCB_Type;
#define SCS_BASE (0xE000E000) /*System Control Space Base Address */
#define SCB_BASE (SCS_BASE + 0x0D00) /*System Control Block Base Address */
#define SCB ((SCB_Type *)SCB_BASE)/*SCB configuration struct*/
三、初始化設(shè)置
STM32中的NVIC設(shè)置的流程如下:
選擇NVIC的中斷分組:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //選擇中斷分組1
注意:優(yōu)先級(jí)分組只能設(shè)置一次。
定義NVIC的結(jié)構(gòu)體變量:NVIC_InitTypeDef NVIC_InitStructure;
選擇要進(jìn)行NVIC設(shè)置的模塊:
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //選擇串口1中斷
進(jìn)行搶占式中斷優(yōu)先級(jí)的設(shè)置:
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//搶占式中斷優(yōu)先級(jí)設(shè)置為0
進(jìn)行響應(yīng)式中斷優(yōu)先級(jí)的設(shè)置:
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//響應(yīng)式中斷優(yōu)先級(jí)設(shè)置為3
使能中斷:NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中斷
根據(jù)上述設(shè)置進(jìn)行初始化:NVIC_Init(&NVIC_InitStructure);
注:NVIC_InitTypeDef的定義在misc.h中;NVIC的相關(guān)函數(shù)在misc.c中。
NVIC_IRQChannel的取值列表:
typedef enum IRQn
{
/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/
NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */
MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */
BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */
UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */
SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */
DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */
PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */
SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */
/****** STM32 specific Interrupt Numbers *********************************************************/
WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */
PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */
TAMPER_IRQn = 2, /*!< Tamper Interrupt */
RTC_IRQn = 3, /*!< RTC global Interrupt */
FLASH_IRQn = 4, /*!< FLASH global Interrupt */
RCC_IRQn = 5, /*!< RCC global Interrupt */
EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */
EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */
EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */
EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */
EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */
DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */
DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */
DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */
DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 global Interrupt */
DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */
DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */
DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */
#ifdef STM32F10X_CL
ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */
CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */
CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */
CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */
CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */
EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */
TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */
TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */
TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */
TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */
TIM2_IRQn = 28, /*!< TIM2 global Interrupt */
TIM3_IRQn = 29, /*!< TIM3 global Interrupt */
TIM4_IRQn = 30, /*!< TIM4 global Interrupt */
I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */
I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */
I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */
I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */
SPI1_IRQn = 35, /*!< SPI1 global Interrupt */
SPI2_IRQn = 36, /*!< SPI2 global Interrupt */
USART1_IRQn = 37, /*!< USART1 global Interrupt */
USART2_IRQn = 38, /*!< USART2 global Interrupt */
USART3_IRQn = 39, /*!< USART3 global Interrupt */
EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */
RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */
OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS WakeUp from suspend through EXTI Line Interrupt */
TIM5_IRQn = 50, /*!< TIM5 global Interrupt */
SPI3_IRQn = 51, /*!< SPI3 global Interrupt */
UART4_IRQn = 52, /*!< UART4 global Interrupt */
UART5_IRQn = 53, /*!< UART5 global Interrupt */
TIM6_IRQn = 54, /*!< TIM6 global Interrupt */
TIM7_IRQn = 55, /*!< TIM7 global Interrupt */
DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */
DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */
DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */
DMA2_Channel4_IRQn = 59, /*!< DMA2 Channel 4 global Interrupt */
DMA2_Channel5_IRQn = 60, /*!< DMA2 Channel 5 global Interrupt */
ETH_IRQn = 61, /*!< Ethernet global Interrupt */
ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */
CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */
CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */
CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */
CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */
OTG_FS_IRQn = 67 /*!< USB OTG FS global Interrupt */
#endif /* STM32F10X_CL */
} IRQn_Type;
使用庫函數(shù)進(jìn)行時(shí)鐘系統(tǒng)初始化配置
void NVIC_config()//配置中斷
{
NVIC_InitTypeDef NVIC_InitStructure;
//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//選擇中斷分組1
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//選擇串口1中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//搶占式中斷優(yōu)先級(jí)設(shè)置為0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//響應(yīng)式中斷優(yōu)先級(jí)設(shè)置為3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中斷
NVIC_Init(&NVIC_InitStructure);
}
四、相關(guān)庫函數(shù)解析
1、庫中所涉及到的結(jié)構(gòu)體
typedef struct
{
uint8_t NVIC_IRQChannel; /*!< Specifies the IRQ channel to be enabled or disabled.
This parameter can be a value of @ref IRQn_Type (For the
complete STM32 Devices IRQ Channels list, please refer to
stm32f10x.h file) */
uint8_t NVIC_IRQChannelPreemptionPriority; /*!< Specifies the pre-emption priority for the
IRQ channel specified in NVIC_IRQChannel. This parameter
can be a value between 0 and 15 as described in the table @ref
NVIC_Priority_Table */
uint8_t NVIC_IRQChannelSubPriority; /*!< Specifies the subpriority level for the IRQ channel
specified in NVIC_IRQChannel. This parameter can be a value
between 0 and 15 as described in the table @ref
NVIC_Priority_Table */
FunctionalState NVIC_IRQChannelCmd; /*!< Specifies whether the IRQ channel defined in
NVIC_IRQChannel will be enabled or disabled.
This parameter can be set either to ENABLE or DISABLE */
} NVIC_InitTypeDef;
2、庫函數(shù)解析
在misc.h中:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);//對(duì)優(yōu)先級(jí)分組進(jìn)行配置
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);//根據(jù)中斷結(jié)構(gòu)體的值初始化中斷
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);//設(shè)置向量表的位置和
偏移
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState); //選擇系
統(tǒng)進(jìn)入低功耗模式的條件
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);//系統(tǒng)滴答時(shí)鐘源的配置
在core_cm3.h中:
uint32_t __get_BASEPRI(void);//Return the Base Priority value
void __set_BASEPRI(uint32_t basePri);//Set the Base Priority value
uint32_t __get_PRIMASK(void);//Return the Priority Mask value
void __set_PRIMASK(uint32_t priMask);//Set the Priority Mask value
uint32_t __get_FAULTMASK(void);//Return the Fault Mask value
void __set_FAULTMASK(uint32_t faultMask);//Set the Fault Mask value
uint32_t __get_CONTROL(void);//Return the Control Register value
void __set_CONTROL(uint32_t control);//Set the Control Register value
void NVIC_SetPriorityGrouping(uint32_t PriorityGroup);
uint32_t NVIC_GetPriorityGrouping(void);
void NVIC_EnableIRQ(IRQn_Type IRQn);
void NVIC_DisableIRQ(IRQn_Type IRQn);
uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn);
void NVIC_SetPendingIRQ(IRQn_Type IRQn);
void NVIC_ClearPendingIRQ(IRQn_Type IRQn);
uint32_t NVIC_GetActive(IRQn_Type IRQn);
void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority);
uint32_t NVIC_GetPriority(IRQn_Type IRQn);
uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority);
void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority);
五、實(shí)例詳解
void NVIC_config()//配置中斷
{
NVIC_InitTypeDef NVIC_InitStructure;
//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//選擇中斷分組1
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//選擇串口1中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//搶占式中斷優(yōu)先級(jí)設(shè)置為0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//響應(yīng)式中斷優(yōu)先級(jí)設(shè)置為3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中斷
NVIC_Init(&NVIC_InitStructure);
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |