• 2023/10/12 -- ARM


    按键中断

    led.h:

    1. #ifndef __LED_H__
    2. #define __LED_H__
    3. // typedef struct{
    4. // unsigned int moder;
    5. // unsigned int otyper;
    6. // unsigned int ospeedr;
    7. // unsigned int pupdr;
    8. // unsigned int idr;
    9. // unsigned int odr;
    10. // }gpio_t;
    11. // #define GPIOE (*(gpio_t *)0X50006000)
    12. // #define GPIOF (*(gpio_t *)0X50007000)
    13. // #define RCC (*(unsigned int *)0X50000A28)
    14. #include "stm32mp1xx_gpio.h"
    15. #include "stm32mp1xx_rcc.h"
    16. void delay(int msc);
    17. void led_init();
    18. #endif

    led.c:

    1. #include "led.h"
    2. void delay(int msc){
    3. int i,j;
    4. for(i = 0;i < msc;i++){
    5. for(j = 0;j < 3000;j++);
    6. }
    7. }
    8. void led_init(){
    9. // RCC |= (0X3<<4);
    10. // GPIOE.moder &= ~(0x33<<16);
    11. // GPIOE.moder |= (0x11<<16);
    12. // GPIOF.moder &= ~(0x3<<20);
    13. // GPIOF.moder |= (0x1<<20);
    14. // GPIOE.otyper &= ~(0x5<<8);
    15. // GPIOF.otyper &= ~(0x1<<10);
    16. // GPIOE.ospeedr &= ~(0x33<<16);
    17. // GPIOF.ospeedr &= ~(0x3<<20);
    18. // GPIOE.pupdr &= ~(0x33<<16);
    19. // GPIOF.pupdr &= ~(0x3<<20);
    20. //PE10
    21. RCC->MP_AHB4ENSETR |= (0X1<<4);
    22. GPIOE->MODER &= (~(0X3<<20));
    23. GPIOE->MODER |= (0X1<<20);
    24. GPIOE->OSPEEDR &= (~(0X1<<10));
    25. GPIOE->OSPEEDR &= (~(0X3<<20));
    26. GPIOE->PUPDR &= (~(0X3<<20));
    27. }

    beep.h:

    1. #ifndef __BEEP_H__
    2. #define __BEEP_H__
    3. #include "stm32mp1xx_gpio.h"
    4. #include "stm32mp1xx_rcc.h"
    5. void beep_init();
    6. #endif

    beep.c:

    1. #include "beep.h"
    2. void beep_init(){
    3. //PB6
    4. RCC->MC_AHB4ENSETR |= (0X1<<1);
    5. GPIOB->MODER &= (~(0X2<<12));
    6. GPIOB->MODER |= (0X1<<12);
    7. GPIOB->OTYPER &= (~(0X1<<6));
    8. GPIOB->OSPEEDR &= (~(0X3<<12));
    9. GPIOB->PUPDR &= (~(0X3<<12));
    10. }

    fan.h:

    1. #ifndef __FAN_H__
    2. #define __FAN_H__
    3. #include "stm32mp1xx_gpio.h"
    4. #include "stm32mp1xx_rcc.h"
    5. void fan_init();
    6. #endif

    fan.c:

    1. #include "fan.h"
    2. void fan_init(){
    3. //PE9
    4. RCC->MP_AHB4ENSETR |= (0X1<<4);
    5. GPIOE->MODER &= (~(0X3<<18));
    6. GPIOE->MODER |= (0X1<<18);
    7. GPIOE->OSPEEDR &= (~(0X1<<9));
    8. GPIOE->OSPEEDR &= (~(0X3<<18));
    9. GPIOE->PUPDR &= (~(0X3<<18));
    10. }

    do_irq.c:

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

    main.c:

    1. #include "key_it.h"
    2. #include "led.h"
    3. #include "beep.h"
    4. #include "fan.h"
    5. int main()
    6. {
    7. key_it_config();
    8. key3_it_config();
    9. led_init();
    10. beep_init();
    11. fan_init();
    12. while(1){
    13. }
    14. return 0;
    15. }

    效果图:

    按键中断

  • 相关阅读:
    【LeetCode】24. 两两交换链表中的节点
    基于ssm的学生综合测评管理系统047
    编程语言介绍
    MySQL--执行一条 select 语句,期间发生了什么?
    WinFrom、C# 学习记录四 WebView2使用记录
    编程必备基础 计算机组成原理+操作系统+计算机网络
    公网官网建站笔记(五):域名工信部备案完整流程并解析公网访问
    C#开源的一款友好的.NET SDK管理器
    云服务器日常维护的安全注意事项分享
    Unity坐标系入门
  • 原文地址:https://blog.csdn.net/weixin_54147737/article/details/133797409