zoukankan      html  css  js  c++  java
  • 06、外部中断

    中断意味着中途打断现在干的事情,紧急处理其他事情

    NVIC(内嵌向量中断控制器)特性

    无论是 ARM Cortex M0/M3/M4 还是 ARM Cortex-A8/A53/A72/A73 等等内核,都有 NVIC。
    STM32F405xx/07xx和STM32F415xx/17xx 具有82个可屏蔽(能够通过代码进行开和关中断)中断通道,10个不可屏蔽(无法通过代码关闭该中断)的中断,16 个可编程优先级。
    向量意味就是中断源。
    向量表,也就是中断源表。
    

    外部中断/事件控制器 (EXTI)

    多达 140 个 GPIO(STM32F405xx/07xx 和 STM32F415xx/17xx)通过以下方式连接到 16 个外部中断/事件线,另外七根 EXTI 线连接方式如下:
    ● EXTI 线 16 连接到 PVD 输出
    ● EXTI 线 17 连接到 RTC 闹钟事件
    ● EXTI 线 18 连接到 USB OTG FS 唤醒事件
    ● EXTI 线 19 连接到以太网唤醒事件
    ● EXTI 线 20 连接到 USB OTG HS(在 FS 中配置)唤醒事件
    ● EXTI 线 21 连接到 RTC 入侵和时间戳事件
    ● EXTI 线 22 连接到 RTC 唤醒事件
    

    声明变量:

    static GPIO_InitTypeDef GPIO_InitStruct;
    static EXTI_InitTypeDef EXTI_InitStruct;
    static NVIC_InitTypeDef NVIC_InitStruct;
    

    使能系统配置的硬件时钟,就是供电

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    

    选择对应的 GPIO 引脚连接到相应的中断控制线

    将PA0引脚连接到外部中断0,作为它的输入引脚
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);
    

    根据 EXTI_InitTypeDef 结构体进行外部中断控制线 0 初始化

    EXTI_InitStruct.EXTI_Line = EXTI_Line0;//外部中断0
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//产生中断
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发(只要按键按下,就通知CPU紧急处理该事件,跳转到中断服务函数,并由中断服务函数进行处理)触发方式(下降沿、上升沿、双边沿)
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;//使能外部中断0工作,允许触发中断
    EXTI_Init(&EXTI_InitStruct);//初始化
    

    根据 NVIC_InitTypeDef 结构体对中断向量进行配置

    //配置外部中断0的优先级
    NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;//外部中断0
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02;//响应优先级
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使优先级生效
    NVIC_Init(&NVIC_InitStruct);
    

    中断优先级的一个意义:出现多个中断同时触发,但是不能同时处理,所以 先后顺序之分,要根据实际上的运行环境优先处理重要的中断。

    a.概述
    STM32 对中断进行分组,共 5 组,组 0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级级。

    / **
    * @brief Configures the priority grouping: pre-emption priority and subpriority.
    * @param NVIC_PriorityGroup: specifies the priority grouping bits length.
    * This parameter can be one of the following values:
    * @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority //没有抢占优先级
    *                            4 bits for subpriority //4 位设置响应优先级,能设置 16 个抢占优先级
    * @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority //1 位抢占优先级,能设置 2 个抢占优先级
    *                            3 bits for subpriority //3 位响应优先级,能设置 8 个响应优先级
    * @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority //2 位抢占优先级,能设置 4 个抢占优先级
    *                            2 bits for subpriority //2 位响应优先级,能设置 4 个响应优先级
    * @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority //3 位抢占优先级,能设置 8 个抢占优先级
    *                            1 bits for subpriority //1 位响应优先级,能设置 2 个抢占优先级
    * @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority //4 位抢占优先级,能设置 16 个抢占优先级
    *                            0 bits for subpriority //没有响应优先级
    * @note When the NVIC_PriorityGroup_0 is selected, IRQ pre-emption is no more possible.
    *       The pending IRQ priority will be managed only by the subpriority.
    * @retval None
    **/
    void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
    

    抢占优先级与响应优先级区别

    1)高抢占优先级是可以打断正在进行的低抢占优先级的中断。
    2)抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
    3)抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
    4)抢占优先级相同且响应优先级相同的中断,假如同时发生,会按照硬件内部固定的优先级执行,如下图。
    5)无论是抢占优先级还是响应优先级,优先级数值越小,就代表优先级越高。
    

    优先级分组只能在开始的时候初始化一次,中途在进行优先级分组会造成分组管理混乱

  • 相关阅读:
    模板template用法
    关联式容器MAP的用法----类似与python中的dict
    迭代器iterator
    c++中的vertor
    Git操作(git reset & get revert)
    代码度量标准
    __attribute__关键字
    Centos7.2部署.Net Core2.0 WebApi
    通过nginx 访问 centos 7 服务器上的.Net Core
    ASP.NET Core部署到CentOS7,使用Nginx代理
  • 原文地址:https://www.cnblogs.com/lp06/p/11848400.html
Copyright © 2011-2022 走看看