当前位置:   article > 正文

12.26ARM作业

12.26ARM作业

三个按键中断,控制对应灯亮灭

main.c

  1. #include "key_it.h"
  2. void delay(int ms)
  3. {
  4. int i,j;
  5. for(i=0;i<ms;i++)
  6. {
  7. for(j=0;j<2000;j++);
  8. }
  9. }
  10. int main()
  11. {
  12. all_led_init();
  13. key1_it_config();
  14. key2_it_config();
  15. key3_it_config();
  16. while(1)
  17. {
  18. printf("do main...\n");
  19. delay(1000);
  20. }
  21. }

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 = (GICC->IAR & 0x3ff);
  7. switch(irqno)
  8. {
  9. case 99:
  10. printf("KEY1_INT\n");
  11. led1_on();
  12. led2_off();
  13. led3_off();
  14. //求出GICD的中断排队标志
  15. GICD->ICPENDR[3] |= (0x1<<3);
  16. //清除exti的事件触发标志
  17. EXTI->FPR1 |= (0x1<<9);
  18. break;
  19. case 97:
  20. printf("KEY2_INT\n");
  21. led1_off();
  22. led2_on();
  23. led3_off();
  24. GICD->ICPENDR[1] |= (0x1);
  25. EXTI->FPR1 |= (0x1<<7);
  26. break;
  27. case 98:
  28. printf("KEY3_INT\n");
  29. led1_off();
  30. led2_off();
  31. led3_on();
  32. GICD->ICPENDR[2] |= (0x1<<2);
  33. EXTI->FPR1 |= (0x1<<8);
  34. break;
  35. }
  36. GICC->EOIR = irqno;
  37. }

key_it.c

  1. #include "key_it.h"
  2. void key1_it_config()
  3. {
  4. //使能GPIOF时钟
  5. RCC->MP_AHB4ENSETR |= (0x1<<5);
  6. //设置PF9管脚为输入
  7. GPIOF->MODER &= (~(0x3<<18));
  8. //设置PF9作为EXTI9事件的输入
  9. EXTI->EXTICR3 &= (~(0x1f<<8));
  10. EXTI->EXTICR3 |= (0x05<<8);
  11. //设置下降沿使能检测EXTI9事件
  12. EXTI->FTSR1 |= (0x1<<9);
  13. //设置EXTI9事件不屏蔽
  14. EXTI->C1IMR1 |= (0x1<<9);
  15. //GICD使能EXTI999号)中断
  16. GICD->ISENABLER[3] |= (0x1<<3);
  17. //GICD 设置99号中断的优先级
  18. GICD->IPRIORITYR[24] &= (~(0x1f<<27));
  19. //选择CPU0处理当前中断
  20. GICD->ITARGETSR[24] |= (0x1<<24);
  21. //全局使能组0中断被转发到GICC
  22. GICD->CTRL |= (0X1);
  23. //设置中断的优先级掩码
  24. GICC->PMR |= (0x1f<<3);
  25. //允许组0中断被CPU处理
  26. GICC->CTRL |= (0x1);
  27. }
  28. void key2_it_config()
  29. {
  30. //使能GPIOF时钟
  31. //RCC->MP_AHB4ENSETR |= (0x1<<5);
  32. //设置PF7管脚为输入
  33. GPIOF->MODER &=(~(0x3<<14));
  34. //设置PF7作为EXTI7事件的输入
  35. EXTI->EXTICR2 &=(~(0x1f<<24));
  36. EXTI->EXTICR2 |=(0x05<<24);
  37. //设置下降沿使能检测EXTI9事件
  38. EXTI->FTSR1 |=(0x1<<7);
  39. //设置EXTI7事件不屏蔽
  40. EXTI->C1IMR1 |=(0x1<<7);
  41. //GICO使能EXTI7(97号)中断
  42. GICD->ISENABLER[3] |=(0x1<<1);
  43. //GICO设置97号中断的优先级
  44. GICD->IPRIORITYR[24] &=(~(0x1f<<11));
  45. //选择CPU0处理当前中断
  46. GICD->ITARGETSR[24] |=(0x1<<8);
  47. //全局使能组0中断被转发到GICC
  48. GICD->CTRL |= (0x1);
  49. //设置中断的优先级掩码
  50. GICC->PMR |= (0x1f<<3);
  51. //允许组0中断被CPU处理
  52. GICC->CTRL |= (0x1);
  53. }
  54. void key3_it_config()
  55. {
  56. //使能GPIOF时钟
  57. RCC->MP_AHB4ENSETR |= (0x1<<5);
  58. //设置PF8管脚为输入
  59. GPIOF->MODER &=(~(0x3<<16));
  60. //设置PF8作为EXTI8事件的输入
  61. EXTI->EXTICR3 &=(~(0x1f));
  62. EXTI->EXTICR3 |=(0x05);
  63. //设置下降沿使能检测EXTI8事件
  64. EXTI->FTSR1 |=(0x1<<8);
  65. //设置EXTI9事件不屏蔽
  66. EXTI->C1IMR1 |=(0x1<<8);
  67. //GICO使能EXTI8(98号)中断
  68. GICD->ISENABLER[3] |=(0x1<<2);
  69. //GICO设置98号中断的优先级
  70. GICD->IPRIORITYR[24] &=(~(0x1f<<19));
  71. //选择CPU0处理当前中断
  72. GICD->ITARGETSR[24] |=(0x1<<16);
  73. //全局使能组0中断被转发到GICC
  74. GICD->CTRL |= (0x1);
  75. //设置中断的优先级掩码
  76. GICC->PMR |= (0x1f<<3);
  77. //允许组0中断被CPU处理
  78. GICC->CTRL |= (0x1);
  79. }

key_it.h

  1. #ifndef __KEY_IT_H__
  2. #define __KEY_IT_H__
  3. #include "stm32mp1xx_gpio.h"
  4. #include "stm32mp1xx_gic.h"
  5. #include "stm32mp1xx_exti.h"
  6. #include "stm32mp1xx_rcc.h"
  7. #include"stm32mp1xx_uart.h"
  8. void key1_it_config();
  9. void key2_it_config();
  10. void key3_it_config();
  11. void all_led_init();
  12. void led1_on();
  13. void led1_off();
  14. void led2_on();
  15. void led2_off();
  16. void led3_on();
  17. void led3_off();
  18. #endif

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/448093
推荐阅读
相关标签
  

闽ICP备14008679号