• ARM Day7


    实现三个按键中断

    1. #ifndef __MYKEY_H__
    2. #define __MYKEY_H__
    3. #include "stm32mp1xx_gpio.h"
    4. #include "stm32mp1xx_gic.h"
    5. #include "stm32mp1xx_rcc.h"
    6. #include "stm32mp1xx_exti.h"
    7. void key1_int_config();
    8. void key2_int_config();
    9. void key3_int_config();
    10. #endif
    1. #include "mykey.h"
    2. void key1_int_config()
    3. {
    4. //使能GPIO外设时钟
    5. RCC->MP_AHB4ENSETR |=(0x1<<5);
    6. //设置PF9为输入
    7. GPIOF->MODER &=(~(0x3<<18));
    8. //设置PF9产生EXTI9事件
    9. EXTI->EXTICR3 &=(~(0xff << 8));
    10. EXTI->EXTICR3 |=(0x05 << 8);
    11. //设置下降沿检测EXTI9事件
    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));
    19. //设置99号中断的目标处理器
    20. GICD->ITARGETSR[24] |=(0x1 <<24);
    21. //允许组0中断被转发到GICC层
    22. GICD->CTRL |= 0x1;
    23. // 设置中断优先级掩码
    24. GICC->PMR |=(0x1f << 3);
    25. // 允许组0中断被转发给处理器
    26. GICC->CTRL |= 0x1;
    27. }
    28. void key2_int_config()
    29. {
    30. //使能GPIO外设时钟
    31. RCC->MP_AHB4ENSETR |=(0x1<<5);
    32. //设置PF7为输入
    33. GPIOF->MODER &=(~(0x3<<14));
    34. //设置PF7产生EXTI7事件
    35. EXTI->EXTICR2 &=(~(0xff << 24));
    36. EXTI->EXTICR2 |=(0x05 << 24);
    37. //设置下降沿检测EXTI7事件
    38. EXTI->FTSR1 |= (0x1 << 7);
    39. //取消EXTI7事件的屏蔽
    40. EXTI->C1IMR1 |= (0x1 << 7);
    41. // 全局使能97号中断
    42. GICD->ISENABLER[3] |= (0x1 << 1);
    43. //设置97号中断的优先级
    44. GICD->IPRIORITYR[24] &=(~(0x1f << 11));
    45. //设置97号中断的目标处理器
    46. GICD->ITARGETSR[24] |=(0x1 <<8);
    47. //允许组0中断被转发到GICC层
    48. GICD->CTRL |= 0x1;
    49. // 设置中断优先级掩码
    50. GICC->PMR |=(0x1f << 3);
    51. // 允许组0中断被转发给处理器
    52. GICC->CTRL |= 0x1;
    53. }
    54. void key3_int_config()
    55. {
    56. //使能GPIO外设时钟
    57. RCC->MP_AHB4ENSETR |=(0x1<<5);
    58. //设置PF8为输入
    59. GPIOF->MODER &=(~(0x3<<16));
    60. //设置PF8产生EXTI8事件
    61. EXTI->EXTICR3 &=(~(0xff ));
    62. EXTI->EXTICR3 |=(0x05 );
    63. //设置下降沿检测EXTI8事件
    64. EXTI->FTSR1 |= (0x1 << 8);
    65. //取消EXTI8事件的屏蔽
    66. EXTI->C1IMR1 |= (0x1 << 8);
    67. // 全局使能98号中断
    68. GICD->ISENABLER[3 ]|= (0x1 << 2);
    69. //设置98号中断的优先级
    70. GICD->IPRIORITYR[24] &=(~(0x1f << 19));
    71. //设置98号中断的目标处理器
    72. GICD->ITARGETSR[24] |=(0x1 <<16);
    73. //允许组0中断被转发到GICC层
    74. GICD->CTRL |= 0x1;
    75. // 设置中断优先级掩码
    76. GICC->PMR |=(0x1f << 3);
    77. // 允许组0中断被转发给处理器
    78. GICC->CTRL |= 0x1;
    79. }
    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. i=!i;
    13. if(i==0)
    14. GPIOE->ODR |=(0x1<<10);
    15. else
    16. GPIOE->ODR &=(~(0x1<<10));
    17. //清除GICD的中断标志
    18. GICD->ICPENDR[3] |=(0X1<<3);
    19. //清除EXTI中的中断触发标志
    20. EXTI->FPR1 |=(0x1<<9);
    21. break;
    22. case 98:
    23. //中断处理逻辑
    24. i=!i;
    25. if(i==0)
    26. GPIOE->ODR |=(0x1<<8);
    27. else
    28. GPIOE->ODR &=(~(0x1<<8));
    29. //清除GICD的中断标志
    30. GICD->ICPENDR[3] |=(0X1<<2);
    31. //清除EXTI中的中断触发标志
    32. EXTI->FPR1 |=(0x1<<8);
    33. break;
    34. case 97:
    35. //中断处理逻辑
    36. i=!i;
    37. if(i==0)
    38. GPIOF->ODR |=(0x1<<10);
    39. else
    40. GPIOF->ODR &=(~(0x1<<10));
    41. //清除GICD的中断标志
    42. GICD->ICPENDR[3] |=(0X1<<1);
    43. //清除EXTI中的中断触发标志
    44. EXTI->FPR1 |=(0x1<<7);
    45. break;
    46. }
    47. //清除IAR寄存器中保存的中断号
    48. GICC->EOIR=irqno;
    49. }
    1. #include "mykey.h"
    2. #include "uart4.h"
    3. //手动封装延时函数
    4. void delay_ms(int ms)
    5. {
    6. int i,j;
    7. for(i=0;i
    8. {
    9. for(j=0;j<2000;j++)
    10. {
    11. }
    12. }
    13. }
    14. int main()
    15. {
    16. //按键中断初始化
    17. key1_int_config();
    18. key2_int_config();
    19. key3_int_config();
    20. //串口初始化
    21. uart4_config();
    22. //char str[100];
    23. while(1)
    24. {
    25. //死循环不让程序结束
    26. }
    27. return 0;
    28. }

  • 相关阅读:
    牛客: BM5 合并k个已排序的链表
    Socks5代理、IP代理的关键作用
    un7.30:Linux——如何在docker容器中显示MySQL的中文字符?
    壹基金防灾减灾宣传进社区 提升家庭安全能力
    大数据Hadoop之——Hadoop 3.3.4 HA(高可用)原理与实现(QJM)
    P1030 [NOIP2001 普及组] 求先序排列
    Python学习基础笔记十一——编码
    智慧公厕建设的好处
    HashMap和HashTable的区别
    【Spring Boot】初识Thymeleaf
  • 原文地址:https://blog.csdn.net/weixin_45585727/article/details/137854627