STM32初识中断

  • Post author:
  • Post category:其他
                                                                                                
NVIC结构体定义在core_cm3.c之中
typedef struct
{
  __IO uint32_t ISER[8];                //中断使能寄存器     
       uint32_t RESERVED0[24];                                   
  __IO uint32_t ICER[8];                //中断清除寄存器
       uint32_t RSERVED1[24];                                    
  __IO uint32_t ISPR[8];                //中断使能悬起寄存器
       uint32_t RESERVED2[24];                                   
  __IO uint32_t ICPR[8];                //中断清除悬起寄存器
       uint32_t RESERVED3[24];                                   
  __IO uint32_t IABR[8];               // 中断有效位寄存器 
       uint32_t RESERVED4[56];                                   
  __IO uint8_t  IP[240];               //中断优先级寄存器(8位)
       uint32_t RESERVED5[644];                                  
  __O  uint32_t STIR;               //软件触发中断寄存器
}  NVIC_Type;   

优先级定义

1)主优先级(抢占优先级)>子优先级
注:当多个中断同时到来,首先比较主优先级(抢占优先级),主优先级(抢占优先级)越小越先执行,当主优先级(抢占优先级)相同时,比较子优先级,子优先级越小,越先执行,
 
    若主优先级(抢占优先级)和子优先级都相同时,则比较硬件中断编号(查看中文参考手册9.1.2,如下图,当子优先级和主优先级相同时,EXT1线0中断此时优先级最高)
2)优先级分组
3)中断优先级库函数Preemption_Priority_Group()
 NVIC_PriorityGroup_0       /*!< 0 bits for抢占优先级
                                                            4 bits for 子优先级 */
 NVIC_PriorityGroup_1       /*!< 1 bits for抢占优先级
                                                            3 bits for 子优先级*/
 NVIC_PriorityGroup_2       /*!< 2 bits for抢占优先级
                                                            2 bits for 子优先级 */
 NVIC_PriorityGroup_3        /*!< 3 bits for 抢占优先级
                                                            1 bits for 子优先级*/
 NVIC_PriorityGroup_4       /*!< 4 bits for抢占优先级
                                                            0 bits for 子优先级 */
//设置优先级分组
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
 
  SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}
中断编程
1)使能中断请求(每个外设的相关中断使能位控制)
2)配置中断优先级分组
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)   // NVIC_PriorityGroup_0 1                                                                                                                                    //2      3 4
3)配置NVIC寄存器,初始化NVIC_InitTypedef
NVIC_IRQChannel                    //中断源(取值从stm32f10x.h中寻找)
NVIC_IRQChannelPreemptionPriority  //主优先级  (根据分组配置)
NVIC_IRQChannelSubPriority          //子优先级
NVIC_IRQChannelCmd                    //使能或者失能
NVIC_Init();
4)编写中断服务函数
  中断服务函数名称:必须与启动文件startup_stm32f10x_hd.s中预先设置的一样,如果写错,系统就在中断向量表中找不到中断函数的入口,会直接跳到启动文件中预先写好的空函数中无限循环,实现不了中断.
    名称格式如下表:

版权声明:本文为qq_54529723原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。