使用STM32实现按键控制LED

#include "stm32f10x.h"

void GPIO_Init(void); void EXTI_Config(void); void NVIC_Config(void);

int main(void) { GPIO_Init(); EXTI_Config(); NVIC_Config();

while(1)
{
    
}

}

void GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStruct);

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStruct);

}

void EXTI_Config(void) { EXTI_InitTypeDef EXTI_InitStruct;

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

EXTI_InitStruct.EXTI_Line = EXTI_Line0;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);

}

void NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStruct;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);

}

void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET) { GPIO_SetBits(GPIOC, GPIO_Pin_13); } else { GPIO_ResetBits(GPIOC, GPIO_Pin_13); }

    EXTI_ClearITPendingBit(EXTI_Line0);
}

} 以上是基于STM32的按键控制LED的代码案例,下面进行详细的解释:

  1. 首先在main()函数中调用GPIO_Init()函数完成GPIO的初始化,也就是将LED引脚PC13设置为输出模式,按键引脚PA0设置为上拉输入模式。

  2. 在GPIO_Init()函数中,首先使能GPIOC的时钟,并设置PC13引脚的模式为推挽输出,速度为50MHz;然后使能GPIOA的时钟,并设置PA0引脚的模式为上拉输入。

  3. 然后调用EXTI_Config()函数完成外部中断的配置,也就是将PA0引脚与EXTI_Line0连通,并设置外部中断触发方式为上升沿和下降沿触发,并使能外部中断。

  4. 在EXTI_Config()函数中,使用GPIO_EXTILineConfig()函数将GPIO引脚与对应的外部中断线连接起来;然后使用EXTI_InitStruct结构体对外部中断线进行配置,设置外部中断线为EXTI_Line0,触发方式为上升沿和下降沿触发,并使能外部中断。

  5. 接下来调用NVIC_Config()函数完成中断向量表的配置,设置中断优先级组为1,也就是2位抢占优先级和2位响应优先级组合;然后使用NVIC_InitStruct结构体对中断向量进行配置,设置中断向量为EXTI0_IRQn,抢占优先级为0,响应优先级为0,并使能中断。

  6. 最后在EXTI0_IRQHandler()函数中处理外部中断的中断处理函数,首先判断是否是EXTI_Line0触发的中断,然后判断PA0引脚的状态,如果是按下状态,则设置PC13引脚为高电平,点亮LED;如果是松开状态,则清空PC13引脚的高电平,熄灭LED。最后清除外部中断标志位。

这样就完成了基于STM32的按键控制LED的功能。当按下按键时,PC13引脚输出高电平,LED点亮;当松开按键时,PC13引脚输出低电平,LED熄灭。以上是基本的代码,你可以根据实际需求进行修改和扩展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值