STM32实现LED闪烁

本文介绍了如何通过STM32的GPIO接口控制LED灯实现闪烁效果,从硬件连接到GPIO模式配置,再到代码实现,包括第一版和第二版的闪烁程序。文中还提供了GPIO初始化、延迟函数及LED状态反转的宏定义,帮助读者理解并实现基本的GPIO控制技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接着上一篇点亮LED的文章,我们现在准备更进一步,让LED闪烁,如果你了解过我上篇点亮LED文章,并且控制了LED的亮灭状态,可以略过本文章内容,本文章内容跟上篇一样,只是程序有所改变,有兴趣的读者可以参考。

控制LED需要使用到GPIO输入和输出IO口,GPIO是STM32控制管脚,GPIO的管脚与外部设备连接,能够实现与外部进行通信,控制,采集数据等。

相关数据手册连接 提取码:ai24

GPIO框图
在这里插入图片描述
1.1硬件设置
在这里插入图片描述
LED的阴极连接到了STM32的GPIO管脚,只要我们控制GPIO电平的输出状态,赋予高或低电平,就能够控制LED的亮灭状态。如果你的开发板的LED灯连接方式不一样,修改工程相关管脚即可。

要想点亮LED需要了解GPIO模式配置,如下。

在这里插入图片描述
在这里插入图片描述

第一版闪烁LED程序

1、led.h头文件相关宏定义代码

#include "stm32f10x.h"
/* ---------------------------------------------

文件名称:led.h
描述:硬件相关模块封装  宏定义  方便移植  

-----------------------------------------------------*/
#define	GPIO_LED_PROT			GPIOC
#define	GPIO_LED_CLK			RCC_APB2Periph_GPIOC
#define	GPIO_LED_PIN			GPIO_Pin_13

void GPIO_Cofing(void);

2、led.c 文件的代码

RCC_APB2PeriphClockCmd(GPIO_LED_CLK,ENABLE);
配置IO时必须要使能时钟,时钟犹如人的心脏。

#include "bsp-led.h"


void GPIO_Cofing(void)
{

	GPIO_InitTypeDef	GPIO_InitStruct; //声明一个结构体								
	
	RCC_APB2PeriphClockCmd(GPIO_LED_CLK,ENABLE);	//使能GPIOC时钟
		
	GPIO_InitStruct.GPIO_Pin = GPIO_LED_PIN;		//控制PC13管脚
									
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;	//设置管脚为通用推挽输出模式				
	
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;	//设置管脚速率为50MHZ			
	
	GPIO_Init(GPIO_LED_PROT,&GPIO_InitStruct);		//初始化结构体								
}

主函数.main.c

#include "stm32f10x.h"
#include "bsp-led.h"

void DS_delay(uint32_t Count);

int main(void)
{
	
	
	GPIO_Cofing();
	while(1)
	{
		//寄存器GPIOx_BRR 相关寄存器配置请查看手册
		//作用:置1 清除对应ODR为0			注意:低15位有效
		GPIO_ResetBits(GPIO_LED_PROT, GPIO_LED_PIN);
		DS_delay(0XFFFFFF);							//延迟						
		//寄存器GPIOx_BSRR
		//作用: 置1 设置对应ODR为1		
		GPIO_SetBits(GPIO_LED_PROT, GPIO_LED_PIN);
		DS_delay(0XFFFFFF);
	}
}
void DS_delay(uint32_t Count)	//延迟函数
{
	
	while(Count != 0)			//空转
	{
			Count--;
	}
	
}

第二版闪烁LED程序

1、led.h头文件相关宏定义代码

#include "stm32f10x.h"
/* ---------------------------------------------

文件名称:led.h
描述:硬件相关模块封装  宏定义  方便移植  

-----------------------------------------------------*/
#define	GPIO_LED_PROT			GPIOC
#define	GPIO_LED_CLK			RCC_APB2Periph_GPIOC
#define	GPIO_LED_PIN			GPIO_Pin_13


#define METET_LED(p,i)		(p->ODR ^= i)		//反转LED

#define REVERES_LED			METET_LED(GPIO_LED_PROT,GPIO_LED_PIN)

void GPIO_Cofing(void);

2、led.c 文件的代码

#include "bsp-led.h"



void GPIO_Cofing(void)
{

	GPIO_InitTypeDef	GPIO_InitStruct; //声明一个结构体								
	
	RCC_APB2PeriphClockCmd(GPIO_LED_CLK,ENABLE);	//使能GPIOC时钟
		
	GPIO_InitStruct.GPIO_Pin = GPIO_LED_PIN;		//控制PC13管脚
									
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;	//设置管脚为通用推挽输出模式				
	
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;	//设置管脚速率为50MHZ			
	
	GPIO_Init(GPIO_LED_PROT,&GPIO_InitStruct);		//初始化结构体								
}

主函数.main.c

#include "stm32f10x.h"
#include "bsp-led.h"

void DS_delay(uint32_t Count);




int main(void)
{
	
	
	GPIO_Cofing();
	while(1)
	{
		
		REVERES_LED;		//反转LED
		DS_delay(0XFFFFFF);		//延迟

	}
	

}

void DS_delay(uint32_t Count)		//延迟函数
{
	
	while(Count != 0)				//空转
	{
			Count--;
	}
	
}

烧录程序之后就可以看到闪烁LED啦! 想要精准到秒或者毫秒级别可以使用系统滴答定时器Systick 或者 定时器TIMx 后面可能会讲到,因为还在校,时间很少,还要做其他东西,所以有时间的话会更新,

完!

STM32单片机控制LED闪烁通常涉及到以下几个步骤: 1. **配置GPIO**: 首先,需要配置STM32的GPIO端口作为输入输出模式,以便连接到LED。比如使用PA8或PB6这样的GPIO引脚。 2. **初始化定时器**: STM32有许多内置的定时器可以用于生成周期性的脉冲,如TIM1、TIM2等。通过设置定时器的工作模式和计数初值,可以设定LED闪烁的时间间隔。 3. **编写中断服务函数(ISR)**: 如果使用定时器中断方式,需要在中断服务函数中处理LED的状态改变。当定时器溢出时,通过更改GPIO的状态(高电平点亮LED,低电平关闭LED),实现LED闪烁。 4. **主循环**: 在主程序中开启定时器,并进入无限循环等待定时器中断触发。每当中断发生,就更新LED状态,然后继续下一次的计时。 5. **闪烁频率调整**: 调整定时器的预设值或分频系数,可以改变LED闪烁的速度,例如更快或更慢。 以下是一个简单的示例代码片段: ```c TIM_HandleTypeDef htim; GPIO_InitTypeDef GPIO_InitStruct; // 初始化GPIO GPIO_InitStruct.Pin = LED_PIN; // LED引脚 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct); // 初始化定时器 htim.Instance = TIMx; // 替换为实际的定时器实例 htim.Init.Prescaler = (SystemCoreClock / Freq) - 1; // 设置定时器计数值 htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = 0; HAL_TIM_Base_Init(&htim); // 开启定时器 HAL_TIM_Base_Start_IT(&htim); while (1) { // 在这里可以添加LED状态切换的代码 if (HAL_TIM_GetOverrun_IT(&htim)) { HAL_GPIO_TogglePin(LED_PORT, LED_PIN); // 状态切换 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值