• 10月12日


    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 led_init();
    9. void buzzer_init();
    10. void fan_init();
    11. #endif

    key_it.c

    1. #include"key_it.h"
    2. //中断初始化
    3. void key_it_config()
    4. {
    5. //RCC使能GPIOF时钟
    6. RCC->MP_AHB4ENSETR |= (0x1<<5);
    7. //设置PF9 PF7 PF8GPIO输入
    8. //PF9
    9. GPIOF->MODER &= (~(0x3<<18));
    10. //PF8
    11. GPIOF->MODER &= (~(0x3<<16));
    12. //pf7
    13. GPIOF->MODER &= (~(0x3<<14));
    14. //设置PF9 PF7 PF8产生EXTI事件 EXTI_EXTICRx
    15. //pf7
    16. EXTI->EXTICR2 &=(~(0xFF)<<24);
    17. EXTI->EXTICR2 |= (0x5<<24);
    18. //pf9
    19. EXTI->EXTICR3 &=(~(0xFF)<<8);
    20. EXTI->EXTICR3 |= (0x5<<8);
    21. //pf8
    22. EXTI->EXTICR3 &=(~(0xFF)<<0);
    23. EXTI->EXTICR3 |= (0x5<<0);
    24. //设置事件触发方式为下降沿触发EXTI_FTSR1
    25. //pf7
    26. EXTI->FTSR1 |= (0x1<<7);
    27. //pf8
    28. EXTI->FTSR1 |= (0x1<<8);
    29. //pf9
    30. EXTI->FTSR1 |= (0x1<<9);
    31. //设置EXTI事件触发不屏蔽EXTI_IMR1
    32. //PF7
    33. EXTI->C1IMR1 |= (0x1<<7);
    34. //PF8
    35. EXTI->C1IMR1 |= (0x1<<8);
    36. //PF9
    37. EXTI->C1IMR1 |= (0x1<<9);
    38. //使能中断能转发到特定的CPU接口层GICD_ISENABLERx
    39. //PF7 97号中断
    40. GICD->ISENABLER[3] |= (0X1<<1);
    41. //PF78 98号中断
    42. GICD->ISENABLER[3] |= (0X1<<2);
    43. //PF9 99号中断
    44. GICD->ISENABLER[3] |= (0X1<<3);
    45. //GICD_ISENABLERx设置中断优先级
    46. //PF7
    47. GICD->IPRIORITYR[24] &= (~(0X1F<<11));
    48. //PF8
    49. GICD->IPRIORITYR[24] &= (~(0X1F<<19));
    50. //PF9
    51. GICD->IPRIORITYR[24] &= (~(0X1F<<27));
    52. //设置当前中断被转发到哪一个CPU处理GICD_ITARGETSRx
    53. //pf7 97中断
    54. GICD->ITARGETSR[24] &= (~(0X3<<8));
    55. GICD->ITARGETSR[24] |= (0X1<<8);
    56. //pf8 98中断
    57. GICD->ITARGETSR[24] &= (~(0X3<<16));
    58. GICD->ITARGETSR[24] |= (0X1<<16);
    59. //pf9 99中断
    60. GICD->ITARGETSR[24] &= (~(0X3<<24));
    61. GICD->ITARGETSR[24] |= (0X1<<24);
    62. //使能组0转发中断GICD_CTLR
    63. GICD->CTRL |= 0X1;
    64. //设置中断优先级掩码GICC_PMR
    65. GICC->PMR |= (0x1F<<3);
    66. //使能CPU可以处理组0转发的中断GICC_CTLR
    67. GICC->CTRL |= 0X1;
    68. }
    69. //led初始化
    70. void led_init()
    71. {
    72. //RCC使能
    73. RCC->MP_AHB4ENSETR |= (0x3<<4);
    74. //设置PE10 PB6为输出
    75. GPIOE->MODER &= (~(0x3)<<20);
    76. GPIOE->MODER |= (0x1<<20);
    77. //设置推挽输出
    78. GPIOE->OTYPER &= (~(0x1<<10));
    79. //设置三个管脚低速输出
    80. GPIOE->OSPEEDR &= (~0x3<<20);
    81. //设置三个管脚输出时无上拉下拉电阻
    82. GPIOE->PUPDR &= (~(0x3)<<20);
    83. }
    84. //buzzer初始化
    85. void buzzer_init()
    86. {
    87. //RCC使能
    88. RCC->MP_AHB4ENSETR |= (0x3<<1);
    89. //设置PE10 PB6为输出
    90. GPIOB->MODER &= (~(0x3)<<12);
    91. GPIOB->MODER |= (0x1<<12);
    92. //设置推挽输出
    93. GPIOB->OTYPER &= (~(0x1<<6));
    94. //设置三个管脚低速输出
    95. GPIOB->OSPEEDR &= (~0x3<<12);
    96. //设置三个管脚输出时无上拉下拉电阻
    97. GPIOB->PUPDR &= (~(0x3)<<12);
    98. }
    99. //fan初始化
    100. void fan_init()
    101. {
    102. //RCC使能
    103. RCC->MP_AHB4ENSETR |= (0x3<<4);
    104. //设置PE10 PB6为输出
    105. GPIOE->MODER &= (~(0x3)<<18);
    106. GPIOE->MODER |= (0x1<<18);
    107. //设置推挽输出
    108. GPIOE->OTYPER &= (~(0x1<<9));
    109. //设置三个管脚低速输出
    110. GPIOE->OSPEEDR &= (~0x3<<18);
    111. //设置三个管脚输出时无上拉下拉电阻
    112. GPIOE->PUPDR &= (~(0x3)<<18);
    113. }

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

    main.c

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

  • 相关阅读:
    codeforces:E. MEX and Increments【贪心 + 略加优化】
    Centos7安装MongoDB7.xxNoSQL数据库(骨灰级+保姆级)
    数据集成:数据挖掘的准备工作之一
    18.在springboot中的RedisTemplate序列化,json序列化
    高效解决触客难题的外呼系统,其实原理很简单!
    如何快速判断IP被墙
    中小企业如何选择进销存软件?
    babel-loader
    SVN创建分支与合并分支
    Linux CentOS8 安装MySQL步骤-(rpm方式)
  • 原文地址:https://blog.csdn.net/mcslll/article/details/133798638