STM32配置LED模块化

简介: STM32配置LED模块化

前言

本篇文章将带大家深入了解GPIO的配置,并带大家实现LED模块化编程。

一、LED的模块化

什么叫模块化编程?我的理解就是每一个模块都分别写成对应的.c和.h文件,有的人可能会问道为什么要这样写呢?这样写不是增加文件数量吗?其实模块化编程主要的好处就是代码看起来更加整洁,不会显得凌乱,而且方便移植。

在工程目录下新建Driver文件夹存放.h和.c文件。

image.png

在Driver目录下新建.c和.h文件

image.png

将driver_led.c和driver_led.h文件加入工程

image.png

把Driver的路径添加进来

image.png

二、GPIO初始化详细解析

打开stm32f1xx_hal_gpio.c这个文件。

这里告诉了我们如何去初始化GPIO模块

image.png

1.GPIO时钟初始化

看到下面这个注释就可以知道使能GPIO的时钟就使用下面这个函数

__HAL_RCC_GPIOx_CLK_ENABLE().

GPIOx就代表的是哪一组GPIO引脚,比如初始化的是GPIOB这一组引脚,那么这个函数就应该写成:__HAL_RCC_GPIOB_CLK_ENABLE().其他的也是一样。

Enable the GPIO APB2 clock using the following function : __HAL_RCC_GPIOx_CLK_ENABLE().

2.GPIO引脚选择,模式设置,速度设置,上下拉电阻设置。

HAL库中提供了GPIO_InitTypeDef这个结构体。

这个结构体一共包含了Pin,Mode,Pull,Speed。这四个参数。

typedef struct
{
  uint32_t Pin;       /*!< Specifies the GPIO pins to be configured.
                           This parameter can be any value of @ref GPIO_pins_define */
  uint32_t Mode;      /*!< Specifies the operating mode for the selected pins.
                           This parameter can be a value of @ref GPIO_mode_define */
  uint32_t Pull;      /*!< Specifies the Pull-up or Pull-Down activation for the selected pins.
                           This parameter can be a value of @ref GPIO_pull_define */
  uint32_t Speed;     /*!< Specifies the speed for the selected pins.
                           This parameter can be a value of @ref GPIO_speed_define */
} GPIO_InitTypeDef;

pin:第几个引脚

Mode:

模式有下面这些模式可供选择,这里我们选择GPIO_MODE_OUTPUT_PP,推挽输出模式。

#define  GPIO_MODE_INPUT                        0x00000000u   /*!< Input Floating Mode                   */
#define  GPIO_MODE_OUTPUT_PP                    0x00000001u   /*!< Output Push Pull Mode                 */
#define  GPIO_MODE_OUTPUT_OD                    0x00000011u   /*!< Output Open Drain Mode                */
#define  GPIO_MODE_AF_PP                        0x00000002u   /*!< Alternate Function Push Pull Mode     */
#define  GPIO_MODE_AF_OD                        0x00000012u   /*!< Alternate Function Open Drain Mode    */
#define  GPIO_MODE_AF_INPUT                     GPIO_MODE_INPUT          /*!< Alternate Function Input Mode         */

Pull:

上拉,下拉设置。

#define  GPIO_NOPULL        0x00000000u   /*!< No Pull-up or Pull-down activation  */
#define  GPIO_PULLUP        0x00000001u   /*!< Pull-up activation                  */
#define  GPIO_PULLDOWN      0x00000002u   /*!< Pull-down activation                */

Speed:

GPIO输出速度设置,这里我们只是点亮LED灯对GPIO的输出速度并没有很高的要求,这里选择低速即可。

像涉及到IIC协议等这些协议的时候对GPIO的输出速度会有一定的要求。

#define  GPIO_SPEED_FREQ_LOW              (GPIO_CRL_MODE0_1) /*!< Low speed */
#define  GPIO_SPEED_FREQ_MEDIUM           (GPIO_CRL_MODE0_0) /*!< Medium speed */
#define  GPIO_SPEED_FREQ_HIGH             (GPIO_CRL_MODE0)   /*!< High speed */

3.


使用HAL_GPIO_Init().这个函数将设置好的参数设置进GPIO对应寄存器,让这些设置生效。

Configure the GPIO pin(s) using HAL_GPIO_Init().

三、LED代码封装

这一部分代码还是很好理解的,而且都带有注释,这里就不作详细讲解了。

#include "driver_led.h"
/*
 *  函数名:void LedGpioInit(void)
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
 *  函数作用:初始化LED的引脚,配置为上拉推挽输出
*/
void LedGpioInit(void)
{
    // 定义GPIO的结构体变量
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    // 使能LED的GPIO对应的时钟
    LED0_GPIO_CLK_EN();
    LED1_GPIO_CLK_EN();
    GPIO_InitStruct.Pin = LED0_GPIO_PIN;         // 选择LED0的引脚
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 设置为推挽输出模式
    GPIO_InitStruct.Pull = GPIO_PULLUP;         // 默认上拉
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;// 引脚输出速度设置为慢
    // 初始化引脚配置
    HAL_GPIO_Init(LED0_GPIO_PORT, &GPIO_InitStruct);
    GPIO_InitStruct.Pin = LED1_GPIO_PIN;         // 选择LED1的引脚
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 设置为推挽输出模式
    GPIO_InitStruct.Pull = GPIO_PULLUP;         // 默认上拉
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;// 引脚输出速度设置为慢
    // 初始化引脚配置
    HAL_GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStruct);
}
#ifndef __DRIVER_LED_H
#define __DRIVER_LED_H
#include "stm32f1xx_hal.h"
/*********************
 * 引脚宏定义
**********************/
#define LED0_GPIO_PIN        GPIO_PIN_5
#define LED0_GPIO_PORT       GPIOB
#define LED0_GPIO_CLK_EN()   __HAL_RCC_GPIOB_CLK_ENABLE()
#define LED1_GPIO_PIN        GPIO_PIN_5
#define LED1_GPIO_PORT       GPIOE
#define LED1_GPIO_CLK_EN()   __HAL_RCC_GPIOE_CLK_ENABLE()
/*********************
 * 函数宏定义
**********************/
/*
 * LED亮灭函数宏定义
*/
#define ON  GPIO_PIN_RESET
#define OFF GPIO_PIN_SET
#define LED0(flag)        HAL_GPIO_WritePin(LED0_GPIO_PORT, LED0_GPIO_PIN, flag)   
#define LED1(flag)        HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, flag)    
/*
 *  函数名:void LedGpioInit(void)
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
 *  函数作用:初始化LED的引脚,配置为上拉推挽输出
*/
extern void LedGpioInit(void);
#endif

总结

学会模块化编程是走像成功的必经之路。

相关文章
|
4月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
353 2
|
3月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
570 0
|
18天前
stm32学习 3-2 LED流水灯
stm32学习 3-2 LED流水灯
50 4
|
18天前
stm32学习3-1 LED闪烁
stm32学习3-1 LED闪烁
29 4
|
3月前
STM32CubeMX FreeRTOS点亮LED
STM32CubeMX FreeRTOS点亮LED
71 10
|
3月前
STM32CubeMX 按键控制LED
STM32CubeMX 按键控制LED
54 0
|
3月前
STM32CubeMX 点亮LED
STM32CubeMX 点亮LED
55 0
|
4月前
|
传感器
【经典案例】STM32F407使用HAL库配置I2C详解
STM32F407是一个强大的微控制器,广泛应用于嵌入式系统中。在许多应用中,我们需要使用I2C总线来与传感器、EEPROM、显示屏等外设进行通信。本文将详细介绍如何使用STM32 HAL库来配置和使用I2C接口。
550 2
|
4月前
|
开发者
【经典案例】使用HAL库配置STM32F407的SPI外设
在嵌入式系统开发中,STM32F407是一款广泛应用的微控制器,而SPI(Serial Peripheral Interface)是一种常用的通信接口。本文将详细介绍如何使用STM32的硬件抽象层(HAL)库配置STM32F407的SPI外设,并提供完整的代码示例。
446 1
|
3月前
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
135 0