文章目录

  • 前言
  • 一、LED的模块化
  • 二、GPIO初始化详细解析
  • 三、LED代码封装
  • 总结

前言

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

一、LED的模块化

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

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

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

把Driver的路径添加进来。

二、GPIO初始化详细解析

打开stm32f1xx_hal_gpio.c这个文件。
这里告诉了我们如何去初始化GPIO模块。

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 */

使用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

总结

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

STM32配置LED模块化相关推荐

  1. HC-05蓝牙模块与STM32控制led灯亮详解

    HC-05蓝牙模块与STM32控制led灯亮 一.HC-05蓝牙模块解析 1.简介 2.HC-05原理 3.HC-05实物图 二.使用AT指令进行配置 1.进入命令响应工作模式 2.配置串口 3.进行 ...

  2. [入门教程]详细讲解STM32控制LED点阵屏(HUB75接口)

    本文适合初级入门的同学,大佬请绕道.讲解怎么用stm32驱动成品LED点阵屏显示一副七色无灰度的图片,有灰度的图片可以入门后继续研究. 使用软硬件: 软件:Keil5,程序在后面会给出 硬件:STM3 ...

  3. STM32 GPIO LED和蜂鸣器实现【第四天】

    STM32 GPIO LED实现 原理图 一 .STM32大小说明 二.STM32时钟分析 三.GPIO分析 1.注意点 四.寄存器地址查找 1.写出GPIOF外设的所有寄存器地址 五.LED灯开发 ...

  4. 普维六类非屏蔽智能LED模块化布线解决方案(普维综合布线)

    综合布线系统解决方案 普维六类非屏蔽智能LED模块化 布线解决方案 目录 一.综合布线系统概述 1.1 智能学院简介 1.2 综合布线与传统布线的比较 1.3 综合布线系统的结构 1.4 综合布线系统 ...

  5. STM32配置组合设备(HID+CDC)

    STM32组合设备 STM32配置组合设备(HID+CDC) 1. CDC基础工程,HID基础工程生成 2.USB工程熟悉 2.1 USB初始化 2.2USB中断 2.3 相关结构体 2.3.1 ` ...

  6. STM32配置读取BMP280气压传感器数据

    STM32配置读取BMP280气压传感器数据 BMP280是在BMP180基础上增强的绝对气压传感器,在飞控领域的高度识别方面应用也比较多. BMP280和BMP180的区别: 市面上也有一些模块: ...

  7. STM32配置CH375B成HID Host模式读取自定义HID设备的数据 ——STM32配置CH375B接口函数

    接着上一篇上传,这个是STM32配置CH375B时用到的接口函数 头文件: #ifndef __BSP_CH375_H__ #define __BSP_CH375_H__#include " ...

  8. STM32 控制LED灯

    STM32 控制LED灯 一.简述        记--直接通过设置寄存器来控制LED灯.通过使用STM库函数来控制LED灯实现流水灯.        例子1:链接: https://pan.baid ...

  9. 音频开发-----STM32配置CODEC之AD1939

    文章目录 一.简介 二.芯片框图 三.AD1939寄存器 四.配置代码 五.资料下载 STM32配置CODEC之AD1939 一.简介 因芯片价格上涨,所有使用AD1939代替原来的方案. 二.芯片框 ...

最新文章

  1. IDEA 中比较骚后缀补全技巧!你可能没用过
  2. pytorch垃圾分类
  3. 微信小程序/uni-app 封装请求
  4. python pipe stdout 实现cat|grep 功能
  5. mysql sleep详解_关于MySQL的SLEEP(N)函数
  6. oracle12版本无scott解决,Oracle12C中scott账户与表问题
  7. 华为P30系列新配色官宣:9月6日IFA2019上见!
  8. python导入第三方库dlib报错解决
  9. vc 写一个计算机功能,VC++的一个实例
  10. 6个好用免费的LiDAR数据处理软件【2021最新】
  11. do还是doing imagine加to_“imagine to do”与“imagine doing”的区别是什么?
  12. [译]const T vs. T const ——Dan Saks 【翻译】
  13. 解决电脑桌面程序图标变白问题
  14. Ceph集群搭建系列(六):RBD块设备的使用场景、原理分析及其创建
  15. 推荐算法:为什么浏览器总是知道我喜欢的内容?
  16. 花呗套现买基金,90后韭菜有多拼?
  17. 跨境电商erp系统是什么?
  18. 小灵通听证?这些律师是不识字还是不懂法?
  19. python3打造一款游戏辅助软件
  20. 5G LAN是什么?5G LAN商用实现工业物联网5G无线接入

热门文章

  1. 【DDR3 控制器设计】(4)DDR3 的读操作设计
  2. 单相费控电能表的工作原理
  3. Html5计时器实现电子表
  4. phpexcel 从数据库把表格导出为excel
  5. 电影《碟中谍7:致命清算(上)》观后感
  6. 扬帆优配|杠杆资金重仓股曝光,3只科创板股获多路资金青睐
  7. opencv4android编译静态库,Android Studio链接OpenCV静态库
  8. mysql 查询排除字段_sql 查询排除一个字段的其他字段
  9. linux内核二叉查找树的应用
  10. linux 获取硬件时间,Linux的硬件时间及系统时间调用流程--转自网络