• 【STM32HAL库】外部中断


    目录

    一、中断简介

    二、NVIC

    1.寄存器

    2.工作原理

    3.优先级

    4.使用NVIC

    三、EXTI

    1.简介

    2.AFIO:复用功能IO,主要用于重映射和外部中断映射配置​编辑

    3. 中断使用

     4.HAL库配置使用


    一、中断简介

    中断的意义:高效处理紧急程序,不会一直占用CPU资源

     NVIC:嵌套向量中断控制器,属于内核,支持256个中断(16内核,240外部),支持256个优先级,允许裁剪为16个(ST的)

    中断向量表:定义一块固定的内存,以四字节对齐,存放在各个中断服务函数程序的首地址,定义在启动文件中

    二、NVIC

    1.寄存器

    2.工作原理

    3.优先级

    优先级:一般一个工程中只进行一次优先级分组就行,否则可能会导致优先级混乱,如果真的设置了多次,那就会以最后一次设置为准

    注意:NVIC的函数都存放在cortex.c里面

    4.使用NVIC

    三、EXTI简介

    EXTI:外部(扩展)中断事件控制器,F1包含20个产生事件/中断请求的边沿检测器,即F120EXTI线

    中断:进NVIC,有服务函数,需要CPU处理

    事件:不进NVIC,仅用于内部硬件自动控制的,如TIMDMAADC

    2.AFIO:复用功能IO,主要用于重映射和外部中断映射配置

    3. 中断使用流程

     4.HAL库配置使用步骤

    四、HAL库实现

    利用按键进行中断的实现,由图,按键是外部下拉了,所以配置下拉输入,然后中断触发方式可以配置为上升沿触发

    与标准库不同的是,这个触发方式是直接可以用GPIO结构体直接配置

    回调函数是已经被库弱定义了,我们直接再次定义一下就行,但是不用我们去声明

    1. #ifndef __EXTI_H
    2. #define __EXTI_H
    3. #include "./SYSTEM/sys/sys.h"
    4. void EXTI_Init(void);
    5. #endif
    1. #include "exti.h"
    2. void EXTI_Init(void)
    3. {
    4. //开启时钟
    5. __HAL_RCC_GPIOA_CLK_ENABLE();
    6. __HAL_RCC_GPIOC_CLK_ENABLE();
    7. __HAL_RCC_AFIO_CLK_ENABLE();
    8. //初始化结构体
    9. GPIO_InitTypeDef GPIO_Init;
    10. GPIO_Init.Pin = GPIO_PIN_0;
    11. GPIO_Init.Mode=GPIO_MODE_IT_RISING;//设置为上升沿触发中断
    12. GPIO_Init.Pull = GPIO_PULLDOWN;//外部下拉
    13. HAL_GPIO_Init(GPIOA,&GPIO_Init);
    14. GPIO_Init.Pin = GPIO_PIN_13;
    15. HAL_GPIO_Init(GPIOC,&GPIO_Init);
    16. HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);//优先级分组
    17. HAL_NVIC_SetPriority(EXTI0_IRQn,0, 1);//配置优先级
    18. HAL_NVIC_SetPriority(EXTI15_10_IRQn,0, 2);
    19. HAL_NVIC_EnableIRQ(EXTI0_IRQn);//使能中断
    20. HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
    21. }
    22. void EXTI15_10_IRQHandler(void)//中断服务函数
    23. {
    24. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);//HAL库中断处理共用函数
    25. }
    26. void EXTI0_IRQHandler()//中断服务函数
    27. {
    28. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);//HAL库中断处理共用函数
    29. }
    30. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//HAL库数据处理回调函数
    31. {
    32. if(GPIO_Pin==GPIO_PIN_13)
    33. {
    34. if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==1)//如果按键按下
    35. {
    36. HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);//翻转电平
    37. }
    38. }
    39. if(GPIO_Pin==GPIO_PIN_0)
    40. {
    41. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==1)
    42. {
    43. HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
    44. }
    45. }
    46. }
    1. #include "./SYSTEM/sys/sys.h"
    2. #include "./SYSTEM/usart/usart.h"
    3. #include "./SYSTEM/delay/delay.h"
    4. #include "led.h"
    5. #include "key.h"
    6. #include "exti.h"
    7. int main(void)
    8. {
    9. HAL_Init(); /* 初始化HAL库 */
    10. sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
    11. delay_init(72); /* 延时初始化 */
    12. LED_Init(); /* LED初始化 */
    13. KEY_Init();
    14. EXTI_Init();
    15. while(1)
    16. {
    17. }
    18. }

  • 相关阅读:
    Flink-使用流批一体API统计单词数量
    vue2插件
    【面试刷题】——C++虚函数原理
    数据结构计算二叉树的深度和节点个数
    使用hash和history实现前端历史状态切换,触发事件驱动函数来完成部分数据的加载(使用hash和history实现前端路由切换,含完整源码+注释)
    企业应用架构研究系列二十六:信号量SemaphoreSlim与Semaphore
    MSDC 4.3 接口规范(15)
    CRC16计算FC(博途SCL语言)
    AtCoder Grand Contest 058 B Adjacent Chmax
    Java基础面试题
  • 原文地址:https://blog.csdn.net/2301_79330491/article/details/137960533