当前位置:   article > 正文

ARM_day7:按键中断

ARM_day7:按键中断

实现三个按键中断,按键按下时,LED灯亮 

mykey.h
  1. #ifndef __MYKEY_H__
  2. #define __MYKEY_H__
  3. #include "stm32mp1xx_gpio.h"
  4. #include "stm32mp1xx_rcc.h"
  5. #include "stm32mp1xx_gic.h"
  6. #include "stm32mp1xx_exti.h"
  7. void key1_int_config();
  8. void key2_int_config();
  9. void key3_int_config();
  10. void led_init();
  11. void LED1_CTRL(int flag);
  12. void LED2_CTRL(int flag);
  13. void LED3_CTRL(int flag);
  14. #endif
mykey.c
  1. #include "mykey.h"
  2. void key1_int_config()
  3. {
  4. //使能GPIOF外设时钟
  5. RCC->MP_AHB4ENSETR |= (0x1<<5);
  6. //设置PF9为输入
  7. GPIOF->MODER &= (~(0x3<<18));
  8. //设置PF9产生EXTI9事件
  9. EXTI->EXTICR3 &= (~(0xff<<8));
  10. EXTI->EXTICR3 |= (0x5<<8);
  11. //设置下降沿检测PF9事件
  12. EXTI->FTSR1 |= (0x1<<9);
  13. //取消EXTI9事件的屏蔽
  14. EXTI->C1IMR1 |= (0x1<<9);
  15. //全局使能99号中断
  16. GICD->ISENABLER[3] |= (0x1<<3);
  17. //设置99号中断的优先级
  18. GICD->IPRIORITYR[24] &= (~(0x1f<<27)); //00000
  19. //设置99号中断的目标处理器
  20. GICD->ITARGETSR[24] |= (0x1<<24); //交给处理器0处理
  21. //允许组0中断被转发到GICC层
  22. GICD->CTRL |= 0x1;
  23. //设置中断优先级掩码
  24. GICC->PMR |= (0x1f<<3); //掩码为11111
  25. //允许组0中断被转发给处理器
  26. GICC->CTRL |= 0x1;
  27. }
  28. void key2_int_config()
  29. {
  30. //使能GPIOF外设时钟
  31. RCC->MP_AHB4ENSETR |= (0x1<<5);
  32. //设置PF8为输入
  33. GPIOF->MODER &= (~(0x3<<16));
  34. //设置PF8产生EXTI8事件
  35. EXTI->EXTICR3 &= (~(0xff));
  36. EXTI->EXTICR3 |= (0x5);
  37. //设置下降沿检测PF8事件
  38. EXTI->FTSR1 |= (0x1<<8);
  39. //取消EXTI8事件的屏蔽
  40. EXTI->C1IMR1 |= (0x1<<8);
  41. //全局使能98号中断
  42. GICD->ISENABLER[3] |= (0x1<<2);
  43. //设置98号中断的优先级
  44. GICD->IPRIORITYR[24] &= (~(0x1f)<<19); //00000
  45. //设置98号中断的目标处理器
  46. GICD->ITARGETSR[24] |= (0x1<<16); //交给处理器0处理
  47. //允许组0中断被转发到GICC层
  48. GICD->CTRL |= 0x1;
  49. //设置中断优先级掩码
  50. GICC->PMR |= (0x1f<<3); //掩码为11111
  51. //允许组0中断被转发给处理器
  52. GICC->CTRL |= 0x1;
  53. }
  54. void key3_int_config()
  55. {
  56. //使能GPIOF外设时钟
  57. RCC->MP_AHB4ENSETR |= (0x1<<5);
  58. //设置PF7为输入
  59. GPIOF->MODER &= (~(0x3<<14));
  60. //设置PF7产生EXTI7事件
  61. EXTI->EXTICR2 &= (~(0xff<<24));
  62. EXTI->EXTICR2 |= (0x5<<24);
  63. //设置下降沿检测PF7事件
  64. EXTI->FTSR1 |= (0x1<<7);
  65. //取消EXTI7事件的屏蔽
  66. EXTI->C1IMR1 |= (0x1<<7);
  67. //全局使能97号中断
  68. GICD->ISENABLER[3] |= (0x1<<1);
  69. //设置97号中断的优先级
  70. GICD->IPRIORITYR[24] &= (~(0x1f)<<11); //00000
  71. //设置97号中断的目标处理器
  72. GICD->ITARGETSR[24] |= (0x1<<8); //交给处理器0处理
  73. //允许组0中断被转发到GICC层
  74. GICD->CTRL |= 0x1;
  75. //设置中断优先级掩码
  76. GICC->PMR |= (0x1f<<3); //掩码为11111
  77. //允许组0中断被转发给处理器
  78. GICC->CTRL |= 0x1;
  79. }
main.c
  1. #include "mykey.h"
  2. //手动封装一个延时函数
  3. void delay(int ms)
  4. {
  5. int i,j;
  6. for(i=0;i<ms;i++)
  7. {
  8. for(j=0;j<2000;j++)
  9. {
  10. }
  11. }
  12. }
  13. int main()
  14. {
  15. //按键中断初始化
  16. key1_int_config();
  17. key2_int_config();
  18. key3_int_config();
  19. //led灯初始化
  20. led_init();
  21. while(1)
  22. {
  23. }
  24. return 0;
  25. }
do_irq.c
  1. #include "mykey.h"
  2. extern void printf(const char *fmt, ...);
  3. unsigned int i = 0;
  4. void do_irq(void)
  5. {
  6. // 获取中断号
  7. unsigned int irqno = (GICC->IAR & 0x3ff);
  8. switch (irqno)
  9. {
  10. case 99:
  11. // 中断处理逻辑
  12. LED1_CTRL(1);
  13. LED2_CTRL(0);
  14. LED3_CTRL(0);
  15. // 清除GICD的中断标志
  16. GICD->ICPENDR[3] |= (0x1 << 3);
  17. // 清除EXTI中的中断触发标志
  18. EXTI->FPR1 |= (0x1 << 9);
  19. break;
  20. case 98:
  21. // 中断处理逻辑
  22. LED1_CTRL(0);
  23. LED2_CTRL(1);
  24. LED3_CTRL(0);
  25. // 清除GICD的中断标志
  26. GICD->ICPENDR[3] |= (0x1 << 2);
  27. // 清除EXTI中的中断触发标志
  28. EXTI->FPR1 |= (0x1 << 8);
  29. break;
  30. case 97:
  31. // 中断处理逻辑
  32. LED1_CTRL(0);
  33. LED2_CTRL(0);
  34. LED3_CTRL(1);
  35. // 清除GICD的中断标志
  36. GICD->ICPENDR[3] |= (0x1 << 1);
  37. // 清除EXTI中的中断触发标志
  38. EXTI->FPR1 |= (0x1 << 7);
  39. break;
  40. default:
  41. break;
  42. }
  43. // 清除IAR寄存器中保存的中断号
  44. GICC->EOIR = irqno;
  45. }
 
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/457804
推荐阅读
相关标签
  

闽ICP备14008679号