LED流水灯实验

LED流水灯实验

实验目的

  1. 熟悉STM32F103C8T6微控制器的GPIO(通用输入输出)操作。
  2. 掌握使用STM32CubeMX进行项目配置和初始化代码生成的方法。
  3. 实现LED灯的流水灯效果,即通过编程控制多个LED灯依次点亮,形成流动的视觉效果。

实验器材

  • STM32F103C8T6开发板
  • LED灯若干(本例中假设使用4个)
  • 电阻若干(用于限流,保护LED)
  • 杜邦线
  • 电源(通常为5V)
  • STM32CubeIDE(或其他支持的IDE)
  • STM32CubeMX(用于项目配置和初始化代码生成)

实验步骤

1. 硬件连接
  • 将4个LED灯的阳极(长脚)分别通过限流电阻连接到STM32F103C8T6开发板的GPIOC端口的PC0、PC1、PC2、PC3引脚上。
  • 将LED灯的阴极(短脚)全部连接到GND(地)上。
  • 确保电源连接正确,为开发板提供稳定的5V电源。
2. 项目配置(使用STM32CubeMX)
  • 打开STM32CubeMX,创建一个新项目,选择STM32F103C8T6作为目标MCU。
  • 在Pinout视图中,找到GPIOC端口,将PC0、PC1、PC2、PC3配置为GPIO_Output(推挽输出)模式。
  • 配置系统时钟(这一步通常可以保留默认设置,因为HAL库会根据MCU型号自动配置)。
  • 生成初始化代码,选择适合你的IDE(如STM32CubeIDE),并导出项目。
3. 编写代码(在STM32CubeIDE中)

  • 打开由STM32CubeMX生成的项目。
  • 在主函数(main.c)中,添加GPIO初始化和LED流水灯控制的代码。
    • 初始化GPIOC端口,将PC0、PC1、PC2、PC3配置为推挽输出。
    • 编写一个函数(如LED_Blink),用于控制LED灯的流水灯效果。该函数通过依次点亮PC0到PC3引脚上的LED灯,并在每个LED点亮后稍作延迟,来形成流水灯效果。
    • main函数的循环中调用LED_Blink函数,并设置适当的延迟时间,以便观察流水灯效果。
4. 编译和下载代码
  • 在STM32CubeIDE中,编译整个项目,确保没有编译错误。
  • 使用ST-LINK或其他支持的调试器将编译好的代码下载到STM32F103C8T6开发板上。
5. 观察结果
  • 连接开发板到电源,并观察LED灯的流水灯效果。
  • 如果一切正常,你应该能看到LED灯依次点亮,形成流动的视觉效果。

实验总结

通过这个实验,你不仅学会了如何使用STM32F103C8T6微控制器的GPIO端口来控制LED灯,还掌握了使用STM32CubeMX进行项目配置和初始化代码生成的方法。此外,你还通过编程实现了LED灯的流水灯效果,加深了对微控制器编程和硬件控制的理解。

为了使用STM32F103C8T6微控制器(基于STM32F1系列)和HAL库来生成LED流水灯闪烁的代码,你需要首先确保你有必要的软件环境,如STM32CubeIDE或Keil uVision,以及STM32CubeMX(用于配置和生成初始化代码)。以下是一个基本的步骤指南和示例代码,展示如何使用HAL库来实现LED流水灯的效果。

准备工作

  1. 安装STM32CubeIDE(或你选择的IDE)。
  2. 通过STM32CubeMX配置项目
    • 创建一个新项目,选择STM32F103C8T6作为目标MCU。
    • 配置GPIO端口作为输出(例如,假设我们使用PC0, PC1, PC2, PC3作为LED连接)。
    • 配置时钟(通常HAL库会自动为你处理这个)。
    • 使用STM32CubeMX的“Project”->“Generate Code”生成项目文件。

示例代码

以下是一个简单的代码示例,展示了如何控制LEDs进行流水灯效果。假设你已经有了由STM32CubeMX生成的初始化代码,并且你的LEDs连接在PC0到PC3上。

 
#include "stm32f1xx_hal.h"  
  
void GPIO_Init(void);  
void LED_Blink(void);  
  
int main(void)  
{  
    HAL_Init(); // 初始化HAL库  
    SystemClock_Config(); // 配置系统时钟,这通常在由STM32CubeMX生成的代码中自动完成  
    GPIO_Init(); // 初始化GPIO  
  
    while (1)  
    {  
        LED_Blink(); // 调用LED流水灯函数  
        HAL_Delay(500); // 延迟500ms  
    }  
}  
  
void GPIO_Init(void)  
{  
    __HAL_RCC_GPIOC_CLK_ENABLE(); // 使能GPIOC时钟  
  
    GPIO_InitTypeDef GPIO_InitStruct = {0};  
  
    // 配置PC0, PC1, PC2, PC3为通用推挽输出  
    GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;  
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;  
    GPIO_InitStruct.Pull = GPIO_NOPULL;  
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;  
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);  
}  
  
void LED_Blink(void)  
{  
    static uint8_t led_index = 0;  
  
    // 关闭所有LED  
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3, GPIO_PIN_RESET);  
  
    // 依次点亮LED  
    switch (led_index)  
    {  
        case 0:  
            HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET);  
            break;  
        case 1:  
            HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_SET);  
            break;  
        case 2:  
            HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET);  
            break;  
        case 3:  
            HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_SET);  
            led_index = 0; // 重置索引以循环LED  
            break;  
        default:  
            // 不应该执行到这里  
            break;  
    }  
  
    led_index++;  
}


注意

  • 确保你的硬件连接与代码中的引脚配置相匹配。
  • 你可能需要根据实际的LED连接调整GPIO端口和引脚。
  • 上述代码示例仅实现了基本的流水灯效果,其中LED依次点亮。你可以通过修改LED_Blink函数来创建更复杂的动画效果。
#include "stm32f1xx_hal.h"

// LED端口定义
#define LED1_GPIO_PORT GPIOA
#define LED1_GPIO_PIN GPIO_PIN_0
#define LED2_GPIO_PORT GPIOA
#define LED2_GPIO_PIN GPIO_PIN_1
#define LED3_GPIO_PORT GPIOA
#define LED3_GPIO_PIN GPIO_PIN_2

void SystemClock_Config(void);
static void MX_GPIO_Init(void);

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();

    while (1)
    {
        HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_SET);
        HAL_Delay(500);
        HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_RESET);
        HAL_Delay(500);

        HAL_GPIO_WritePin(LED2_GPIO_PORT, LED2_GPIO_PIN, GPIO_PIN_SET);
        HAL_Delay(500);
        HAL_GPIO_WritePin(LED2_GPIO_PORT, LED2_GPIO_PIN, GPIO_PIN_RESET);
        HAL_Delay(500);

        HAL_GPIO_WritePin(LED3_GPIO_PORT, LED3_GPIO_PIN, GPIO_PIN_SET);
        HAL_Delay(500);
        HAL_GPIO_WritePin(LED3_GPIO_PORT, LED3_GPIO_PIN, GPIO_PIN_RESET);
        HAL_Delay(500);
    }
}

void SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
        Error_Handler();
    }
    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;
    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
    {
        Error_Handler();
    }
}

static void MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIOA_CLK_ENABLE();

    GPIO_InitStruct.Pin = LED1_GPIO_PIN | LED2_GPIO_PIN | LED3_GPIO_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

这段代码是使用STM32F103C8T6微控制器的HAL库编写的一个简单的LED流水灯闪烁程序。以下是对代码的解释:

1. 首先,包含了必要的头文件`"stm32f1xx_hal.h"`,这是STM32 HAL库的头文件,提供了硬件抽象层(Hardware Abstraction Layer)的功能。

2. 定义了三个宏,分别表示三个LED灯所连接的GPIO端口和引脚。例如,`LED1_GPIO_PORT`表示第一个LED灯连接的GPIO端口,`LED1_GPIO_PIN`表示该LED灯连接的引脚。

3. `SystemClock_Config()`函数用于配置系统时钟。它设置了外部高速外部晶振(HSE)作为时钟源,并启用PLL倍频器,将系统时钟频率提高到72MHz。

4. `MX_GPIO_Init()`函数用于初始化GPIO端口。在这个函数中,我们将GPIOA的所有引脚设置为输出模式,并设置推挽输出(Push-pull output)。

5. `main()`函数是程序的入口点。在`main()`函数中,首先调用`HAL_Init()`初始化HAL库,然后调用`SystemClock_Config()`配置系统时钟,接着调用`MX_GPIO_Init()`初始化GPIO端口。

6. 在一个无限循环中,通过`HAL_GPIO_WritePin()`函数控制每个LED灯的开关状态。每次循环中,依次点亮一个LED灯,延时500毫秒,然后熄灭该LED灯,再延时500毫秒。这样就实现了LED灯的流水灯效果。

注意:在实际运行此代码之前,需要确保已经正确配置了STM32CubeMX工具,生成了正确的初始化代码,并将其包含在项目中。此外,还需要根据实际硬件连接情况调整LED灯的GPIO端口和引脚定义。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科创工作室li

你的鼓励将是大学生的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值