• day62:ARMday9,I2c总线通信


    作业:按键中断实现LED1、蜂鸣器、风扇

    key_in.c:

    1. #include "key_in.h"
    2. void gpio_init()
    3. {
    4. //RCC使能
    5. //GPIOE
    6. RCC->MP_AHB4ENSETR |= (0x1<<4);
    7. //GPIOB
    8. RCC->MP_AHB4ENSETR |= (0x1<<1);
    9. //PE10、PB6、PE9输出模式
    10. GPIOE->MODER &= ~(0x3<<20);
    11. GPIOE->MODER |= (0x1<<20);
    12. GPIOB->MODER &= ~(0x3<<12);
    13. GPIOB->MODER |= (0x1<<12);
    14. GPIOE->MODER &= ~(0x3<<18);
    15. GPIOE->MODER |= (0x1<<18);
    16. //推挽模式
    17. GPIOE->OTYPER &= ~(0x1<<10);
    18. GPIOB->OTYPER &= ~(0x1<<6);
    19. GPIOE->OTYPER &= ~(0x1<<9);
    20. //速度设置为低速
    21. GPIOE->OSPEEDR &= ~(0x3<<20);
    22. GPIOB->OSPEEDR &= ~(0x3<<12);
    23. GPIOE->OSPEEDR &= ~(0x3<<18);
    24. //设置为无上拉下拉电阻
    25. GPIOE->PUPDR &= ~(0x3<<20);
    26. GPIOB->PUPDR &= ~(0x3<<12);
    27. GPIOE->PUPDR &= ~(0x3<<18);
    28. }
    29. void key_in_config()
    30. {
    31. //RCC使能GPIOF时钟
    32. RCC->MP_AHB4ENSETR |= (0x1<<5);
    33. //设置PF9 PF7 PF8管脚为输入模式
    34. GPIOF->MODER &= ~(0x3f<<14);
    35. //设置PF9 PF7 PF8发生EXTI事件
    36. EXTI->EXTICR3 &= ~(0xff<<8);
    37. EXTI->EXTICR3 |= (0x05<<8);
    38. EXTI->EXTICR2 &= ~(0xff<<24);
    39. EXTI->EXTICR2 |= (0x05<<24);
    40. EXTI->EXTICR3 &= ~(0xff);
    41. EXTI->EXTICR3 |= (0x05);
    42. //设置EXTI中断触发模式为下降沿模式
    43. EXTI->FTSR1 |= (0x7<<7);
    44. //设置EXTI事件触发为不屏蔽
    45. EXTI->C1IMR1 |= (0x7<<7);
    46. //使能组0
    47. GICD->CTRL |= 0x1;
    48. //中断使能,使其可以传到CPU
    49. GICD->ISENABLER[3] |= (0x1<<3);
    50. GICD->ISENABLER[3] |= (0x1<<1);
    51. GICD->ISENABLER[3] |= (0x1<<2);
    52. //设置中断优先级
    53. GICD->IPRIORITYR[24] &= ~(0x1f<<27);
    54. GICD->IPRIORITYR[24] &= ~(0x1f<<11);
    55. GICD->IPRIORITYR[24] &= ~(0x1f<<19);
    56. //选择CPU处理中断
    57. GICD->ITARGETSR[24] &= ~(0x3<<24);
    58. GICD->ITARGETSR[24] |= (0x1<<24);
    59. GICD->ITARGETSR[24] &= ~(0x3<<8);
    60. GICD->ITARGETSR[24] |= (0x1<<8);
    61. GICD->ITARGETSR[24] &= ~(0x3<<16);
    62. GICD->ITARGETSR[24] |= (0x1<<16);
    63. //使能CPU处理转发的中断
    64. GICC->CTRL |= 0x1;
    65. //设置中断掩码
    66. GICC->PMR &= ~(0x1f<<3);
    67. GICC->PMR |= (0x5<<3);
    68. }

    do_irq.c:

    1. #include "key_in.h"
    2. extern void printf(const char *fmt, ...);
    3. unsigned int i = 0;
    4. void do_irq(void)
    5. {
    6. int irqno;
    7. static int i1=0,i2=0,i3=0;
    8. irqno = GICC->IAR & 0x3ff;
    9. switch(irqno)
    10. {
    11. case 99:
    12. printf("KEY1 %d\n",irqno);
    13. i1++;
    14. //key1中断处理,LED1
    15. if(i1%2==1)
    16. GPIOE->ODR |= (0x1<<10);
    17. else
    18. GPIOE->ODR &= ~(0x1<<10);
    19. //清除挂起中断标识位
    20. GICD->ICPENDR[3] |= (0x1<<3);
    21. //清除事情挂起标识位
    22. EXTI->FPR1 |= (0x1<<9);
    23. break;
    24. case 97:
    25. printf("KEY2 %d\n",irqno);
    26. i2++;
    27. //key2中断处理,蜂鸣器
    28. if(i2%2==1)
    29. GPIOB->ODR |= (0x1<<6);
    30. else
    31. GPIOB->ODR &= ~(0x1<<6);
    32. //清除挂起中断标识位
    33. GICD->ICPENDR[3] |= (0x1<<1);
    34. //清除事情挂起标识位
    35. EXTI->FPR1 |= (0x1<<7);
    36. break;
    37. case 98:
    38. printf("KEY3 %d\n",irqno);
    39. i3++;
    40. //key3中断处理,风扇
    41. if(i3%2==1)
    42. GPIOE->ODR |= (0x1<<9);
    43. else
    44. GPIOE->ODR &= ~(0x1<<9);
    45. //清除挂起中断标识位
    46. GICD->ICPENDR[3] |= (0x1<<2);
    47. //清除事情挂起标识位
    48. EXTI->FPR1 |= (0x1<<8);
    49. break;
    50. }
    51. //清除处理完的中断IAR到EOIR
    52. GICC->EOIR=irqno;
    53. }

    key_in.h:

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

    main.c:

    1. #include "key_in.h"
    2. int main()
    3. {
    4. gpio_init();
    5. key_in_config();
    6. while(1)
    7. {
    8. }
    9. return 0;
    10. }

    现象:

  • 相关阅读:
    文件上传之中间件解析漏洞详解
    高防CDN安全防护系统在业务方面的应用
    Topology-le5le智慧光伏能源可视化方案
    Python3 笔记:字符串的 isspace()、istitle()、isdecimal()
    LeetCode 790. 多米诺和托米诺平铺
    C++函数内联详解
    DAY48
    JavaScript -- 06.函数知识汇总
    Java - Gson和Fastjson如何选择?
    1、shell脚本中的命令详解
  • 原文地址:https://blog.csdn.net/wxmchong/article/details/133795947