• 2022/9/17——基于stm32mp157的按键中断实验


    1、key.h——头文件的包络和函数的声明

    1. #ifndef __KEY_H__
    2. #define __KEY_H__
    3. #include "stm32mp1xx_rcc.h"
    4. #include "stm32mp1xx_exti.h"
    5. #include "stm32mp1xx_gic.h"
    6. #include "stm32mp1xx_gpio.h"
    7. //初始化EXTI层——key1
    8. void pf9_exti_init();
    9. //初始化GICD层——key1
    10. void pf9_gicd_init();
    11. //初始化GICC层——key1
    12. void pf9_gicc_init();
    13. //初始化EXTI层——key3
    14. void pf8_exti_init();
    15. //初始化GICD层——key3
    16. void pf8_gicd_init();
    17. //初始化GICC层——key3
    18. void pf8_gicc_init();
    19. //初始化EXTI层——key2
    20. void pf7_exti_init();
    21. //初始化GICD层——key2
    22. void pf7_gicd_init();
    23. //初始化GICC层——key2
    24. void pf7_gicc_init();
    25. #endif

    2、key.c——功能函数的定义(以key1为例)

    1)RCC章节初始化

    1. //1.设置GPIOF组时钟使能
    2. RCC->MP_AHB4ENSETR |= (0x1 << 5);

    2)GPIO章节初始化

    1. //1.设置PF9引脚为输入模式
    2. GPIOF->MODER &= (~(0x3 << 18));

    3)EXTI章节初始化

    3.1设置PF9引脚和EXIT9控制器进行连接

    1. EXTI->EXTICR3 &= (~(0xff << 8));
    2. EXTI->EXTICR3 |= (0x5 << 8);

    3.2设置PF9引脚检测方式为下降沿

    EXTI->FTSR1 |= (0x1 << 9);

    3.3设置PF9引脚中断不屏蔽

    EXTI->C1IMR1 |= (0x1 << 9);

    4)初始化GICD层

    4.1设置GICD层全局中断使能寄存器

    	GICD->CTRL |= (0x1 << 0);	

    4.2设置GICD层中断使能寄存器

    	GICD->ISENABLER[3] |= (0x1 << 3);

    4.3设置GICD层中断优先级寄存器

    1. GICD->IPRIORITYR[24] &= (~(0x1f << 27));
    2. GICD->IPRIORITYR[24] |= (0x1 << 27);

    4.4设置GICD层中断目标分配寄存器

    	GICD->ITARGETSR[24] |= (0x3 << 24);

    5)初始化GICC层

    5.1设置GICC层全局中断使能寄存器

    GICC->CTRL |= (0x1 << 0);

    5.2设置GICC层中断优先级寄存器

    1. GICC->PMR &= (~(0x1f << 3));
    2. GICC->PMR |= (0x9 << 3);

    6)完整代码

    1. #include "key.h"
    2. //初始化EXTI层——key1
    3. void pf9_exti_init()
    4. {
    5. /****RCC章节初始化*******/
    6. //1.设置GPIOF组时钟使能
    7. RCC->MP_AHB4ENSETR |= (0x1 << 5);
    8. /****GPIO章节初始化*******/
    9. //1.设置PF9引脚为输入模式
    10. GPIOF->MODER &= (~(0x3 << 18));
    11. /*****EXTI章节初始化******/
    12. //1.设置PF9引脚和EXIT9控制器进行连接
    13. EXTI->EXTICR3 &= (~(0xff << 8));
    14. EXTI->EXTICR3 |= (0x5 << 8);
    15. //2.设置PF9引脚检测方式下降沿
    16. EXTI->FTSR1 |= (0x1 << 9);
    17. //3.设置PF9引脚中断不屏蔽
    18. EXTI->C1IMR1 |= (0x1 << 9);
    19. }
    20. //初始化GICD层——key1
    21. void pf9_gicd_init()
    22. {
    23. //1.设置GICD层全局中断使能寄存器
    24. GICD->CTRL |= (0x1 << 0);
    25. //2.设置GICD层中断使能寄存器
    26. GICD->ISENABLER[3] |= (0x1 << 3);
    27. //3.设置GICD层中断优先级寄存器
    28. GICD->IPRIORITYR[24] &= (~(0x1f << 27));
    29. GICD->IPRIORITYR[24] |= (0x1 << 27);
    30. //4.设置GICD层中断目标分配寄存器
    31. GICD->ITARGETSR[24] |= (0x3 << 24);
    32. }
    33. //初始化GICC层——key1
    34. void pf9_gicc_init()
    35. {
    36. //1.设置GICC层全局中断使能寄存器
    37. GICC->CTRL |= (0x1 << 0);
    38. //2.设置GICC层中断优先级寄存器
    39. GICC->PMR &= (~(0x1f << 3));
    40. GICC->PMR |= (0x9 << 3);
    41. }
    42. //初始化EXTI层——key3
    43. void pf8_exti_init()
    44. {
    45. /****GPIO章节初始化*******/
    46. //1.设置PF8引脚为输入模式
    47. GPIOF->MODER &= (~(0x3 << 16));
    48. /*****EXTI章节初始化******/
    49. //1.设置PF8引脚和EXIT8控制器进行连接
    50. EXTI->EXTICR3 &= (~(0xff << 0));
    51. EXTI->EXTICR3 |= (0x5 << 0);
    52. //2.设置PF8引脚检测方式下降沿
    53. EXTI->FTSR1 |= (0x1 << 8);
    54. //3.设置PF8引脚中断不屏蔽
    55. EXTI->C1IMR1 |= (0x1 << 8);
    56. }
    57. //初始化GICD层——key3
    58. void pf8_gicd_init()
    59. {
    60. //1.设置GICD层全局中断使能寄存器
    61. GICD->CTRL |= (0x1 << 0);
    62. //2.设置GICD层中断使能寄存器
    63. GICD->ISENABLER[3] |= (0x1 << 2);
    64. //3.设置GICD层中断优先级寄存器
    65. GICD->IPRIORITYR[24] &= (~(0x1f << 19));
    66. GICD->IPRIORITYR[24] |= (0x3 << 19);
    67. //4.设置GICD层中断目标分配寄存器
    68. GICD->ITARGETSR[24] |= (0x3 << 16);
    69. }
    70. //初始化GICC层——key3
    71. void pf8_gicc_init()
    72. {
    73. //1.设置GICC层全局中断使能寄存器
    74. GICC->CTRL |= (0x1 << 0);
    75. //2.设置GICC层中断优先级寄存器
    76. GICC->PMR &= (~(0x1f << 3));
    77. GICC->PMR |= (0x8 << 3);
    78. }
    79. //初始化EXTI层——key2
    80. void pf7_exti_init()
    81. {
    82. /****GPIO章节初始化*******/
    83. //1.设置PF7引脚为输入模式
    84. GPIOF->MODER &= (~(0x3 << 14));
    85. /*****EXTI章节初始化******/
    86. //1.设置PF7引脚和EXIT7控制器进行连接
    87. EXTI->EXTICR2 &= (~(0xff << 24));
    88. EXTI->EXTICR2 |= (0x5 << 24);
    89. //2.设置PF7引脚检测方式下降沿
    90. EXTI->FTSR1 |= (0x1 << 7);
    91. //3.设置PF7引脚中断不屏蔽
    92. EXTI->C1IMR1 |= (0x1 << 7);
    93. }
    94. //初始化GICD层——key2
    95. void pf7_gicd_init()
    96. {
    97. //1.设置GICD层全局中断使能寄存器
    98. GICD->CTRL |= (0x1 << 0);
    99. //2.设置GICD层中断使能寄存器
    100. GICD->ISENABLER[3] |= (0x1 << 1);
    101. //3.设置GICD层中断优先级寄存器
    102. GICD->IPRIORITYR[24] &= (~(0x1f << 11));
    103. GICD->IPRIORITYR[24] |= (0x2 << 11);
    104. //4.设置GICD层中断目标分配寄存器
    105. GICD->ITARGETSR[24] |= (0x3 << 8);
    106. }
    107. //初始化GICC层——key2
    108. void pf7_gicc_init()
    109. {
    110. //1.设置GICC层全局中断使能寄存器
    111. GICC->CTRL |= (0x1 << 0);
    112. //2.设置GICC层中断优先级寄存器
    113. GICC->PMR &= (~(0x1f << 3));
    114. GICC->PMR |= (0x7 << 3);
    115. }

    3、do_irq.c——中断处理函数

    使用延时函数进行去抖

    1. #include "key.h"
    2. extern void printf(const char *fmt, ...);
    3. extern void delay_ms(int ms);
    4. unsigned int i = 0;
    5. void do_irq(void)
    6. {
    7. unsigned int num = 0;
    8. //获取中断号
    9. num = GICC->IAR;
    10. switch(num)
    11. {
    12. case 97:
    13. delay_ms(500);
    14. printf("key2#####\n");
    15. //清除EXTI层中断挂起标志位
    16. EXTI->FPR1 |= (0x1 << 7);
    17. //清除GICD层中断挂起标志位
    18. GICD->ICPENDR[3] |= (0x1 << 1);
    19. break;
    20. case 98:
    21. delay_ms(500);
    22. printf("key3#####\n");
    23. //清除EXTI层中断挂起标志位
    24. EXTI->FPR1 |= (0x1 << 8);
    25. //清除GICD层中断挂起标志位
    26. GICD->ICPENDR[3] |= (0x1 << 2);
    27. break;
    28. case 99:
    29. delay_ms(500);
    30. printf("key1#####\n");
    31. //清除EXTI层中断挂起标志位
    32. EXTI->FPR1 |= (0x1 << 9);
    33. //清除GICD层中断挂起标志位
    34. GICD->ICPENDR[3] |= (0x1 << 3);
    35. break;
    36. }
    37. //清除中断号
    38. GICC->EOIR &= (0x3ff << 0);
    39. GICC->EOIR |= num;
    40. }

    4、main.c——延时函数的定义和初始化函数的调用

    1. #include "key.h"
    2. extern void printf(const char *fmt, ...);
    3. void delay_ms(int ms)
    4. {
    5. int i,j;
    6. for(i = 0; i < ms;i++)
    7. for (j = 0; j < 1800; j++);
    8. }
    9. int main()
    10. {
    11. /******key1初始化*****/
    12. //初始化EXTI层
    13. pf9_exti_init();
    14. //初始化GICD层
    15. pf9_gicd_init();
    16. //初始化GICC层
    17. pf9_gicc_init();
    18. /******key3初始化*****/
    19. //初始化EXTI层
    20. pf8_exti_init();
    21. //初始化GICD层
    22. pf8_gicd_init();
    23. //初始化GICC层
    24. pf8_gicc_init();
    25. /******key3初始化*****/
    26. //初始化EXTI层
    27. pf7_exti_init();
    28. //初始化GICD层
    29. pf7_gicd_init();
    30. //初始化GICC层
    31. pf7_gicc_init();
    32. while(1)
    33. {
    34. }
    35. return 0;
    36. }

    5、实验现象

     

  • 相关阅读:
    JSON和全局异常处理
    解决分布式锁bug,shiro-01
    【Semidrive】解决 X9HP reboot 导致 Android 崩溃的问题
    怎么在dreamweaver嵌套盒子?
    u-boot移植问题解决
    解析掌握现代化少儿编程实操能力
    ICMPv6基本理论讲解
    Java虚拟机启动过程解析
    Pytorch 深度学习实践 day01(背景)
    正式版 API 确定 | Android 12L Beta 1 发布
  • 原文地址:https://blog.csdn.net/ad20001218/article/details/126906406