ZBLOG

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

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

#include "stm32f4xx.h"

#define RED_LED_PIN   GPIO_Pin_12
#define GREEN_LED_PIN GPIO_Pin_13
#define BLUE_LED_PIN  GPIO_Pin_14

void EXTI0_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
        // 按下KEY1,红灯闪烁
        static uint8_t red_led_state = 0;
        red_led_state = !red_led_state;
        GPIO_WriteBit(GPIOD, RED_LED_PIN, red_led_state ? Bit_SET : Bit_RESET);

        EXTI_ClearITPendingBit(EXTI_Line0);
    }
}

void EXTI1_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line1) != RESET) {
        // 按下KEY2,绿灯闪烁
        static uint8_t green_led_state = 0;
        green_led_state = !green_led_state;
        GPIO_WriteBit(GPIOD, GREEN_LED_PIN, green_led_state ? Bit_SET : Bit_RESET);

        EXTI_ClearITPendingBit(EXTI_Line1);
    }
}

void EXTI15_10_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line10) != RESET && EXTI_GetITStatus(EXTI_Line11) != RESET) {
        // 同时按下KEY1和KEY2,所有指示灯闪烁三次,随后蓝色指示灯闪烁
        int i;

        for (i = 0; i < 3; i++) {
            GPIO_ToggleBits(GPIOD, RED_LED_PIN | GREEN_LED_PIN);
            delay_ms(500);
            GPIO_ToggleBits(GPIOD, RED_LED_PIN | GREEN_LED_PIN);
            delay_ms(500);
        }

        GPIO_WriteBit(GPIOD, BLUE_LED_PIN, Bit_SET);

        EXTI_ClearITPendingBit(EXTI_Line10);
        EXTI_ClearITPendingBit(EXTI_Line11);
    }
}

int main(void)
{
    // 初始化LED引脚和按键引脚
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_Pin = RED_LED_PIN | GREEN_LED_PIN | BLUE_LED_PIN;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStruct);

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

    // 配置KEY1的GPIO为输入模式,上拉
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_0 ;
	GPIO_InitStruct.GPIO_PuPd = 	GPIO_PuPd_UP ;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	// 配置KEY2的GPIO为输入模式,上拉
	GPIO_InitStruct.GPIO_Mode = 	GPIO_Mode_IN ;
	GPIO_InitStruct.GPIO_Pin = 	GPIO_Pin_1 ;
	GPIO_Init(GPIOA,&GPIO_InitStruct);


	// 启用SYSCFG时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG , ENABLE ) ;

	// 连接PA0到EXTI线0
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA , EXTI_PinSource0) ;
	// 连接PA1到EXTI线1
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA , EXTI_PinSource1) ;
	// 连接PA10到EXTI线10
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA , EXTI_PinSource10 ) ;
	// 连接PA11到EXTI线11
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA , EXTI_PinSource11 ) ;


	/* 配置KEY1的中断 */
    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger =  EXTI_Trigger_Falling; // 下降沿触发中断
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2 );
	NVIC_InitStructure.NVIC_IRQChannel = 		EXTI0_IRQn ;  /*使能按键K1的中断通道*/
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00 ; /*抢占优先级为0,子优先级为0*/
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 			 0x00 ; /* 抢占优先级为0,子优先级为0*/
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE ;
	NVIC_Init(&NVIC_InitStructur);

	/* 配置KEY2的中断 */
     EXT_MaskPinKey("key2");
         GPIO_InitStruct.GPIO_Mode= GPIO_Mode_IN;           
         GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;            
         GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;
         GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP ;
         GPIO_Init(GPIOA,&GPIO_InitStructure);
         
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);   
         SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource1);
         
        EXTI_InitStructure.EXTI_Line = EXTI_Line1;     
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;      
        EXTI_InitStructure.EXTI_Trigger =  EXTI_Trigger_Falling;    
        EXTI_InitStructure.EXTI_LineCmd = ENABLE; 
        EXTI_Init(&EXTI_InitStructure);

	 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2 );
       NVIC_InitStructure.NVIC_IRQChannel = 		EXTI1_IRQn ; /*使能按键K2的中断通道*/
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01 ;/*抢占优先级为1,子优先级为0*/
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 			 0x00 ;/* 抢占优先级为1,子优先级为0*/
	NVIC_Init(&NVIC_InitStructur);

    /* 配置KEY1和KEY2同时按下的中断 */
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA , EXTI_PinSource10 ) ;
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA , EXTI_PinSource11 ) ;

    // 中断配置
    EXTI_ClearITPendingBit(EXTI_Line10);
    EXTI_ClearITPendingBit(EXTI_Line11);

    NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x02;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);

    while (1) {
        // 等待中断触发
    }
}

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


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?