• STM32F4x_中断配置


    STM32F104x – 中断配置小结

    学习目标: 实现 “中断分组设置 + 中断优先级管理”;

    • 1.系统运行开始的时候设置中断分组。确定组号,也就是确定抢占优先级和响应优先级
      的分配位数。调用函数为 NVIC_PriorityGroupConfig();
    • 2.设置所用到的中断的中断优先级别。对每个中断调用函数为 NVIC_Init();

    学习内容:

    NVIC 中断管理函数主要在 misc.c 文件里面
    
    • 1

    1.1 中断分组配置

    void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
    {
     	assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
     	SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;                       //过设置 SCB->AIRCR 寄存器来设置中断优先级分组
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 拆解分析:双击选中函数体里面的“IS_NVIC_PRIORITY_GROUP”然后右键“Go to defition of …”可以查看入口参数结构体
    #define IS_NVIC_PRIORITY_GROUP(GROUP)                      \\分组范围0-4
    (((GROUP) == NVIC_PriorityGroup_0) || 
    ((GROUP) == NVIC_PriorityGroup_1) || \
    ((GROUP) == NVIC_PriorityGroup_2) || \
    ((GROUP) == NVIC_PriorityGroup_3) || \
    ((GROUP) == NVIC_PriorityGroup_4))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • Example:设置系统中断分组优先级为3
    NVIC_PriorityGroupConfig(NVIC_PriortyGroup_2);       // 可屏蔽中断的IP寄存器组的高四位中,最高3位是抢占优先级,低1位是响应优先级
    
    • 1

    1AIRCR 中断分组设置表

    • 中断优先级规则:抢占优先级 > 响应优先级 , 且数值越小所代表的优先级就越高。

    ❗注意:

    1.如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
    2.高优先级的抢占可以打断正在进行的低优先级抢占中断;而抢占优先级相同的中断,高优先级的响应不可以打断低优先级响应的中断。

    1.2 中断优先级管理

    void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);              //中断初始化函数
    
    • 1
    • NVIC_InitTypeDef结构体解析
     typedef struct
    {
     	 uint8_t NVIC_IRQChannel;                       //在 stm32f10x.h 中找到每个中断对应的名字。例如 USART1_IRQn
    	 uint8_t NVIC_IRQChannelPreemptionPriority;     //定义这个中断的抢占优先级别;
     	 uint8_t NVIC_IRQChannelSubPriority;            //定义这个中断的(响应优先级子优先级别)
     	 FunctionalState NVIC_IRQChannelCmd;            //该中断通道是否使能
    } NVIC_InitTypeDef;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • Example:使能串口 1 的中断,同时设置抢占优先级为 1,响应优先级位 2,初始化的方法
    	NVIC_InitTypeDef NVIC_InitStructure;
    	NVIC_InitStructure.NVIC_IRQChannel  = USART1_IRQn;               //串口中断1
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;        //抢占优先级为1
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2//响应优先级为2
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                 //IRQ通道使能         
    	NVIC_Init(&NVIC_InitStructure);                                  //根据上面指定的参数初始化 NVIC 寄存器
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    基础回顾:

    CM4 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有256 级的可编程中断设置。但 STM32F4 并没有使用 CM4 内核的全部东西,STM32F40xx/STM32F41xx 总共有 92 个中断。
    STM32F40xx/STM32F41xx 的 92 个中断里面,包括 10 个内核中断和 82 个可屏蔽中断,具有 16 级可编程的中断优先级,而我们常用的就是这 82 个可屏蔽中断。

    MDK内与NVIC相关寄存器结构体定义如下:

    typedef struct
    {
     	__IO uint32_t ISER[8]; /*!< Interrupt Set Enable Register */
    	 	uint32_t RESERVED0[24];
     	__IO uint32_t ICER[8]; /*!< Interrupt Clear Enable Register */
    		 uint32_t RSERVED1[24];
    	 __IO uint32_t ISPR[8]; /*!< Interrupt Set Pending Register */
    		 uint32_t RESERVED2[24];
    	 __IO uint32_t ICPR[8]; /*!< Interrupt Clear Pending Register */
     		uint32_t RESERVED3[24];
     	__IO uint32_t IABR[8]; /*!< Interrupt Active bit Register */
     		uint32_t RESERVED4[56];
     	__IO uint8_t IP[240]; /*!< Interrupt Priority Register, 8Bit wide */
     		uint32_t RESERVED5[644];
     	__O uint32_t STIR; /*!< Software Trigger Interrupt Register */
    } NVIC_Type;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • ISER[8]:Interrupt Set-Enable Registers 中断使能寄存器组 ,你要使能某个中断,必须设置相应的 ISER 位为1;
    • ICER[8]:Interrupt Clear-Enable Registers 中断除能寄存器组,作用与ISER 相反,用来清除某个中断的使能的;
    • ISPR[8]:Interrupt Set-Pending Registers 中断挂起控制寄存器组,通过置 1可以将正在进行的中断挂起,而执行同级或更高级别
      的中断。写 0 是无效的;
    • ICPR[8]:Interrupt Clear-Pending Registers 中断解挂控制寄存器组,作用与 ISPR 相反,置 1,可以将挂起的中断解挂,写 0 无效;
    • IABR[8]:Interrupt Active Bit Registers 中断激活标志位寄存器组 ,对应位置 1,表示该位所对应的中断正在执行。通过它可以知道当前在执行的中断是哪一个,在中断执行完了由硬件自动清零。
    • ❗ IP[240]:Interrupt Priority Registers 中断优先级控制的寄存器组,IP[81]~IP[0]分别对应中断 81~0,可屏蔽中断占用的 8bit 并没有全部使用,而是只用了高 4 位。这 4 位,又分为抢占优先级和响应优先级。抢占优先级在前,响应优先级在后。
  • 相关阅读:
    Flutter——加载图片的多样玩法
    哪个牌子的台灯对孩子的视力好?对孩子视力好的台灯推荐分享
    python经典百题之字符串连接
    「Paraverse平行云」受邀参与编写国内首个3D数字内容生产技术白皮书
    2018 国际AIOps挑战赛单指标数据集分析
    调用ros系统摄像头可视化rqt工具
    网页制作课作业简单的学生网页作业源码 基于html css javascript jquery仿慕课网教学培训网站设计实例 企业网站制作
    Unity Rain Ai 插件的使用入门
    xxxxxxx
    算法导论第一章——算法在计算中的应用
  • 原文地址:https://blog.csdn.net/mido94/article/details/126492107