• ARM按键中断实验


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

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

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

    src/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. printf("%d\n",irqno);
    8. irqno = GICC->IAR&0x3ff;
    9. switch(irqno)
    10. {
    11. case 99://key1
    12. //按键1中断处理
    13. printf("KEY1 灯亮灭\n");
    14. if(GPIOE->ODR & (0X1<<10)){
    15. GPIOE->ODR &= (~(0X1<<10));
    16. }else{
    17. GPIOE->ODR |= (0X1<<10);
    18. }
    19. //清除挂起中断标志位GICD_ICPENDRx
    20. GICD->ICPENDR[3] |= (0X1<<3);
    21. //清除中断触发标志位EXTI_FPR1
    22. EXTI->FPR1 |= (0X1<<9);
    23. break;
    24. case 97://key2
    25. //按键2中断处理
    26. printf("KEY2 蜂鸣器\n");
    27. if(GPIOB->ODR & (0X1<<6)){
    28. GPIOB->ODR &= (~(0X1<<6));
    29. }else{
    30. GPIOB->ODR |= (0X1<<6);
    31. }
    32. //清除挂起中断标志位GICD_ICPENDRx
    33. GICD->ICPENDR[3] |= (0X1<<1);
    34. //清除中断触发标志位EXTI_FPR1
    35. EXTI->FPR1 |= (0X1<<7);
    36. break;
    37. case 98://key3
    38. //按键3中断处理
    39. printf("KEY3 风扇\n");
    40. if(GPIOE->ODR & (0X1<<9)){
    41. GPIOE->ODR &= (~(0X1<<9));
    42. }else{
    43. GPIOE->ODR |= (0X1<<9);
    44. }
    45. //清除挂起中断标志位GICD_ICPENDRx
    46. GICD->ICPENDR[3] |= (0X1<<2);
    47. //清除中断触发标志位EXTI_FPR1
    48. EXTI->FPR1 |= (0X1<<8);
    49. break;
    50. }
    51. //清除处理完的中断号GICC_EOTR
    52. GICC->EOIR = irqno;
    53. }

    src/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. //灯1初始化
    83. void led1_init()
    84. {
    85. RCC->MP_AHB4ENSETR |= (0x1<<4);
    86. GPIOE->MODER &= (~(0X3<<20));
    87. GPIOE->MODER |= (0X1<<20);
    88. GPIOE->OTYPER &= (~(0X1<<10));
    89. GPIOE->OSPEEDR &= (~(0X3<<20));
    90. GPIOE->PUPDR &= (~(0X3<<20));
    91. }
    92. //蜂鸣器初始化
    93. void tim_init()
    94. {
    95. RCC->MP_AHB4ENSETR |= (0x1<<1);
    96. GPIOB->MODER &= (~(0X3<<12));
    97. GPIOB->MODER |= (0X1<<12);
    98. GPIOB->OTYPER &= (~(0X1<<6));
    99. GPIOB->OSPEEDR &= (~(0X3<<12));
    100. GPIOB->PUPDR &= (~(0X3<<12));
    101. }
    102. //风扇初始化
    103. void fan_init()
    104. {
    105. RCC->MP_AHB4ENSETR |= (0x1<<4);
    106. GPIOE->MODER &= (~(0X3<<18));
    107. GPIOE->MODER |= (0X1<<18);
    108. GPIOE->OTYPER &= (~(0X1<<9));
    109. GPIOE->OSPEEDR &= (~(0X3<<18));
    110. GPIOE->PUPDR &= (~(0X3<<18));
    111. }

    测试结果

  • 相关阅读:
    华为vrrp+mstp+dhcp配置案例
    java加载证书报错:IOException : version mismatch: (supported: 00, parsed: 01
    LeetCode-481. 神奇字符串【双指针,字符串】
    Java并发编程实战(1)
    编程时不知道怎么给函数起一个好名字时怎么办
    【玩转C语言】第一讲--->C语言概念
    【二叉树的存储及遍历】
    C语言加密字符(ZZULIOJ1064:加密字符)
    蚂蚁一面凉经
    EXCEL 在列不同单元格之间插入N个空行
  • 原文地址:https://blog.csdn.net/m0_64549633/article/details/133798795