首页 > 编程语言 >STM32流水灯程序代码及解析:三种实现方式

STM32流水灯程序代码及解析:三种实现方式

时间:2024-09-22 11:48:11浏览次数:8  
标签:HAL void LED STM32 Init GPIOA GPIO 解析 程序代码

STM32流水灯程序代码及解析:三种实现方式

在这篇文章中,我们将介绍三种方式来实现STM32的流水灯程序,包括使用HAL库、标准库和直接操作寄存器的方法。通过这三种不同的方式。


1. 硬件准备
  • STM32开发板(如STM32F4或STM32F1系列)
  • 若干LED灯(通常是4个)
  • 适当的电阻
  • 连接线
2. 接线图

将LED连接到STM32的GPIO引脚,连接方式如下:

LEDSTM32引脚
LED1GPIOA.0
LED2GPIOA.1
LED3GPIOA.2
LED4GPIOA.3

每个LED通过适当的电阻连接到地(GND)。


3. 实现方式一:使用HAL库

#include "stm32f4xx_hal.h"

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

int main(void) {
    HAL_Init();                  // 初始化HAL库
    SystemClock_Config();        // 配置系统时钟
    MX_GPIO_Init();             // 初始化GPIO

    while (1) {
        for (int i = 0; i < 4; i++) {
            HAL_GPIO_WritePin(GPIOA, (1 << i), GPIO_PIN_SET);  // 点亮LED
            HAL_Delay(500);        // 延时500毫秒
            HAL_GPIO_WritePin(GPIOA, (1 << i), GPIO_PIN_RESET); // 熄灭LED
        }
    }
}

// GPIO初始化函数
static void MX_GPIO_Init(void) {
    __HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟

    GPIO_InitTypeDef GPIO_InitStruct = {0};
    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(GPIOA, &GPIO_InitStruct);     // 初始化GPIO
}

代码解析:

  • HAL_Init(): 初始化HAL库。
  • SystemClock_Config(): 配置系统时钟。
  • MX_GPIO_Init(): 初始化GPIO为输出模式。
  • HAL_GPIO_WritePin(): 控制LED的状态。
  • HAL_Delay(500): 延时500毫秒,让LED保持点亮状态。

4. 实现方式二:使用标准库

#include "stm32f4xx.h"

void SystemClock_Config(void);
void GPIO_Init(void);

int main(void) {
    SystemClock_Config(); // 配置系统时钟
    GPIO_Init();          // 初始化GPIO

    while (1) {
        for (int i = 0; i < 4; i++) {
            GPIOA->ODR |= (1 << i);  // 点亮LED
            for (volatile int j = 0; j < 100000; j++); // 简单延时
            GPIOA->ODR &= ~(1 << i); // 熄灭LED
        }
    }
}

// GPIO初始化函数
void GPIO_Init(void) {
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // 使能GPIOA时钟

    // 设置PA0-PA3为输出模式
    GPIOA->MODER &= ~((3 << (0 * 2)) | (3 << (1 * 2)) | (3 << (2 * 2)) | (3 << (3 * 2))); // 清除模式
    GPIOA->MODER |= (1 << (0 * 2)) | (1 << (1 * 2)) | (1 << (2 * 2)) | (1 << (3 * 2)); // 设置为输出
}

代码解析:

  • GPIOA->ODR |= (1 << i): 使用位运算点亮指定LED。
  • for (volatile int j = 0; j < 100000; j++);: 简单的延时实现(注意这种方式不够精准)。
  • GPIOA->MODER: 通过直接操作寄存器设置引脚模式,首先清除之前的设置,然后配置为输出。

5. 实现方式三:直接操作寄存器

#include "stm32f4xx.h"

void GPIO_Init(void);

int main(void) {
    GPIO_Init();                // 初始化GPIO

    while (1) {
        for (int i = 0; i < 4; i++) {
            GPIOA->ODR |= (1 << i);  // 点亮LED
            for (volatile int j = 0; j < 1000000; j++); // 延时
            GPIOA->ODR &= ~(1 << i); // 熄灭LED
        }
    }
}

void GPIO_Init(void) {
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // 使能GPIOA时钟
    GPIOA->MODER &= ~((3 << (0 * 2)) | (3 << (1 * 2)) | (3 << (2 * 2)) | (3 << (3 * 2))); // 清除模式设置
    GPIOA->MODER |= (1 << (0 * 2)) | (1 << (1 * 2)) | (1 << (2 * 2)) | (1 << (3 * 2)); // 设置PA0-PA3为输出模式
}

代码解析:

  • GPIOA->ODR |= (1 << i): 直接操作输出数据寄存器点亮LED。
  • GPIOA->MODER: 通过直接寄存器操作设置引脚模式,清除之前的模式设置后再配置为输出。

总结

通过以上三种方式,我们实现了STM32的流水灯程序。每种方法都有其独特之处:

  • HAL库:易于上手,适合初学者,代码简洁。
  • 标准库:提供更低层次的控制,适合需要优化性能的应用。
  • 寄存器操作:最灵活,适合深入理解硬件,但需要更多的代码管理。

标签:HAL,void,LED,STM32,Init,GPIOA,GPIO,解析,程序代码
From: https://blog.csdn.net/2401_87496566/article/details/142383361

相关文章

  • QT Widgets模块源码解析与实践
    QTWidgets模块源码解析与实践使用AI技术辅助生成QT界面美化视频课程QT性能优化视频课程QT原理与源码分析视频课程QTQMLC++扩展开发视频课程免费QT视频课程您可以看免费1000+个QT技术视频免费QT视频课程QT统计图和QT数据可视化视频免费看免费QT视频课程QT性能优化视......
  • QT Widgets模块源码解析与技巧
    QTWidgets模块源码解析与技巧使用AI技术辅助生成QT界面美化视频课程QT性能优化视频课程QT原理与源码分析视频课程QTQMLC++扩展开发视频课程免费QT视频课程您可以看免费1000+个QT技术视频免费QT视频课程QT统计图和QT数据可视化视频免费看免费QT视频课程QT性能优化视......
  • stm32 FLASH闪存(读写内部FLASH&读取芯片ID)
    理论1.FLASH简介STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)(FLASH管理员)可以对程序存储器和选项字节进行擦除和编程读写FLASH的用途:   利用程序存储器的剩余空间来保存掉电不丢失的用户数据    通过在程序中编......
  • 《C++中的神秘利器——类型萃取(Type Traits)深度解析》
    在C++的浩瀚世界中,类型萃取(TypeTraits)犹如一把神奇的钥匙,为开发者打开了高效编程的大门。那么,C++中的类型萃取究竟有什么用呢?让我们一同深入探究。一、类型萃取的基本概念类型萃取从字面意思理解,就是帮助我们挑选某个对象的类型,筛选特定的对象来做特定的事。它是C++模......
  • 微服务jenkins解析部署使用全流程
    1、Jenkins1、什么是JenkinsJenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。2、Jenkins的作用持续的软件版本发布/测试项目。监控外部调用执行的工作。(Jenkins有很多的插......
  • 华为杯D题完整解析+代码实现
    土地利用变化预测模型研究摘要在当前快速城市化的背景下,土地利用变化已成为影响生态环境和社会经济发展的重要因素。本文旨在通过建立多种预测模型,深入分析土地利用变化的特征及其驱动因素。首先,我们采用LSTM神经网络模型,以捕捉数据之间的长期依赖关系;随后,运用线性回归探讨自......
  • Android RecyclerView 缓存机制深度解析与面试题
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点引言RecyclerView是Android开发中用于展示列表和网格的强大组件。它通过高效的缓存机制,优化了滑动性能和内存使用。本文将深入探讨RecyclerView的缓存机制,并......
  • CSP-J 2024 入门组初赛第一轮初赛试题及答案解析
    CSP-J2024入门组初赛第一轮初赛试题及答案解析一、单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项)132位int类型的存储范围是()A-2147483647~+2147483647B-2147483647~+2147483648C-2147483648~+2147483647D-2147483648~+2147483648答案C......
  • 学习STM32的震动开关
    学习STM32的震动开关在本文中,我将详细介绍如何使用STM32微控制器来实现一个震动开关。震动开关是一种能够检测物体是否发生震动的传感器,通常用于安防系统、智能家居等领域。我们将使用STM32的GPIO模块和外部中断功能来实现震动开关的功能。前期准备在开始之前,我们需要准备以......
  • STM32实现简单的智能办公系统
    为了实现一个简单的智能办公系统,我们可以利用STM32微控制器和一些外设来实现各种功能。在本文中,我将介绍如何通过STM32来控制温度和湿度传感器、人体红外传感器,以及通过无线通信来实现报警和监控功能。首先,我们需要准备一些硬件设备,包括:STM32微控制器开发板:本例中使用的是S......