• STM32 多功能按键中断


    key1 开关实现led1亮灭,key2开关实现蜂鸣器开关,key3开关实现风扇开关

    main.c

    1. #include "uart.h"
    2. #include "key_it.h"
    3. #include "led.h"
    4. int main()
    5. {
    6. char c;
    7. char *s;
    8. uart4_init();//串口初始化
    9. all_led_init();
    10. key_it_config();
    11. fengshan_init();
    12. key3_it_config();
    13. while(1)
    14. {
    15. }
    16. return 0;
    17. }

     按键功能函数 

    1. #include"key_it.h"
    2. void key3_it_config()
    3. { RCC->MP_AHB4ENSETR |= (0x1<<5);
    4. //PF8
    5. GPIOF->MODER &= (~(0x3<<16));
    6. //PF8
    7. EXTI->EXTICR3 &= (~(0xFF<<0));
    8. EXTI->EXTICR3 |= (0x5<<0);
    9. //设置触发方式为下降沿触发EXTI_FTSR1
    10. EXTI->FTSR1 |= (0x1<<8);
    11. //设置EXTI事件触发不屏蔽 EXTI_IMR1
    12. EXTI->C1IMR1 |=(0x1<<8);
    13. GICD->IPRIORITYR[24] &= (~(0x1F<<19));
    14. GICD->ITARGETSR[24] &= (~(0x3<<16));
    15. GICD->ITARGETSR[24] |= (0x1<<16);
    16. }
    17. void key_it_config()
    18. {
    19. //RCC使能GPIOF时钟
    20. RCC->MP_AHB4ENSETR |= (0x1<<5);
    21. RCC->MP_AHB4ENSETR |= (0x1<<1);
    22. RCC->MP_AHB4ENSETR |= (0x1<<4);
    23. //设置PF9 PF7 PF8 GPIO_MODER输入
    24. //PF9
    25. GPIOF->MODER &= (~(0x3<<18));
    26. //PF7
    27. GPIOF->MODER &= (~(0x3<<14));
    28. GICD->ISENABLER[3] |= (0x1<<2); //PF8 98号中断
    29. //PB6 蜂鸣器
    30. GPIOB->MODER &= (~(0x3<<12));
    31. GPIOB->MODER |=(0x1<<12);
    32. GPIOB->OTYPER &=(~(0x1<<6));
    33. GPIOB->OSPEEDR &= (~(0x3<<12));
    34. GPIOB->PUPDR &= (~(0x3<<12));
    35. //设置PF9 PF7 PF8产生EXTI事件 EXTI_EXTICRx
    36. //PF7
    37. EXTI->EXTICR2 &= (~(0xFF<<24));
    38. EXTI->EXTICR2 |= (0x5<<24);
    39. //pF9
    40. EXTI->EXTICR3 &= (~(0xFF)<<8);
    41. EXTI->EXTICR3 |= (0x5<<8);
    42. //设置触发方式为下降沿触发EXTI_FTSR1
    43. EXTI->FTSR1 |= (0x7<<7);
    44. //设置EXTI事件触发不屏蔽 EXTI_IMR1
    45. EXTI->C1IMR1 |=(0x7<<7);
    46. //使能组0转发中断GICD_CTRL
    47. GICD->CTRL |=(0x1);
    48. //使能中断能转发到特定的CPU接口层
    49. GICD->ISENABLER[3] |= (0x1<<3); //PF9 99号中断
    50. GICD->ISENABLER[3] |= (0x1<<1); //PF7 97号中断
    51. //GICD_IPRIOITYR设置中断优先级
    52. GICD->IPRIORITYR[24] &= (~(0x1F)<<11);
    53. //PF9
    54. GICD->IPRIORITYR[24] &= (~(0x1F<<27));
    55. //设置当前中断被转发特定的CPU接口层GICO_ITARGETSRx
    56. GICD->ITARGETSR[24] &= (~(0x3<<8));
    57. GICD->ITARGETSR[24] |= (0x1<<8);
    58. GICD->ITARGETSR[24] &= (~(0x3<<24));
    59. GICD->ITARGETSR[24] |= (0x1<<24);
    60. //使能CPU可以处理组0转发的中断GICD_CTLR
    61. GICC->CTRL |= 0x1;
    62. //设置中断优先级掩码GICC_CTKR
    63. GICC->PMR |= (0x1F<<3);
    64. GICC->CTRL |= (0x1);
    65. }
    66. void fengshan_init()
    67. {
    68. RCC->MP_AHB4ENSETR |= (0x1<<4);
    69. //PB9
    70. GPIOE->MODER &= (~(0x3<<18));
    71. GPIOE->MODER |= (0x1<<18);
    72. GPIOE->OTYPER &=(~(0x1<<9));
    73. GPIOE->OSPEEDR &= (~(0x3<<18));
    74. GPIOE->PUPDR &= (~(0x3<<18));
    75. }

     头文件 key_it.h

    1. #ifndef __KEY_IT_H__
    2. #define __KEY_IT_H__
    3. #include "stm32mp1xx_exti.h"
    4. #include "stm32mp1xx_gic.h"
    5. #include "stm32mp1xx_gpio.h"
    6. #include "stm32mp1xx_rcc.h"
    7. void key_it_config();
    8. void key3_it_config();
    9. void fengshan_init();
    10. #endif

     led的功能函数 led.c

    1. #include"led.h"
    2. //延时函数
    3. void delay(int ms)
    4. {
    5. int i,j;
    6. for(i=0;i
    7. {
    8. for(j=0;j<2000;j++);
    9. }
    10. }
    11. //GPIO初始化
    12. void all_led_init()
    13. {
    14. //RCC使能
    15. RCC->MP_AHB4ENSETR |= (0x3<<20);
    16. //设置PE10 PF10 PE8为输出
    17. GPIOE->MODER &= (~(0x3<<20));
    18. GPIOE->MODER |= (0x1<<20);
    19. GPIOF->MODER &= (~(0x3<<20));
    20. GPIOF->MODER |= (0x1<<20);
    21. GPIOE->MODER &= (~(0x3<<16));
    22. GPIOE->MODER |= (0x1<<16);
    23. //设置推挽输出
    24. GPIOE->OTYPER &= (~(0x1<<10));
    25. GPIOF->OTYPER &= (~(0x1<<10));
    26. GPIOE->OTYPER &= (~(0x1<<8));
    27. //设置三个管脚低速输出
    28. GPIOE->OSPEEDR &= (~(0x3<<20));
    29. GPIOF->OSPEEDR &= (~(0x3<<20));
    30. GPIOE->OSPEEDR &= (~(0x3<<16));
    31. //设置三个管脚输出时无上拉电阻和下拉电阻
    32. GPIOE->PUPDR &= (~(0x3<<20));
    33. GPIOE->PUPDR &= (~(0x3<<20));
    34. GPIOE->PUPDR &= (~(0x3<<20));
    35. }

    中断处理函数实现do_irq.c

    1. #include "key_it.h"
    2. #include "led.h"
    3. extern void printf(const char *fmt, ...);
    4. unsigned int i = 0;
    5. int flag=0;
    6. void do_irq(void)
    7. {
    8. int irqno; //保存中断号
    9. irqno=GICC->IAR & 0x3FF;
    10. switch(irqno)
    11. {
    12. case 99://key1
    13. //按键1中断处理
    14. printf("key1\n");
    15. printf("key1 ID =%d\n",irqno);
    16. //LED亮
    17. if(flag==0)
    18. {
    19. GPIOE->ODR |=(0x1<<10);
    20. flag=1;
    21. //GPIOE.odr &=(~(0x1<<10));
    22. //GPIOE.odr &= (~(0x1<<8));
    23. }else
    24. {
    25. flag=0;
    26. GPIOE->ODR &=(~(0x1<<10));
    27. }
    28. //清除挂起中断标志位GICD_ICPENDRx
    29. GICD->ICPENDR[3] |=(0x1<<3);
    30. //清除中断触发标志位EXTI_FPR1
    31. EXTI->FPR1 |= (0x1<<9);
    32. break;
    33. case 97:
    34. //按键2中断处理
    35. printf("key2\n");
    36. printf("key2 ID =%d\n",irqno);
    37. if(flag==0)
    38. {
    39. GPIOB->ODR |=(0x1<<6);
    40. flag=1;
    41. }
    42. else
    43. {
    44. flag=0;
    45. GPIOB->ODR &= (~(0x1<<6));
    46. }
    47. //清除挂起中断标志位GICD_ICPENDRx
    48. GICD->ICPENDR[3] |=(0x1<<1);
    49. //清除中断触发标志位EXTI_FPR1
    50. EXTI->FPR1 |= (0x1<<7);
    51. break;
    52. case 98:
    53. //按键3中断处理
    54. printf("key3\n");
    55. printf("key3 ID =%d\n",irqno);
    56. if(flag==0)
    57. {
    58. GPIOE->ODR |=(0x1<<9);
    59. flag=1;
    60. }
    61. else
    62. {
    63. flag=0;
    64. GPIOE->ODR &= (~(0x1<<9));
    65. }
    66. //清除挂起中断标志位GICD_ICPENDRx
    67. GICD->ICPENDR[3] |=(0x1<<2);
    68. //清除中断触发标志位EXTI_FPR1
    69. EXTI->FPR1 |= (0x1<<8);
    70. }
    71. //清除处理完的中断号
    72. GICC->EOIR=irqno;
    73. }

  • 相关阅读:
    华为数通方向HCIP-DataCom H12-831题库(多选题:81-100)
    【C++】 内存管理
    网络编程
    redis缓存击穿、穿透、雪崩
    HTTP状态码
    sql注入之高权限注入和文件读写
    CentOS7系统下安装OpenOffice
    期货秒交易(期货秒懂百科)
    什么是运维自动化巡检?
    二、怎么简单使用vuex
  • 原文地址:https://blog.csdn.net/YSTXDY/article/details/133798358