久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4226|回復: 0
打印 上一主題 下一主題
收起左側

STM32 的嵌套中斷系統

[復制鏈接]
跳轉到指定樓層
樓主
ID:72519 發表于 2015-1-23 03:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一、綜述:

1STM32 (Cortex-M3) 中的優先級概念

    STM32(Cortex-M3)中有兩個優先級的概念:搶占式優先級響應優先級,也把響應優先級稱作亞優先級副優先級,每個中斷源都需要被指定這兩種優先級。

1. 何為占先式優先級(pre-emption priority)

    高占先式優先級的中斷事件會打斷當前的主程序/中斷程序運行搶斷式優先響應,俗稱中斷嵌套。

2. 何為副優先級(subpriority)

    在占先式優先級相同的情況下,高副優先級的中斷優先被響應;

    在占先式優先級相同的情況下,如果有低副優先級中斷正在執行,高副優先級的中斷要等待已被響應的低副優先級中斷執行結束后才能得到響應非搶斷式響應(不能嵌套)

3. 判斷中斷是否會被響應的依據

    首先是占先式優先級,其次是副優先級;

    占先式優先級決定是否會有中斷嵌套;

    ResetNMIHard Fault 優先級為負(高于普通中斷優先級)且不可調整。

4. 優先級沖突的處理

    具有高搶占式優先級的中斷可以在具有低搶占式優先級的中斷處理過程中被響應,即中斷的嵌套,或者說高搶占式優先級的中斷可以嵌套低搶占式優先級的中斷。

    當 兩個中斷源的搶占式優先級相同時,這兩個中斷將沒有嵌套關系,當一個中斷到來后,如果正在處理另一個中斷,這個后到來的中斷就要等到前一個中斷處理完之后 才能被處理。如果這兩個中斷同時到達,則中斷控制器根據他們的響應優先級高低來決定先處理哪一個;如果他們的搶占式優先級和響應優先級都相等,則根據他們 在中斷表中的排位順序決定先處理哪一個。

5. Cortex-M3中對中斷優先級的定義

    既然每個中斷源都需要被指定這兩種優先級,就需要有相應的寄存器位記錄每個中斷的優先級;在Cortex-M3中定義了8個比特位用于設置中斷源的優先級,這8個比特位可以有8種分配方式,如下:

所有8位用于指定響應優先級
最高1位用于指定搶占式優先級,最低7位用于指定響應優先級
最高2位用于指定搶占式優先級,最低6位用于指定響應優先級
最高3位用于指定搶占式優先級,最低5位用于指定響應優先級
最高4位用于指定搶占式優先級,最低4位用于指定響應優先級
最高5位用于指定搶占式優先級,最低3位用于指定響應優先級
最高6位用于指定搶占式優先級,最低2位用于指定響應優先級
最高7位用于指定搶占式優先級,最低1位用于指定響應優先級

這就是優先級分組的概念。

6. stm32中對中斷優先級的定義

    Cortex-M3允許具有較少中斷源時使用較少的寄存器位指定中斷源的優先級,因此STM32把指定中斷優先級的寄存器位減少到4,這4個寄存器位的分組方式如下:

0組:所有4位用于指定響應優先級
1組:最高1位用于指定搶占式優先級,最低3位用于指定響應優先級
2組:最高2位用于指定搶占式優先級,最低2位用于指定響應優先級
3組:最高3位用于指定搶占式優先級,最低1位用于指定響應優先級
4組:所有4位用于指定搶占式優先級

    AIRC(Application Interrupt and Reset Register)寄存器中有用于指定優先級的 4 bits。這4bits用于分配preemption優先級和sub優先級,在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 */
   
可以通過調用STM32的固件庫中的函數NVIC_PriorityGroupConfig()選擇使用哪種優先級分組方式,這個函數的參數有下列5種:

NVIC_PriorityGroup_0 => 選擇第0
NVIC_PriorityGroup_1 =>
選擇第1
NVIC_PriorityGroup_2 =>
選擇第2
NVIC_PriorityGroup_3 =>
選擇第3
NVIC_PriorityGroup_4 =>
選擇第4

    接下來就是指定中斷源的優先級,下面以一個簡單的例子說明如何指定中斷源的搶占式優先級和響應優先級:

// 選擇使用優先級分組第1
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

//定義NVIC的結構體變量

NVIC_InitTypeDef  NVIC_InitStructure;
//
使能EXTI0中斷
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQ
;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
//
指定搶占式優先級別1

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定響應優先級別0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//
使能EXTI9_5中斷

NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQ
;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//指定搶占式優先級別0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //
指定響應優先級別
1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

-------------------------------------------------------------------------------

    要注意的幾點是:

    1. 如果指定的搶占式優先級別或響應優先級別超出了選定的優先級分組所限定的范圍,將可能得到意想不到的結果;

    2. 搶占式優先級別相同的中斷源之間沒有嵌套關系;

    3. 如果某個中斷源被指定為某個搶占式優先級別,又沒有其它中斷源處于同一個搶占式優先級別,則可以為這個中斷源指定任意有效的響應優先級別。

2、開關總中斷

    STM32/Cortex-M3中是通過改變CPU的當前優先級來允許或禁止中斷。

PRIMASK位:只允許NMIhard fault異常,其他中斷/異常都被屏蔽(當前CPU優先級=0)
FAULTMASK
位:只允許NMI,其他所有中斷/異常都被屏蔽(當前CPU優先級=-1)

    STM32固件庫中(stm32f10x_nvic.cstm32f10x_nvic.h) 定義了四個函數操作PRIMASK位和FAULTMASK位,改變CPU的當前優先級,從而達到控制所有中斷的目的。

下面兩個函數等效于關閉總中斷:

void NVIC_SETPRIMASK(void)

void NVIC_SETFAULTMASK(void)

下面兩個函數等效于開放總中斷:

void NVIC_RESETPRIMASK(void)

void NVIC_RESETFAULTMASK(void)

上面兩組函數要成對使用,但不能交叉使用。

例如:

第一種方法:

NVIC_SETPRIMASK()  //關閉總中斷 ,只允許NMIhard fault異常

NVIC_RESETPRIMASK()//開放總中斷

第二種方法:

NVIC_SETFAULTMASK()  //關閉總中斷 ,只允許NMI

NVIC_RESETFAULTMASK()//開放總中斷

常常使用:

 NVIC_SETPRIMASK();     // Disable Interrupts

NVIC_RESETPRIMASK();  // Enable Interrupts

可以用:

#define CLI()  __set_PRIMASK(1)  //關閉總中斷

#define SEI()  __set_PRIMASK(0)  //打開總中斷

來實現開關總中斷的功能。

二、寄存器介紹:

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;復位值:0

 uint32_t RESERVED0[24];//未定義的寄存器

  __IO uint32_t ICER[8]; /*Offset: 0x080 (R/W)Interrupt ClearEnable Register*/

//CLRENA:中斷0-239的除能寄存器;地址為:0xE000-E180——0xE000-E19C;復位值: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;復位值: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;復位值:0

       uint32_t RESERVED3[24]; //未定義的寄存器

  __IO uint32_t IABR[8]; /*Offset: 0x200 (R/W)Interrupt Active bit Register*/

//ACTIVE:中斷0-239的活動狀態寄存器;地址為:0xE000-E3000xE000-E31C復位值:0

       uint32_t RESERVED4[56]; //未定義的寄存器

__IO uint8_t  IP[240];/*Offset:0x300(R/W)Interrupt Priority Register(8Bit wide)*/

//中斷優先級寄存器陣列(8):中斷0-239的中斷優先級;

//地址為:0xE000-E400——0xE000-E4EF;復位值:0

uint32_t RESERVED5[644]; //未定義的寄存器

 __IO  uint32_t STIR; /* Offset: 0xE00 (R/W)Software Trigger Interrupt Register*/

//STIR:軟件觸發中斷寄存器(如寫入8則觸發中斷8的中斷)

//地址為:0xE000-EF00;復位值:-

}  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;復位值:0x410fc230

  __IO uint32_t ICSR;   /*Offset: 0x004(R/W)Interrupt Control and State Register*/

//ICSR:中斷控制及狀態寄存器;地址為:0xE000-ED04;復位值:0

  __IO uint32_t VTOR;  /*Offset: 0x008 (R/W)  Vector Table Offset Register*/

//VTOR:向量表偏移寄存器;地址為:0xE000-ED08;復位值:-

  __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*/

三、初始化設置

STM32中的NVIC設置的流程如下:

選擇NVIC的中斷分組:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //選擇中斷分組1

注意:優先級分組只能設置一次。

定義NVIC的結構體變量:NVIC_InitTypeDef  NVIC_InitStructure;

選擇要進行NVIC設置的模塊:

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //選擇串口1中斷

進行搶占式中斷優先級的設置:

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//搶占式中斷優先級設置為0

進行響應式中斷優先級的設置:

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//響應式中斷優先級設置為3

使能中斷:NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中斷

根據上述設置進行初始化:NVIC_Init(&NVIC_InitStructure);

注:NVIC_InitTypeDef的定義在misc.h中;NVIC的相關函數在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;

使用庫函數進行時鐘系統初始化配置

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;//搶占式中斷優先級設置為0

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//響應式中斷優先級設置為3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中斷

NVIC_Init(&NVIC_InitStructure);

}

四、相關庫函數解析

1、庫中所涉及到的結構體

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、庫函數解析

在misc.h中:

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);//對優先級分組進行配置

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);//根據中斷結構體的值初始化中斷

void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);//設置向量表的位置和

偏移

void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState); //選擇系

統進入低功耗模式的條件

void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);//系統滴答時鐘源的配置

在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)

 

五、實例詳解

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;//搶占式中斷優先級設置為0

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//響應式中斷優先級設置為3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中斷

NVIC_Init(&NVIC_InitStructure);

}

 

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产激情视频在线免费观看 | 精品久久久久久久久久久久久久 | 麻豆一区二区三区精品视频 | 91视视频在线观看入口直接观看 | av在线二区 | 亚洲高清成人在线 | 午夜精品视频在线观看 | 久久精品一区二区三区四区 | 亚洲欧美国产毛片在线 | 先锋av资源在线 | 国产一区二区电影网 | 午夜成人免费视频 | 免费高清av | 一级黄色影片在线观看 | 国产日韩欧美在线观看 | 国产精品99久久久久久www | 国产精品欧美精品日韩精品 | www.日日干 | 成人精品视频在线 | 99国产精品久久久 | 欧美高清视频在线观看 | 综合久久综合久久 | www成年人视频 | 亚洲免费视频播放 | av网站在线看 | 亚洲免费视频网址 | 81精品国产乱码久久久久久 | 涩在线 | 亚洲色欧美另类 | 999久久久国产精品 欧美成人h版在线观看 | 香蕉视频久久久 | 成人免费xxxxx在线视频 | 欧洲一区视频 | 日日操视频 | 麻豆精品一区二区三区在线观看 | 韩日视频在线观看 | 日韩毛片免费看 | 国产亚洲精品综合一区 | 久久国产精品一区二区 | 日本一区二区三区视频在线 | 波多野结衣一区二区三区 |