ZBLOG

stm32中断实现) 按下KEY1 红灯闪烁(频率肉眼可见) 再一次按下KYE1 红灯停止闪烁 按下KEY2 绿灯闪烁 再一次按下KEY2 绿灯停止闪烁 KEY1 KEY2同时按下 所有指示灯闪烁三次,随后蓝色指示灯闪烁 再一次同时按下KEY1 KEY2,全部指示灯熄灭 以上功能可重复复触发

以下是使用STM32中断实现上述功能的示例代码:

  1. #include "stm32f4xx.h"
  2. #define RED_LED_PIN GPIO_Pin_12
  3. #define GREEN_LED_PIN GPIO_Pin_13
  4. #define BLUE_LED_PIN GPIO_Pin_14
  5. void EXTI0_IRQHandler(void)
  6. {
  7. if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
  8. // 按下KEY1,红灯闪烁
  9. static uint8_t red_led_state = 0;
  10. red_led_state = !red_led_state;
  11. GPIO_WriteBit(GPIOD, RED_LED_PIN, red_led_state ? Bit_SET : Bit_RESET);
  12. EXTI_ClearITPendingBit(EXTI_Line0);
  13. }
  14. }
  15. void EXTI1_IRQHandler(void)
  16. {
  17. if (EXTI_GetITStatus(EXTI_Line1) != RESET) {
  18. // 按下KEY2,绿灯闪烁
  19. static uint8_t green_led_state = 0;
  20. green_led_state = !green_led_state;
  21. GPIO_WriteBit(GPIOD, GREEN_LED_PIN, green_led_state ? Bit_SET : Bit_RESET);
  22. EXTI_ClearITPendingBit(EXTI_Line1);
  23. }
  24. }
  25. void EXTI15_10_IRQHandler(void)
  26. {
  27. if (EXTI_GetITStatus(EXTI_Line10) != RESET && EXTI_GetITStatus(EXTI_Line11) != RESET) {
  28. // 同时按下KEY1和KEY2,所有指示灯闪烁三次,随后蓝色指示灯闪烁
  29. int i;
  30. for (i = 0; i < 3; i++) {
  31. GPIO_ToggleBits(GPIOD, RED_LED_PIN | GREEN_LED_PIN);
  32. delay_ms(500);
  33. GPIO_ToggleBits(GPIOD, RED_LED_PIN | GREEN_LED_PIN);
  34. delay_ms(500);
  35. }
  36. GPIO_WriteBit(GPIOD, BLUE_LED_PIN, Bit_SET);
  37. EXTI_ClearITPendingBit(EXTI_Line10);
  38. EXTI_ClearITPendingBit(EXTI_Line11);
  39. }
  40. }
  41. int main(void)
  42. {
  43. // 初始化LED引脚和按键引脚
  44. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
  45. GPIO_InitTypeDef GPIO_InitStruct;
  46. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  47. GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  48. GPIO_InitStruct.GPIO_Pin = RED_LED_PIN | GREEN_LED_PIN | BLUE_LED_PIN;
  49. GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  50. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  51. GPIO_Init(GPIOD, &GPIO_InitStruct);
  52. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  53. // 配置KEY1的GPIO为输入模式,上拉
  54. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
  55. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 ;
  56. GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP ;
  57. GPIO_Init(GPIOA,&GPIO_InitStruct);
  58. // 配置KEY2的GPIO为输入模式,上拉
  59. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN ;
  60. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 ;
  61. GPIO_Init(GPIOA,&GPIO_InitStruct);
  62. // 启用SYSCFG时钟
  63. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG , ENABLE ) ;
  64. // 连接PA0到EXTI线0
  65. SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA , EXTI_PinSource0) ;
  66. // 连接PA1到EXTI线1
  67. SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA , EXTI_PinSource1) ;
  68. // 连接PA10到EXTI线10
  69. SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA , EXTI_PinSource10 ) ;
  70. // 连接PA11到EXTI线11
  71. SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA , EXTI_PinSource11 ) ;
  72. /* 配置KEY1的中断 */
  73. EXTI_InitTypeDef EXTI_InitStructure;
  74. EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  75. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  76. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发中断
  77. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  78. EXTI_Init(&EXTI_InitStructure);
  79. NVIC_InitTypeDef NVIC_InitStructure;
  80. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2 );
  81. NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn ; /*使能按键K1的中断通道*/
  82. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00 ; /*抢占优先级为0,子优先级为0*/
  83. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00 ; /* 抢占优先级为0,子优先级为0*/
  84. NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE ;
  85. NVIC_Init(&NVIC_InitStructur);
  86. /* 配置KEY2的中断 */
  87. EXT_MaskPinKey("key2");
  88. GPIO_InitStruct.GPIO_Mode= GPIO_Mode_IN;
  89. GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
  90. GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;
  91. GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP ;
  92. GPIO_Init(GPIOA,&GPIO_InitStructure);
  93. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  94. SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource1);
  95. EXTI_InitStructure.EXTI_Line = EXTI_Line1;
  96. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  97. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  98. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  99. EXTI_Init(&EXTI_InitStructure);
  100. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2 );
  101. NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn ; /*使能按键K2的中断通道*/
  102. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01 ;/*抢占优先级为1,子优先级为0*/
  103. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00 ;/* 抢占优先级为1,子优先级为0*/
  104. NVIC_Init(&NVIC_InitStructur);
  105. /* 配置KEY1和KEY2同时按下的中断 */
  106. SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA , EXTI_PinSource10 ) ;
  107. SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA , EXTI_PinSource11 ) ;
  108. // 中断配置
  109. EXTI_ClearITPendingBit(EXTI_Line10);
  110. EXTI_ClearITPendingBit(EXTI_Line11);
  111. NVIC_InitTypeDef NVIC_InitStruct;
  112. NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
  113. NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x02;
  114. NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00;
  115. NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  116. NVIC_Init(&NVIC_InitStruct);
  117. while (1) {
  118. // 等待中断触发
  119. }
  120. }

这段代码通过使用外部中断的方式来监听按键事件,根据按键的不同触发相应的操作。其中,红灯、绿灯和蓝灯分别使用GPIO控制,按下KEY1时红灯闪烁,再次按下KEY1时红灯停止闪烁;按下KEY2时绿灯闪烁,再次按下KEY2时绿灯停止闪烁;同时按下KEY1和KEY2时所有指示灯闪烁三次,随后蓝色指示灯闪烁;再次同时按下KEY1和KEY2时全部指示灯熄灭。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=9154

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?