• arm day 8


    arm 写一段按键中断代码

    main.c

    1. #include "uart.h"
    2. #include "key_it.h"
    3. int main()
    4. {
    5. char c;
    6. char *s;
    7. uart4_init();//串口初始化
    8. //中断初始化
    9. key_it_config();
    10. while(1)
    11. {
    12. //保证主程序不结束
    13. }
    14. return 0;
    15. }

    src/key_it.c

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

    include/key_it.h

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

    src/do_irq.c

    1. #include"key_it.h"
    2. //按键3的配置
    3. void key3_it_config()
    4. {
    5. //RCC使能GPIOF时钟
    6. RCC->MP_AHB4ENSETR |= (0x1<<5);
    7. GPIOF->MODER &= (~(0x3<<16));
    8. EXTI->EXTICR3 &=(~(0xFF<<0));
    9. EXTI->EXTICR3 |= (0x5<<0);
    10. EXTI->FTSR1 |= (0x1<<8);
    11. EXTI->C1IMR1 |= (0x1<<8);
    12. GICD->ISENABLER[3] |= (0X1<<2);
    13. GICD->IPRIORITYR[24] &= (~(0X1F<<19));
    14. GICD->ITARGETSR[24] &= (~(0X3<<16));
    15. GICD->ITARGETSR[24] |= (0X1<<16);
    16. }
    17. //按键1 按键2以及GICC层的配置
    18. void key_it_config()
    19. {
    20. //RCC使能GPIOF时钟
    21. RCC->MP_AHB4ENSETR |= (0x1<<5);
    22. //设置PF9 PF7 PF8GPIO输入
    23. //PF9
    24. GPIOF->MODER &= (~(0x3<<18));
    25. //PF8
    26. // GPIOF->MODER &= (~(0x3<<16));
    27. //pf7
    28. GPIOF->MODER &= (~(0x3<<14));
    29. //设置PF9 PF7 PF8产生EXTI事件 EXTI_EXTICRx
    30. //pf7
    31. EXTI->EXTICR2 &=(~(0xFF<<24));
    32. EXTI->EXTICR2 |= (0x5<<24);
    33. //pf8
    34. // EXTI->EXTICR3 &=(~(0xFF<<0));
    35. // EXTI->EXTICR3 |= (0x5<<0);
    36. //pf9
    37. EXTI->EXTICR3 &=(~(0xFF<<8));
    38. EXTI->EXTICR3 |= (0x5<<8);
    39. //设置事件触发方式为下降沿触发EXTI_FTSR1
    40. //pf7
    41. EXTI->FTSR1 |= (0x1<<7);
    42. //pf8
    43. // EXTI->FTSR1 |= (0x1<<8);
    44. //pf9
    45. EXTI->FTSR1 |= (0x1<<9);
    46. //设置EXTI事件触发不屏蔽EXTI_IMR1
    47. //PF7
    48. EXTI->C1IMR1 |= (0x1<<7);
    49. //PF8
    50. // EXTI->C1IMR1 |= (0x1<<8);
    51. //PF9
    52. EXTI->C1IMR1 |= (0x1<<9);
    53. //使能中断能转发到特定的CPU接口层GICD_ISENABLERx
    54. //PF7 97号中断
    55. GICD->ISENABLER[3] |= (0X1<<1);
    56. //PF78 98号中断
    57. // GICD->ISENABLER[3] |= (0X1<<2);
    58. //PF9 99号中断
    59. GICD->ISENABLER[3] |= (0X1<<3);
    60. // GICD_ISENABLERx设置中断优先级
    61. //PF7
    62. GICD->IPRIORITYR[24] &= (~(0X1F<<11));
    63. //PF8
    64. // GICD->IPRIORITYR[24] &= (~(0X1F<<19));
    65. //PF9
    66. GICD->IPRIORITYR[24] &= (~(0X1F<<27));
    67. //设置当前中断被转发到哪一个CPU处理GICD_ITARGETSRx
    68. //pf7 97中断
    69. GICD->ITARGETSR[24] &= (~(0X3<<8));
    70. GICD->ITARGETSR[24] |= (0X1<<8);
    71. //pf8 98中断
    72. // GICD->ITARGETSR[24] &= (~(0X3<<16));
    73. // GICD->ITARGETSR[24] |= (0X1<<16);
    74. //pf9 99中断
    75. GICD->ITARGETSR[24] &= (~(0X3<<24));
    76. GICD->ITARGETSR[24] |= (0X1<<24);
    77. //使能组0转发中断GICD_CTLR
    78. GICD->CTRL |= 0X1;
    79. //设置中断优先级掩码GICC_PMR
    80. GICC->PMR |= (0x1F<<3);
    81. //使能CPU可以处理组0转发的中断GICC_CTLR
    82. GICC->CTRL |= 0X1;
    83. }

  • 相关阅读:
    ModbusTCP 转 Profinet 主站网关在博图配置案例
    2 第一个Go程序
    【算法与数据结构】98、LeetCode验证二叉搜索树
    C++ 14:继承构造顺序,static继承问题,继承顺序问题,同名隐藏,菱形继承,final关键字
    Java的Future接口
    木聚糖-聚乙二醇-聚乙烯亚胺|PEI-PEG-Xylan|聚乙烯亚胺-PEG-木聚糖
    2021第7届中国大学生程序设计竞赛CCPC广州站, 签到题4题
    猿创征文|redis安装(Linux)
    1516. 移动 N 叉树的子树 DFS
    Sylar_网络框架学习——日志系统(一)
  • 原文地址:https://blog.csdn.net/A18801772899/article/details/133797582