• 按键中断控制LED灯亮灭


    EXTI—外部中断/事件控制器

    EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20 个中断/事 件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的 检测。EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触 发事件的属性

     

    EXTI 功能框

     

    中断/事件线

    硬件设计:

    软件设计:

    创建两个文件Key.c和Key.h,用来存放按键驱动程序即相关宏定义。

    编程要点:

    (1)初始化用来产生中断的GPIO。
    (2)初始化EXTI。
    (3)配置NVIC。
    (4)编写中断服务函数。

    Key.c文件

    1. #include "Key.h"
    2. #include "Led.h"
    3. void Key_Init(void)
    4. {
    5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); //开启GPIOE时钟
    6. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启AFIO时钟
    7. GPIO_InitTypeDef GPIO_InitStruct;
    8. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
    9. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4; //引脚4
    10. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    11. GPIO_Init(GPIOE,&GPIO_InitStruct);
    12. GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4); //选择外部中断线 AFIO
    13. EXTI_InitTypeDef EXIT_InitStruct; //定义外部中断结构体
    14. EXIT_InitStruct.EXTI_Line = EXTI_Line4; //选择外部中断线
    15. EXIT_InitStruct.EXTI_LineCmd = ENABLE; //使能外部中断
    16. EXIT_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
    17. EXIT_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
    18. EXTI_Init(&EXIT_InitStruct); //初始化外部中断
    19. /*配置NVIC为优先级组*/
    20. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVIC
    21. NVIC_InitTypeDef NVIC_InitStruct;
    22. NVIC_InitStruct.NVIC_IRQChannel = EXTI4_IRQn; /*配置中断源:按键0*/
    23. NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    24. NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; /*配置抢占优先级:1*/
    25. NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; /*配置子优先级:1*/
    26. NVIC_Init(&NVIC_InitStruct);
    27. }
    28. void Key1_Init(void)
    29. {
    30. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
    31. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启AFIO时钟
    32. GPIO_InitTypeDef GPIO_InitStruct;
    33. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
    34. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
    35. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    36. GPIO_Init(GPIOE,&GPIO_InitStruct);
    37. GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3); ///*选择EXTI的信号源*/
    38. EXTI_InitTypeDef EXIT_InitStruct; //定义外部中断结构体
    39. EXIT_InitStruct.EXTI_Line = EXTI_Line3; //选择外部中断线
    40. EXIT_InitStruct.EXTI_LineCmd = ENABLE; //使能外部中断
    41. EXIT_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
    42. EXIT_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
    43. EXTI_Init(&EXIT_InitStruct); //初始化外部中断
    44. /*配置NVIC为优先级组*/
    45. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVIC
    46. NVIC_InitTypeDef NVIC_InitStruct;
    47. NVIC_InitStruct.NVIC_IRQChannel = EXTI3_IRQn; /*配置中断源:按键1*/
    48. NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    49. NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; /*配置抢占优先级:1*/
    50. NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2; /*配置子优先级:2*/
    51. NVIC_Init(&NVIC_InitStruct);
    52. }
    53. void EXTI4_IRQHandler(void)
    54. {
    55. /*确认是否产生了EXTI Line中断*/
    56. if(EXTI_GetITStatus(EXTI_Line4) != RESET)
    57. {
    58. LED_ON(); //按键按下灯亮
    59. //清除中断标志位
    60. EXTI_ClearITPendingBit(EXTI_Line4);
    61. }
    62. }
    63. void EXTI3_IRQHandler(void)
    64. {
    65. if(EXTI_GetITStatus(EXTI_Line3) != RESET) //不等于0条件为真
    66. {
    67. LED_OFF(); //按键按下灯灭
    68. EXTI_ClearITPendingBit(EXTI_Line3);
    69. }

    Key.h文件

    1. #ifndef __KEY_H
    2. #define __KEY_H
    3. #include "stm32f10x.h" // Device header
    4. void Key_Init(void);
    5. void Key1_Init(void);
    6. #endif

    Led.c文件

    1. #include "Led.h"
    2. void LED_Init(void)
    3. {
    4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
    5. GPIO_InitTypeDef GPIO_InitStructure;
    6. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
    7. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    8. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    9. GPIO_Init(GPIOE, &GPIO_InitStructure);
    10. GPIO_SetBits(GPIOE, GPIO_Pin_5);
    11. }
    12. void LED_ON() //灯亮
    13. {
    14. GPIO_ResetBits(GPIOE, GPIO_Pin_5);
    15. }
    16. void LED_OFF() //灯灭
    17. {
    18. GPIO_SetBits(GPIOE, GPIO_Pin_5);
    19. }

    Led.h文件

    1. #ifndef __LED_H
    2. #define __LED_H
    3. #include "stm32f10x.h" // Device header
    4. void LED_Init(void);
    5. void LED_ON(void);
    6. void LED_OFF(void);
    7. #define LED1_TOGGLE {GPIOE->ODR ^=GPIO_Pin_5;} //绿灯状态翻转 异或操作
    8. #endif

    main.c文件

    1. #include "stm32f10x.h" // Device header
    2. #include "Led.h"
    3. #include "Key.h"
    4. int main(void)
    5. {
    6. LED_Init();
    7. Key_Init();
    8. Key1_Init();
    9. while(1)
    10. {
    11. }
    12. }

  • 相关阅读:
    TCP和UDP TCP如何保证可靠数据传输的
    android Handler
    Mysql技术文档--慢mysql的优化--工作流--按步排查
    俄罗斯方块
    开启 Keep-Alive 可能会导致http 请求偶发失败
    在Linux上安装Oracle相关产品,常用文件的默认路径
    《Terraform 101 从入门到实践》 Functions函数
    求数组第k小/大的序列和
    飞天+CIPU体为元宇宙带来更大想象空间
    element ui级联选择器数据处理
  • 原文地址:https://blog.csdn.net/m0_69211839/article/details/133973954