STM32——led灯的点亮+闪烁+流水灯的实现

该文章已生成可运行项目,

一、LED点亮

1.原理

其方式有两种一种是寄存器方式一种是库函数方式,但其原理都是一样的。如原理图所示,与LED相连接的IO口置低电平即可点亮led灯
在这里插入图片描述

2.寄存器方式–代码

	//寄存器方式
	//主频8Mhz的时候实现1us延时的方法
	//LED灯
	//1,开时钟PE时钟
	RCC->APB2ENR |= 1<<6;
	//2,配置IO口
	GPIOE->CRL &= ~(0xffff<<8);//先清零指定寄存器位
	GPIOE->CRL |= 0x1111<<8;//设置模式为推挽输出模式
	//3, 设置开关灯
	GPIOE->ODR |= 0xf<<2;//关灯操作

3.库函数–代码

(1)led.c:函数led_config()

	//库函数
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);	
	GPIO_InitTypeDef GPIO_InitStruct={0};
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;
	GPIO_Init(GPIOE,&GPIO_InitStruct);
	GPIO_ResetBits(GPIOE,GPIO_Pin_2);

(2)main.c调用led_config

4.结果展示

在这里插入图片描述

二、LED闪烁

原理:让连接的IO口先置零再置1可以使其先亮再灭,我们先使灯置1,然后宏定义让灯反转,delay一个时间,代码如下
(1)led.c函数led_config()置1:

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);	
	GPIO_InitTypeDef GPIO_InitStruct={0};
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;
	GPIO_Init(GPIOE,&GPIO_InitStruct);
	GPIO_SetBits(GPIOE,GPIO_Pin_2);

(2)led.h宏定义灯的反转

#define LED1_Toggle() GPIOE->ODR ^= (1<<2)//反转灯操作

(3)main.c调用

int main(void){
LED_Config();
while(1)
{
		if(sys_time>=1000)
		{
			sys_time = 0;
			LED1_Toggle();
		}
}

sys_time在delay.c中定义

#include "delay.h"

//主频72Mhz的时候实现1us延时的方法
#define delay_1us()   __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
__nop();__nop();
void Delay_us(uint32_t time)
{
	while(time--)
	{
		delay_1us();
	}
}
void Delay_ms(uint32_t time)
{
	while(time--)
	{
		Delay_us(1000);
	}
}

uint32_t led_time = 0;
uint32_t sys_time = 0;
uint32_t dht11_time = 0;

void SysTick_Handler(void)//1ms进入一次
{
	led_time++;
	sys_time++;
	dht11_time++;
}

void Sys_ms(uint32_t time)
{
	uint32_t temp = time+sys_time;
	while(temp>sys_time);
}


delay.h

#ifndef __DELAY_H
#define __DELAY_H

#include "stm32f10x.h"
//extern uint16_t temperature;
//extern uint16_t humidity;
extern uint32_t led_time ;
extern uint32_t sys_time ;
extern uint32_t dht11_time ;
void Delay_us(uint32_t time);
void Delay_ms(uint32_t time);

#endif

ps:systick_handler是由系统定时器(SysTick)触发的中断处理函数。SysTick是一种基于硬件的定时器,它可以在每个时钟周期结束时触发中断。在ARM Cortex-M系列处理器中,SysTick定时器是由内核提供的,并且可以用于实现操作系统的时间片轮转调度、延时等功能。当SysTick定时器计数器减到时,就会触发systick_handler中断处理函数。因此,systick_handler的触发是由SysTick定时器的计数器减到时自动触发的。

三、LED流水灯

使这四个灯轮流亮起-代码如下

1.代码

int main(void){
LED_Config();
while(1)
{
		if(sys_time>=1000)
		{
			sys_time = 0;
			LED1_Toggle();
			Delay_ms(300);
			LED2_Toggle();
			Delay_ms(300);
			LED3_Toggle();
			Delay_ms(300);
			LED4_Toggle();
			Delay_ms(300);
		}
}

2.结果展示

流水灯

本文章已经生成可运行项目
<think>我们将会编写一个STM32流水灯(跑马)的代码。假设我们使用STM32F1系列,并且使用标准外设库(Standard Peripheral Library)或者HAL库。这里以常用的HAL库为例,因为ST官方现在主推HAL库。 流水灯的基本思想是依次点亮多个LED,然后依次熄灭,形成流动的效果。 假设硬件连接: LED1 -> PC0 LED2 -> PC1 LED3 -> PC2 LED4 -> PC3 我们使用定时器或者简单的延时来实现流水效果。这里为了简单,我们使用HAL_Delay函数进行延时。 步骤: 1. 初始化所有的LED引脚为输出模式。 2. 在循环中,依次将每个LED点亮,然后熄灭,同时点亮下一个,形成流动。 注意:LED的连接方式可能是共阳或共阴,这里假设是共阴,即引脚输出高电平时LED亮。 代码结构: - 包含必要的头文件 - 初始化所有用到的外设(主要是时钟和GPIO) - 主循环中实现流水灯逻辑 下面给出代码: </think>以下是使用STM32 HAL库实现流水灯代码示例,基于STM32F4 Discovery开发板(LED连接在PD12-PD15引脚)。若使用其他开发板,请根据实际LED引脚修改宏定义和初始化代码: ```cpp #include "main.h" #include "stm32f4xx_hal.h" // LED引脚定义(根据实际硬件修改) #define LED_PIN_1 GPIO_PIN_12 #define LED_PIN_2 GPIO_PIN_13 #define LED_PIN_3 GPIO_PIN_14 #define LED_PIN_4 GPIO_PIN_15 #define LED_PORT GPIOD // 初始化函数声明 void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void) { HAL_Init(); // 初始化HAL库 SystemClock_Config(); // 配置系统时钟 MX_GPIO_Init(); // 初始化GPIO uint8_t current_led = 0; // 当前点亮LED索引 const uint16_t leds[4] = { // LED引脚数组 LED_PIN_1, LED_PIN_2, LED_PIN_3, LED_PIN_4 }; while (1) { // 关闭所有LED HAL_GPIO_WritePin(LED_PORT, LED_PIN_1 | LED_PIN_2 | LED_PIN_3 | LED_PIN_4, GPIO_PIN_RESET); // 点亮当前LED HAL_GPIO_WritePin(LED_PORT, leds[current_led], GPIO_PIN_SET); HAL_Delay(200); // 延时200ms current_led = (current_led + 1) % 4; // 移动到下一个LED } } // 系统时钟配置(根据实际芯片修改) void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLM = 16; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; RCC_OscInitStruct.PLL.PLLQ = 4; HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2); } // GPIO初始化 static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOD_CLK_ENABLE(); // 使能GPIOD时钟 // 配置LED引脚为推挽输出 GPIO_InitStruct.Pin = LED_PIN_1 | LED_PIN_2 | LED_PIN_3 | LED_PIN_4; 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); } ``` ### 代码说明: 1. **硬件依赖**: - 假设LED采用共阳连接(高电平点亮),若为共阴连接需将`GPIO_PIN_SET`改为`GPIO_PIN_RESET` - 默认使用STM32F407VGT6芯片,时钟配置为168MHz 2. **工作流程**: - 初始化系统时钟和GPIO外设 - 定义4个LED的引脚数组 - 主循环中关闭所有LED点亮当前LED → 延时200ms → 切换下一个LED 3. **关键函数**: - `HAL_GPIO_WritePin()`:控制GPIO输出电平 - `HAL_Delay()`:提供毫秒级延时 - `MX_GPIO_Init()`:配置GPIO为输出模式 ### 常见问题解决: 1. **LED不亮**: - 检查硬件连接是否正确(确认LED极性) - 确认引脚配置与开发板原理图一致 - 测量GPIO输出电压(应为3.3V) 2. **编译错误**: - 确保包含正确的HAL库文件 - 检查芯片型号定义(在IDE中设置) 3. **流水速度过快/过慢**: - 修改`HAL_Delay()`参数调整延时时间 4. **功耗优化**: - 可改用定时器中断实现,避免忙等待
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值