• 按键中断小灯蜂鸣器风扇


    按键1实现小灯亮灭,按键2实现蜂鸣器,安静3实现风扇

    src/key_it.c

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

    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. irqno = GICC->IAR & 0X3FF;
    8. switch (irqno)
    9. {
    10. case 99: // key1
    11. // 按键1中断处理
    12. if(GPIOE->ODR&(1<<10))
    13. {
    14. GPIOE->ODR&=(~(1<<10));
    15. }else
    16. {
    17. GPIOE->ODR |=(1<<10);
    18. }
    19. printf("KEY1 INT\n");
    20. // 清除挂起中断标志位GICD_ICPENDRx
    21. GICD->ICPENDR[3] |= (0x1 << 3);
    22. // 清除中断触发标志位EXTI_FPR1
    23. EXTI->FPR1 |= (0x1 << 9);
    24. break;
    25. case 97: // KEY2
    26. if(GPIOB->ODR & (1<<6)){
    27. GPIOB->ODR &= (~(1<<6));
    28. }else{
    29. GPIOB->ODR |= (1<<6);
    30. }
    31. // 按键2中断处理
    32. printf("KEY2 INT\n");
    33. // 清除挂起中断标志位GICD_ICPENDRx
    34. GICD->ICPENDR[3] |= (0x1 << 1);
    35. // 清除中断触发标志位EXTI_FPR1
    36. EXTI->FPR1 |= (0x1 << 7);
    37. break;
    38. case 98: // key3
    39. // 按键3中断处理
    40. if(GPIOE->ODR & (1<<9)){
    41. GPIOE->ODR &= (~(1<<9));
    42. }else{
    43. GPIOE->ODR |= (1<<9);
    44. }
    45. printf("KEY3 INT\n");
    46. // 清除挂起中断标志位GICD_ICPENDRx
    47. GICD->ICPENDR[3] |= (0x1 << 2);
    48. // 清除中断触发标志位EXTI_FPR1
    49. EXTI->FPR1 |= (0x1 << 8);
    50. break;
    51. }
    52. // 清除处理完的中断号GICC_EOIR
    53. GICC->EOIR = irqno;
    54. }

    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 all_led_init();
    9. void all_fmg_init();
    10. void all_fun_init();
    11. #endif

    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. key_it_config();
    9. key3_it_config();
    10. all_led_init();
    11. all_fmq_init();
    12. all_fun_init();
    13. while(1)
    14. {
    15. //串口数据收发
    16. //接受一个字符
    17. //c=getchar();
    18. //发送一个字符
    19. //putchar(c+1);
    20. // s=getchars();
    21. // putchars(s);
    22. //LED1亮
    23. }
    24. return 0;
    25. }

  • 相关阅读:
    工业读写器如何选型?
    Mac笔记本聚焦SpotLight占用内存太高的 解法
    JVM实战:CMS和G1的物理内存归还机制
    构建和调试OpenJDK
    SpringBoot整合RabbitMQ实现延迟队列功能
    CC0 是什么,为什么它会改变 NFT 市场?
    接口测试 —— 接口测试的意义
    顺序表的快慢指针应用:leetcode26、27、88、大数加法989(交换数组)
    基于python实现贪心算法、蛮力法、动态规划法解决分数背包问题和0-1背包问题(附完整源码下载)
    【Redis实战】有MQ为啥不用?用Redis作消息队列!?Redis作消息队列使用方法及底层原理高级进阶
  • 原文地址:https://blog.csdn.net/HYL1234511/article/details/133798537