• 2023年10月12日


    /src/key_it_c

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

    /src/do_irq.c

    1. #include "key_it.h"
    2. extern void printf(const char *fmt, ...);
    3. unsigned int i = 0;
    4. void do_irq(void)
    5. {
    6. int irqno; // 保存中断号
    7. printf("%d\n",irqno);
    8. irqno = GICC->IAR & 0X3FF;
    9. switch (irqno)
    10. {
    11. case 99: // key1
    12. // 按键1中断处理
    13. printf("KEY1 INT\n");
    14. if(GPIOE->ODR & (0x1<<10))
    15. {
    16. GPIOE->ODR &= (~(0x1<<10));
    17. }else
    18. {
    19. GPIOE->ODR |= (0x1<<10);
    20. }
    21. // 清除挂起中断标志位GICD_ICPENDRx
    22. GICD->ICPENDR[3] |= (0x1 << 3);
    23. // 清除中断触发标志位EXTI_FPR1
    24. EXTI->FPR1 |= (0x1 << 9);
    25. break;
    26. case 97: // key2
    27. // 按键2中断处理
    28. printf("KEY2 INT\n");
    29. if(GPIOB->ODR & (0x1<<6))
    30. {
    31. GPIOB->ODR &= (~(0x1<<6));
    32. }else
    33. {
    34. GPIOB->ODR |= (0x1<<6);
    35. }
    36. // 清除挂起中断标志位GICD_ICPENDRx
    37. // 清除挂起中断标志位GICD_ICPENDRx
    38. GICD->ICPENDR[3] |= (0x1 << 1);
    39. // 清除中断触发标志位EXTI_FPR1
    40. EXTI->FPR1 |= (0x1 << 7);
    41. break;
    42. case 98: // key3
    43. // 按键3中断处理
    44. printf("KEY3 INT\n");
    45. if(GPIOE->ODR & (0x1<<9))
    46. {
    47. GPIOE->ODR &= (~(0x1<<9));
    48. }else
    49. {
    50. GPIOE->ODR |= (0x1<<9);
    51. }
    52. // 清除挂起中断标志位GICD_ICPENDRx
    53. GICD->ICPENDR[3] |= (0x1 << 2);
    54. // 清除中断触发标志位EXTI_FPR1
    55. EXTI->FPR1 |= (0x1 << 8);
    56. break;
    57. }
    58. // 清除处理完的中断号GICC_EOIR
    59. GICC->EOIR = irqno;
    60. }

    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. led_init();
    10. fs_init();
    11. sp1_init();
    12. key_it_config();
    13. key3_it_config();
    14. while(1)
    15. {
    16. //保证主程序不结束
    17. }
    18. return 0;
    19. }

    /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. void led_init();
    9. void sp1_init();
    10. void fs_init();
    11. #endif

  • 相关阅读:
    功率放大器的三种主要类型及其特点
    【网络运维】小平头PingTow网络IP导入检测工具软件开发源代码分享
    webpack-bundle-analyzer 打包分析工具
    【java】java list.stream().map().collect(Collectors.toList())
    MySQL数据 - 索引
    rabbitmq 消费者报错 ListenerExecutionFailedException NullPointerException
    【C++程序员必修第一课】C++基础课程-09:while 循环
    用微信小程序开启桶装水订购业务
    【预测模型】基于径向基神经网络实现数据回归预测附matlab代码
    数据结构和算法(10):B-树
  • 原文地址:https://blog.csdn.net/2201_75732711/article/details/133797931