• ARM第四次


    main.c

    1. #include "delay.h"
    2. #include "led.h"
    3. #include "beep.h"
    4. #include "motor.h"
    5. #include "fan.h"
    6. #include "key.h"
    7. int main()
    8. {
    9. LED1_Init();
    10. LED2_Init();
    11. LED3_Init();
    12. BEEP_Init();
    13. Motor_Init();
    14. Fan_Init();
    15. key1_Init();
    16. key2_Init();
    17. key3_Init();
    18. while (1)
    19. {
    20. }
    21. return 0;
    22. }

    key.c

    1. #include "key.h"
    2. void key1_Init(void)
    3. {
    4. //使能GPIOF外设时钟
    5. RCC->MP_AHB4ENSETR |= (0X1<<5);
    6. //将GPIOF_PIN9设置为输入
    7. GPIOF->MODER &= (~(0X3<<18));
    8. //让GPIOF_PIN9产生EXTI9事件
    9. EXTI->EXTICR3 &= (~(0XFF<<8));
    10. EXTI->EXTICR3 |= (0x5<<8);
    11. //使用下降沿检测EXTI9事件
    12. EXTI->FTSR1 |= (0X1<<9);
    13. //取消EXTI9事件的屏蔽
    14. EXTI->C1IMR1 |= (0X1<<9);
    15. //使能99号中断
    16. GICD->ISENABLER[3] |= (0X1<<3);
    17. //设置99号中断的中断优先级
    18. GICD->IPRIORITYR[24] &= (~(0X1F<<27));
    19. //设置99号中断的目标处理器
    20. GICD->ITARGETSR[24] &= (~(0X3<<24));
    21. GICD->ITARGETSR[24] |= (0X1<<24);
    22. //全局使能组0中断被转发到GICC层
    23. GICD->CTRL |= (0X1);
    24. //设置中断优先级的掩码
    25. GICC->PMR |= (0X1F<<3);
    26. //全局使能组0中断被转发给处理器
    27. GICC->CTRL |= (0X1);
    28. }
    29. void key2_Init(void)
    30. {
    31. //使能GPIOF外设时钟
    32. RCC->MP_AHB4ENSETR |= (0X1<<5);
    33. //将GPIOF_PIN7设置为输入
    34. GPIOF->MODER &= (~(0X3<<14));
    35. //让GPIOF_PIN7产生EXTI7事件
    36. EXTI->EXTICR2 &= (~(0XFF<<24));
    37. EXTI->EXTICR2 |= (0x5<<24);
    38. //使用下降沿检测EXTI7事件
    39. EXTI->FTSR1 |= (0X1<<7);
    40. //取消EXTI7事件的屏蔽
    41. EXTI->C1IMR1 |= (0X1<<7);
    42. //使能97号中断
    43. GICD->ISENABLER[3] |= (0X1<<1);
    44. //设置97号中断的中断优先级
    45. GICD->IPRIORITYR[24] &= (~(0X1F<<11));
    46. //设置97号中断的目标处理器
    47. GICD->ITARGETSR[24] &= (~(0X3<<8));
    48. GICD->ITARGETSR[24] |= (0X1<<8);
    49. //全局使能组0中断被转发到GICC层
    50. GICD->CTRL |= (0X1);
    51. //设置中断优先级的掩码
    52. GICC->PMR |= (0X1F<<3);
    53. //全局使能组0中断被转发给处理器
    54. GICC->CTRL |= (0X1);
    55. }
    56. void key3_Init(void)
    57. {
    58. //使能GPIOF外设时钟
    59. RCC->MP_AHB4ENSETR |= (0X1<<5);
    60. //将GPIOF_PIN8设置为输入
    61. GPIOF->MODER &= (~(0X3<<16));
    62. //让GPIOF_PIN8产生EXTI8事件
    63. EXTI->EXTICR3 &= (~(0XFF));
    64. EXTI->EXTICR3 |= (0x5);
    65. //使用下降沿检测EXTI8事件
    66. EXTI->FTSR1 |= (0X1<<8);
    67. //取消EXTI8事件的屏蔽
    68. EXTI->C1IMR1 |= (0X1<<8);
    69. //使能98号中断
    70. GICD->ISENABLER[3] |= (0X1<<2);
    71. //设置98号中断的中断优先级
    72. GICD->IPRIORITYR[24] &= (~(0X1F<<19));
    73. //设置98号中断的目标处理器
    74. GICD->ITARGETSR[24] &= (~(0X3<<16));
    75. GICD->ITARGETSR[24] |= (0X1<<16);
    76. //全局使能组0中断被转发到GICC层
    77. GICD->CTRL |= (0X1);
    78. //设置中断优先级的掩码
    79. GICC->PMR |= (0X1F<<3);
    80. //全局使能组0中断被转发给处理器
    81. GICC->CTRL |= (0X1);
    82. }

    key.h

    1. #ifndef __KEY_H__
    2. #define __KEY_H__
    3. #include "stm32mp1xx_gpio.h"
    4. #include "stm32mp1xx_rcc.h"
    5. #include "stm32mp1xx_exti.h"
    6. #include "stm32mp1xx_gic.h"
    7. void key1_Init(void);
    8. void key2_Init(void);
    9. void key3_Init(void);
    10. #endif

    do_irq.c

    1. #include "key.h"
    2. #include "led.h"
    3. #include "beep.h"
    4. #include "fan.h"
    5. #include "motor.h"
    6. #include "delay.h"
    7. extern void printf(const char *fmt, ...);
    8. unsigned int i = 0;
    9. void do_irq(void)
    10. {
    11. static int flag1=1;
    12. static int flag2=1;
    13. static int flag3=1;
    14. //获取中断号
    15. unsigned int irqnumb=(GICC->IAR&0X3FF);
    16. switch (irqnumb)
    17. {
    18. case 99:{
    19. //进行中断处理
    20. if (flag1==1)
    21. {
    22. LED1_ON();
    23. LED2_ON();
    24. LED3_ON();
    25. printf("LED1打开\n");
    26. printf("LED2打开\n");
    27. printf("LED3打开\n");
    28. flag1=0;
    29. }
    30. else if (flag1==0)
    31. {
    32. LED1_OFF();
    33. LED2_OFF();
    34. LED3_OFF();
    35. printf("LED1关闭\n");
    36. printf("LED2关闭\n");
    37. printf("LED3关闭\n");
    38. flag1=1;
    39. }
    40. //清除GICD中的中断排队标志
    41. GICD->ICPENDR[3] |= (0X1<<3);
    42. //清除EXTI中的事件挂起标志
    43. EXTI->FPR1 |= (0x1<<9);
    44. break;
    45. }
    46. case 98:{
    47. //进行中断处理
    48. if (flag2==1)
    49. {
    50. BEEP_Open();
    51. printf("BEEP打开\n");
    52. flag2=0;
    53. }
    54. else if (flag2==0)
    55. {
    56. BEEP_Close();
    57. printf("BEEP关闭\n");
    58. flag2=1;
    59. }
    60. //清除GICD中的中断排队标志
    61. GICD->ICPENDR[3] |= (0X1<<2);
    62. //清除EXTI中的事件挂起标志
    63. EXTI->FPR1 |= (0x1<<8);
    64. break;
    65. }
    66. case 97:{
    67. //进行中断处理
    68. if (flag3==1)
    69. {
    70. Fan_Open();
    71. Motor_Open();
    72. printf("FAN打开\n");
    73. printf("Motor打开\n");
    74. flag3=0;
    75. }
    76. else if (flag3==0)
    77. {
    78. Fan_Close();
    79. Motor_Close();
    80. printf("FAN关闭\n");
    81. printf("Motor关闭\n");
    82. flag3=1;
    83. }
    84. //清除GICD中的中断排队标志
    85. GICD->ICPENDR[3] |= (0X1<<1);
    86. //清除EXTI中的事件挂起标志
    87. EXTI->FPR1 |= (0x1<<7);
    88. break;
    89. }
    90. }
    91. //清除IAR保存的中断号
    92. GICC->EOIR |= irqnumb;
    93. }

  • 相关阅读:
    Dart-C、Dart-Kotlin/Java/Swift/Object-C、Kotlin-C数据类型对照表
    使springAOP生效不一定要加@EnableAspectJAutoProxy注解
    大一作业HTML网页作业 HTML校园篮球网页作业(12个页面)
    【SpringCloud学习笔记】Elasticsearch
    LQ0041 特别数的和【进制】
    Leetcode 1696. Jump Game VI (DP + 单调队列)
    uname
    计算机毕业设计之java+ssm在线心理评测与咨询系统
    88 合并两个有序数组
    在Linux中lsof命令示例
  • 原文地址:https://blog.csdn.net/m0_57524068/article/details/139127068