• 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. }

  • 相关阅读:
    C++11新特性 auto
    Python Tkinter Multiple Windows 教程
    3年测试经验,投了300多份简历,没公司要我...
    Ubuntu20.04环境下Baxter机器人开发环境搭建
    C++-指针
    CSDN 五一创作勋章Lv4 勋章_(标签-ar)
    spring boot过滤器实现项目内接口过滤
    stm32 cubeide ad转换与串口问题
    Http代理与socks5代理有何区别?如何选择?(二)
    【3. 操作系统—物理内存管理】
  • 原文地址:https://blog.csdn.net/qq_53478460/article/details/133798271