• stm32外部中断


    /*出处:【keysking的stm32教程】 第6集 狂飙STM32中断_哔哩哔哩_bilibili*/

    今天先是改了个一直以来的认知错误,跑马灯不用电平反转需要两次delay,不然第二次翻转就出现问题了。。。算是白学了,哈哈哈哈。

    1. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
    2. HAL_Delay(500);
    3. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
    4. HAL_Delay(500);

    为了及时处理高优先级事件stm32引入了中断机制,这里我们做一个实验,按下按键之后让PC13小灯熄灭,平时保持常亮。

    ①PC13设置普通输出(我这个灯IO口输出低电平点亮)

    ②按键对应的PB14设置GPIO_EXIT

    ③选择合适的中断触发模式

    从上往下依次是:上升沿触发中断、下降沿触发中断、电平上升下降都触发中断;

    我手上这块板子按下按键PB14捕获低电平,所以选择下降沿触发。

    ④设置NVIC中断控制器,勾选开启中断向量EXIT[15:10]

    ⑤再次生成代码打开ide发现CubeMX帮我们自动生成了这个中断处理函数

    增加翻转PC13电平的代码

    基本功能实现了,但是还没按键消抖,从原理图上看我这个板子根本没滤波电容。直接在中断里面使用阻塞式延时是个危险动作!所以这里调整一下滴答计时器中断和按键触发中断优先级顺序。

    最终代码:

    1. /**
    2. * @brief This function handles EXTI line[15:10] interrupts.
    3. */
    4. void EXTI15_10_IRQHandler(void)
    5. {
    6. /* USER CODE BEGIN EXTI15_10_IRQn 0 */
    7. HAL_Delay(10);
    8. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14)==GPIO_PIN_RESET)
    9. {
    10. HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
    11. }
    12. /* USER CODE END EXTI15_10_IRQn 0 */
    13. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);
    14. /* USER CODE BEGIN EXTI15_10_IRQn 1 */
    15. /* USER CODE END EXTI15_10_IRQn 1 */
    16. }

    深入讨论中断机制:

    ①从单片机引脚进入的高低电平信号首先由输入驱动器处理。

    ②经过输入驱动器处理过的高低电平信号会进入到边缘检测电路,当它捕获到我们设置的边沿信号后,就会向请求挂起寄存器输出一个高电平信号,请求挂起寄存器对应的位置会置1。

    ③只要我们提前开启了对应中断,请求挂起寄存器的信号就可以进入到NVIC(嵌套向量中断控制器),NVIC会找到此中断线对应的中断向量(可以理解为中断向量中存放着指针,这些指针中存放着处理事件函数的地址),并且执行相应的中断处理函数,中断处理函数会清除请求挂起寄存器(CubeMX自动处理了这个部分),以防止中断重复触发。

    1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    2. {
    3. /* EXTI line interrupt detected */
    4. if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)
    5. {
    6. __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    7. HAL_GPIO_EXTI_Callback(GPIO_Pin);
    8. }
    9. }

    ④中断优先级规定多中断的执行次序,中断优先级又分为抢占优先级响应优先级,优先级的数字越小则代表优先级越高。Priority Group选项可以选定这两者的位数。

    两中断同时发生时,先比较抢占优先级;若抢占优先级相同,在比较响应优先级;

    某中断正在执行中,另一中断突然发生,则只比较两者抢占优先级。一般情况下建议使用抢占优先级即可。

  • 相关阅读:
    1004. 最大连续1的个数III(滑动窗口)
    MySQL中B+树的一道面试题,90%的候选人回答错误
    05. Java多线程机制
    Vue基础学习概念
    Mask Transfiner for High-Quality Instance Segmentation
    SpringBoot_整合Mybatis
    Rethinking LiDAR Object Detection in adverse weather conditions
    雷达电子战的基本内容 (02)
    深度神经网络 英语,深度神经网络英文
    Linux权限管理— 文件特殊权限SetUID
  • 原文地址:https://blog.csdn.net/qq_59757948/article/details/138177189