• ARM cortex-A7核中断实验 串口显示KEY按键


    注意:

            GICC 清除中断挂起标志位(清除中断号),是将值放到 GICC->EOIR 寄存器中即可。
            GICC->EOIR |= num;          

            //  GICC->EOIR &= (~(0x3ff));    清除可写位无效            
                  

    头文件:

    1. #ifndef __KEY_H__
    2. #define __KEY_H__
    3. #include "stm32mp1xx_exti.h"
    4. #include "stm32mp1xx_gic.h"
    5. #include "stm32mp1xx_gpio.h"
    6. #include "stm32mp1xx_rcc.h"
    7. //KEY1-->PF9
    8. //初始化RCC和GPIO章节
    9. void hal_gpio_key1(void);
    10. //初始化EXTI章节
    11. void hal_key1_exit_it(void);
    12. //初始化GICD章节
    13. void hal_key1_gicd_it(void);
    14. //初始化GICC章节
    15. void hal_key1_gicc_it(void);
    16. #endif

    源文件:

    1. 1 #include "key.h"
    2. 2
    3. 3 //KEY1-->PF9
    4. 4 //初始化RCC和GPIO章节
    5. 5 void hal_gpio_key1(void)
    6. 6 {
    7. 7 RCC->MP_AHB4ENSETR |= (0x1<<5); // 使能GPIOF组控制器
    8. 8 GPIOF->MODER &= (~(0x3<<18)); // key1输入模式
    9. 9 GPIOF->MODER &= (~(0x3<<14)); // key2
    10. 10 GPIOF->MODER &= (~(0x3<<16)); // key3
    11. 11 }
    12. 12
    13. 13 //初始化EXTI章节
    14. 14 void hal_key1_exit_it(void)
    15. 15 {
    16. 16 // 外部中断选择寄存器
    17. 17 EXTI->EXTICR3 &= (~(0xff<<8)); // key1
    18. 18 EXTI->EXTICR3 |= (0x05<<8);
    19. 19 EXTI->EXTICR2 &= (~(0xff<<24)); // key2
    20. 20 EXTI->EXTICR2 |= (0x05<<24);
    21. 21 EXTI->EXTICR3 &= (~0xff); // key3
    22. 22 EXTI->EXTICR3 |= 0x05;
    23. 23
    24. 24 // 下降沿选择触发寄存器
    25. 25 EXTI->FTSR1 |= (0x1<<9);
    26. 26 EXTI->FTSR1 |= (0x1<<7);
    27. 27 EXTI->FTSR1 |= (0x1<<8);
    28. 28
    29. 29 // 中断屏蔽寄存器
    30. 30 EXTI->C1IMR1 |= (0x1<<9);
    31. 31 EXTI->C1IMR1 |= (0x1<<7);
    32. 32 EXTI->C1IMR1 |= (0x1<<8);
    33. 33
    34. 34 // 中断挂起寄存器
    35. 35 // EXTI->FPR1 |= (0x1<<9);
    36. 36 // EXTI->FPR1 |= (0x1<<7);
    37. 37 // EXTI->FPR1 |= (0x1<<8);
    38. 38 }
    39. 39
    40. 40 //初始化GICD章节
    41. 41 void hal_key1_gicd_it(void)
    42. 42 {
    43. 43 //GICD控制寄存器
    44. 44 GICD->CTRL |= 0x1;
    45. 45
    46. 46 //中断设置使能寄存器
    47. 47 GICD->ISENABLER[3] |= (0x1<<3);
    48. 48 GICD->ISENABLER[3] |= (0x1<<1);
    49. 49 GICD->ISENABLER[3] |= (0x1<<2);
    50. 50
    51. 51 //中断优先级寄存器
    52. 52 GICD->IPRIORITYR[24] |= (0x3<<27);
    53. 53 GICD->IPRIORITYR[24] |= (0x3<<11);
    54. 54 GICD->IPRIORITYR[24] |= (0x3<<19);
    55. 55
    56. 56 //中断目标分配寄存器
    57. 57 GICD->ITARGETSR[24] |= (0b1<<24);
    58. 58 GICD->ITARGETSR[24] |= (0b1<<8);
    59. 59 GICD->ITARGETSR[24] |= (0b1<<16);
    60. 60
    61. 61 //清除中断挂起标志位寄存器
    62. 62 GICD->ICPENDR[3] |= (0x1<<3);
    63. 63 GICD->ICPENDR[3] |= (0x1<<1);
    64. 64 GICD->ICPENDR[3] |= (0x1<<2);
    65. 65 }
    66. 66
    67. 67 //初始化GICC章节
    68. 68 void hal_key1_gicc_it(void)
    69. 69 {
    70. 70 //GICC控制寄存器
    71. 71 GICC->CTRL |= 0x1;
    72. 72
    73. 73 //GICC层设置中断优先级
    74. 74 GICC->PMR &= (~(0x1f<<3));
    75. 75 GICC->PMR |= (0x4<<3); // 要求大于GICD的优先级
    76. 76
    77. 77
    78. 78 }
    79. ~

    主函数:

    1. 1 #include "key.h"
    2. 2
    3. 3 extern void printf(const char *fmt, ...);
    4. 4 void delay_ms(int ms)
    5. 5 {
    6. 6 int i,j;
    7. 7 for(i = 0; i < ms;i++)
    8. 8 for (j = 0; j < 1800; j++);
    9. 9 }
    10. 10
    11. 11 int main()
    12. 12 {
    13. 13 hal_gpio_key1();
    14. 14
    15. 15 hal_key1_exit_it();
    16. 16
    17. 17 hal_key1_gicd_it();
    18. 18
    19. 19 hal_key1_gicc_it();
    20. 20
    21. 21 while(1)
    22. 22 {
    23. 23
    24. 24 }
    25. 25 return 0;
    26. 26 }

    中断函数

    1. 1 #include "key.h"
    2. 2
    3. 3 extern void printf(const char *fmt, ...);
    4. 4 unsigned int i = 0;
    5. 5 void do_irq(void)
    6. 6 {
    7. 7 //获取中断号
    8. 8 unsigned int num = 0;
    9. 9 num = (GICC->IAR & 0x3ff);
    10. 10
    11. 11 //判断中断号
    12. 12 if(99 == num)
    13. 13 {
    14. 14 printf("别按 KEY1 了...\n");
    15. 15 EXTI->FPR1 |= (0x1<<9);
    16. 16 GICD->ICPENDR[3] |= (0x1<<3);
    17. 17 }
    18. 18
    19. 19 //清除中断挂起标志位,清除中断号
    20. 20 // GICC->EOIR &= (~(0x3ff));
    21. 21 GICC->EOIR |= num;
    22. 22 }

    实验现象:

     

  • 相关阅读:
    R语言查看对象的结构:class函数、mode函数、str函数、names函数
    Spring Boot + Vue的网上商城之商品信息展示
    MySQL备份与恢复
    Rockwell Prosoft MV169E-MBTCP
    【sciter】安全应用列表控件总结
    MySQL中BETWEEN AND(范围查询)
    “外卖员的时间没有程序员值钱”:读过书就把自己当人上人?得电
    0824(038天 泛型01)
    小满Vue3第四十五章(Vue3 Web Components)
    Ceres Solver简介及使用
  • 原文地址:https://blog.csdn.net/weixin_60354809/article/details/128122295