• ARM作业2


    .设置按键中断,按键1按下,LED亮,再按一次,灭

    按键2按下,蜂鸣器响。再按一次,不响

    按键3按下,风扇转,再按一次,风扇停

    头文件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 key3_it_config();
    9. void all_led_init();
    10. void buzzer_init();
    11. void fan_init();
    12. #endif

    源文件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. //设置推挽输出
    90. GPIOE->OTYPER &= (~(0X1<<10));
    91. //设置三个管脚低速输出
    92. GPIOE->OSPEEDR &= (~(0X3<<20));
    93. //设置三个管脚输出时无上拉电阻和下拉电阻
    94. GPIOE->PUPDR &= (~(0X3<<20));
    95. }
    96. void buzzer_init()
    97. {
    98. //RCC使能
    99. RCC->MP_AHB4ENSETR |= (0x1<<1);
    100. //设置PE10 PF10 PE8为输出
    101. GPIOB->MODER &= (~(0X3<<12));
    102. GPIOB->MODER |= (0X1<<12);
    103. //设置推挽输出
    104. GPIOB->OTYPER &= (~(0X1<<6));
    105. //设置三个管脚低速输出
    106. GPIOB->OSPEEDR &= (~(0X3<<12));
    107. //设置三个管脚输出时无上拉电阻和下拉电阻
    108. GPIOB->PUPDR &= (~(0X3<<12));
    109. }
    110. void fan_init(){
    111. //RCC使能
    112. RCC->MP_AHB4ENSETR |= (0x1<<4);
    113. //设置PE9为输出
    114. GPIOE->MODER &= (~(0X3<<18));
    115. GPIOE->MODER |= (0X1<<18);
    116. //设置推挽输出
    117. GPIOE->OTYPER &= (~(0X1<<9));
    118. //设置三个管脚低速输出
    119. GPIOE->OSPEEDR &= (~(0X3<<18));
    120. //设置三个管脚输出时无上拉电阻和下拉电阻
    121. GPIOE->PUPDR &= (~(0X3<<18));
    122. }

    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. printf("KEY1 INT\n");
    13. GPIOE->ODR ^=(0X1<<10);
    14. //清除挂起中断标志位GICD_ICPENDRx
    15. GICD->ICPENDR[3] |= (0x1<<3);
    16. //清除中断触发标志位EXTI_FPR1
    17. EXTI->FPR1 |= (0x1<<9);
    18. break;
    19. case 97://key2
    20. //按键2中断处理
    21. printf("KEY2 INT\n");
    22. GPIOB->ODR ^=(0x1<<6);
    23. //清除挂起中断标志位GICD_ICPENDRx
    24. GICD->ICPENDR[3] |= (0x1<<1);
    25. //清除中断触发标志位EXTI_FPR1
    26. EXTI->FPR1 |= (0x1<<7);
    27. break;
    28. case 98://key3
    29. //按键3中断处理
    30. printf("KEY3 INT\n");
    31. GPIOE->ODR ^=(0x1<<9);
    32. //清除挂起中断标志位GICD_ICPENDRx
    33. GICD->ICPENDR[3] |= (0x1<<2);
    34. //清除中断触发标志位EXTI_FPR1
    35. EXTI->FPR1 |= (0x1<<8);
    36. break;
    37. }
    38. //清除处理完的中断号GICC_EOIR
    39. GICC->EOIR =irqno;
    40. }

    main.c

    1. #include "uart.h"
    2. #include "key_it.h"
    3. int main()
    4. {
    5. all_led_init();
    6. uart4_init();//串口初始化
    7. //中断初始化
    8. key_it_config();
    9. key3_it_config();
    10. buzzer_init();
    11. fan_init();
    12. while(1)
    13. {
    14. //保证主程序不结束
    15. }
    16. return 0;
    17. }

    现象

  • 相关阅读:
    数据序列化协议 Protocol Buffers(Protobuf) 认知
    C++ merge()和inplace_merge()函数用法详解(深入了解,一文学会)
    漫谈计算机网络:概述 ------ 从起源开始到分层协议结构,初识究竟什么是计算机网络?
    [附源码]Python计算机毕业设计Django高血压分析平台
    电脑误删除的文件怎么恢复?妙招解决它
    JavaScript作用域(作用域概述、变量的作用域、作用域链)、JavaScript预解析(特殊案例)
    网络安全工程师必备证书有哪些?
    SpringBoot整合Caffeine实现缓存
    企业电子招标采购系统源码之从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理
    低代码技术研究路径解读|低代码的产生不是偶然,是数字技术发展的必然
  • 原文地址:https://blog.csdn.net/cwj442257772/article/details/133798127