• ARM中断实验


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

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

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

    main.c

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

    do_irp.c

    1. #include "key_it.h"
    2. #include "uart1.h"
    3. extern void printf(const char *fmt, ...);
    4. unsigned int i = 0;
    5. unsigned int num1=0,num2=0,num3=0;
    6. void do_irq(void)
    7. {
    8. int irqno;//保存中断号
    9. irqno = GICC->IAR&0X3FF;
    10. switch(irqno)
    11. {
    12. case 99://key1
    13. //按键1中断处理
    14. printf("KEY1 INT\n");
    15. //灯亮
    16. if(num1 == 0)
    17. {
    18. //PF10
    19. GPIOF->ODR |= (0x1<<10);
    20. //PE10 PE8
    21. GPIOE->ODR |= (0x5<<8);
    22. num1++;
    23. }
    24. //灯灭
    25. else if(num1 > 0)
    26. {
    27. //PF10
    28. GPIOF->ODR &= ~(0x1<<10);
    29. //PE10 PE8
    30. GPIOE->ODR &= ~(0x5<<8);
    31. num1 = 0;
    32. }
    33. //清除挂起中断标志位GICD_ICPENDRx
    34. GICD->ICPENDR[3] |= (0x1<<3);
    35. //清除中断触发标志位EXTI_FRR1
    36. EXTI->FPR1 |= (0x1<<9);
    37. break;
    38. case 97://key2
    39. //按键2中断处理
    40. printf("KEY2 INT\n");
    41. //蜂鸣器转
    42. if(num2 == 0)
    43. {
    44. //PB6
    45. GPIOB->ODR |= (0x1<<6);
    46. num2++;
    47. }
    48. //蜂鸣器停
    49. else if(num2 > 0)
    50. {
    51. //PB6
    52. GPIOB->ODR &= ~(0x1<<6);
    53. num2 = 0;
    54. }
    55. //清除挂起中断标志位GICD_ICPENDRx
    56. GICD->ICPENDR[3] |= (0x1<<1);
    57. //清除中断触发标志位EXTI_FRR1
    58. EXTI->FPR1 |= (0x1<<7);
    59. break;
    60. case 98://key3
    61. //按键3中断处理
    62. printf("KEY3 INT\n");
    63. //风扇转
    64. if(num3 == 0)
    65. {
    66. //PE9
    67. GPIOE->ODR |= (0x1<<9);
    68. num3++;
    69. }
    70. //风扇停
    71. else if(num3 > 0)
    72. {
    73. //PE9
    74. GPIOE->ODR &= ~(0x1<<9);
    75. num3 = 0;
    76. }
    77. //清除挂起中断标志位GICD_ICPENDRx
    78. GICD->ICPENDR[3] |= (0x1<<2);
    79. //清除中断触发标志位EXTI_FRR1
    80. EXTI->FPR1 |= (0x1<<8);
    81. break;
    82. }
    83. //清除处理完的中断号GICC_EOIR
    84. GICC->EOIR=irqno;
    85. }

    key_it.c

    1. #include "key_it.h"
    2. #include "uart1.h"
    3. extern void printf(const char *fmt, ...);
    4. unsigned int i = 0;
    5. unsigned int num1=0,num2=0,num3=0;
    6. void do_irq(void)
    7. {
    8. int irqno;//保存中断号
    9. irqno = GICC->IAR&0X3FF;
    10. switch(irqno)
    11. {
    12. case 99://key1
    13. //按键1中断处理
    14. printf("KEY1 INT\n");
    15. //灯亮
    16. if(num1 == 0)
    17. {
    18. //PF10
    19. GPIOF->ODR |= (0x1<<10);
    20. //PE10 PE8
    21. GPIOE->ODR |= (0x5<<8);
    22. num1++;
    23. }
    24. //灯灭
    25. else if(num1 > 0)
    26. {
    27. //PF10
    28. GPIOF->ODR &= ~(0x1<<10);
    29. //PE10 PE8
    30. GPIOE->ODR &= ~(0x5<<8);
    31. num1 = 0;
    32. }
    33. //清除挂起中断标志位GICD_ICPENDRx
    34. GICD->ICPENDR[3] |= (0x1<<3);
    35. //清除中断触发标志位EXTI_FRR1
    36. EXTI->FPR1 |= (0x1<<9);
    37. break;
    38. case 97://key2
    39. //按键2中断处理
    40. printf("KEY2 INT\n");
    41. //蜂鸣器转
    42. if(num2 == 0)
    43. {
    44. //PB6
    45. GPIOB->ODR |= (0x1<<6);
    46. num2++;
    47. }
    48. //蜂鸣器停
    49. else if(num2 > 0)
    50. {
    51. //PB6
    52. GPIOB->ODR &= ~(0x1<<6);
    53. num2 = 0;
    54. }
    55. //清除挂起中断标志位GICD_ICPENDRx
    56. GICD->ICPENDR[3] |= (0x1<<1);
    57. //清除中断触发标志位EXTI_FRR1
    58. EXTI->FPR1 |= (0x1<<7);
    59. break;
    60. case 98://key3
    61. //按键3中断处理
    62. printf("KEY3 INT\n");
    63. //风扇转
    64. if(num3 == 0)
    65. {
    66. //PE9
    67. GPIOE->ODR |= (0x1<<9);
    68. num3++;
    69. }
    70. //风扇停
    71. else if(num3 > 0)
    72. {
    73. //PE9
    74. GPIOE->ODR &= ~(0x1<<9);
    75. num3 = 0;
    76. }
    77. //清除挂起中断标志位GICD_ICPENDRx
    78. GICD->ICPENDR[3] |= (0x1<<2);
    79. //清除中断触发标志位EXTI_FRR1
    80. EXTI->FPR1 |= (0x1<<8);
    81. break;
    82. }
    83. //清除处理完的中断号GICC_EOIR
    84. GICC->EOIR=irqno;
    85. }

  • 相关阅读:
    网工内推 | Linux运维,六险二金,最高30K,IE认证优先
    SQL 报表制作和整形
    中国高产水稻促粮食增产 国稻种芯:为碳减排做出重要贡献
    微信小程序查询接口
    我的创作纪念日
    小程序商城深度运营方案及众筹案例分享
    ES的常用查询
    实施MES管理系统前,要对哪些问题进行评估
    [EasyExcel] 导出合并单元格
    Vue项目搭建及使用vue-cli创建项目、创建登录页面、与后台进行交互,以及安装和使用axios、qs和vue-axios
  • 原文地址:https://blog.csdn.net/qq_53478460/article/details/133798271