ZBLOG

stm32使用外部中断实现上电后点亮LEDB 检测到KEY1按下后,只有LEDR亮 检测到KEY2按下后,只有LEDG亮 检测到KEY1和KEY2同时按下时,LEDR和LEDB同时点亮,任一KEY抬起后按照b或c方式点亮,都抬起后按照a方式点亮

下面是一个使用外部中断实现上电后点亮LED的示例代码,按照你的要求进行了编写。请注意,具体的硬件平台和引脚配置可能会有所不同,请根据实际情况进行适当修改。

#include "stm32f4xx.h"

void EXTI_Configuration(void);
void GPIO_Configuration(void);

int main(void)
{
    GPIO_Configuration();
    EXTI_Configuration();

    while (1)
    {
        // 主循环中无需执行其他操作
    }
}

void EXTI_Configuration(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);  // 使能SYSCFG时钟

    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0 | EXTI_PinSource1);  // 将KEY1和KEY2连接到外部中断线0和1上

    EXTI_InitTypeDef EXTI_InitStructure;
    
    // 配置外部中断线0
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; // 上升沿和下降沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    
	// 根据需要修改优先级和子优先级
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	
	// 配置外部中断线0的中断优先级和使能
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
    
    EXTI_Init(&EXTI_InitStructure);

    // 配置外部中断线1,与上面类似,不再重复配置
}

void GPIO_Configuration(void)
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 使能GPIOA时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); // 使能GPIOC时钟

    GPIO_InitTypeDef GPIO_InitStructure;

    // 配置LED引脚为输出模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;   // LEDR和LEDG所在的引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    
    GPIO_Init(GPIOC, &GPIO_InitStructure);

	// 配置KEY引脚为输入模式,并启用内部上拉电阻
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;   // KEY1和KEY2所在的引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;   // 启用内部上拉
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void EXTI0_IRQHandler(void)
{
	if (EXTI_GetITStatus(EXTI_Line0) != RESET)
	{
		// 检测到KEY1按下
		
        if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 0)
        {
            // 如果KEY2也按下,则点亮LEDR和LEDB
            GPIO_SetBits(GPIOC, GPIO_Pin_8 | GPIO_Pin_9);
        }
        else
        {
            // 只有KEY1按下,点亮LEDR
            GPIO_SetBits(GPIOC, GPIO_Pin_8);
			GPIO_ResetBits(GPIOC, GPIO_Pin_9);
        }
		
		// 清除中断标志位
		EXTI_ClearITPendingBit(EXTI_Line0);
	}
}

void EXTI1_IRQHandler(void)
{
	if (EXTI_GetITStatus(EXTI_Line1) != RESET)
	{
		// 检测到KEY2按下
		
        if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0)
        {
            // 如果KEY1也按下,则点亮LEDR和LEDB
            GPIO_SetBits(GPIOC, GPIO_Pin_8 | GPIO_Pin_9);
        }
        else
        {
            // 只有KEY2按下,点亮LEDG
			GPIO_SetBits(GPIOC, GPIO_Pin_9);
			GPIO_ResetBits(GPIOC, GPIO_Pin_8);
        }
        
		// 清除中断标志位
		EXTI_ClearITPendingBit(EXTI_Line1);
    }
}

这段代码实现了通过外部中断控制LED的点亮。具体逻辑是根据检测到的按键状态来控制不同的LED灯进行点亮,满足你所描述的要求。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?