STM32配置LED模块化
文章目录
- 前言
- 一、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模块化相关推荐
- HC-05蓝牙模块与STM32控制led灯亮详解
HC-05蓝牙模块与STM32控制led灯亮 一.HC-05蓝牙模块解析 1.简介 2.HC-05原理 3.HC-05实物图 二.使用AT指令进行配置 1.进入命令响应工作模式 2.配置串口 3.进行 ...
- [入门教程]详细讲解STM32控制LED点阵屏(HUB75接口)
本文适合初级入门的同学,大佬请绕道.讲解怎么用stm32驱动成品LED点阵屏显示一副七色无灰度的图片,有灰度的图片可以入门后继续研究. 使用软硬件: 软件:Keil5,程序在后面会给出 硬件:STM3 ...
- STM32 GPIO LED和蜂鸣器实现【第四天】
STM32 GPIO LED实现 原理图 一 .STM32大小说明 二.STM32时钟分析 三.GPIO分析 1.注意点 四.寄存器地址查找 1.写出GPIOF外设的所有寄存器地址 五.LED灯开发 ...
- 普维六类非屏蔽智能LED模块化布线解决方案(普维综合布线)
综合布线系统解决方案 普维六类非屏蔽智能LED模块化 布线解决方案 目录 一.综合布线系统概述 1.1 智能学院简介 1.2 综合布线与传统布线的比较 1.3 综合布线系统的结构 1.4 综合布线系统 ...
- STM32配置组合设备(HID+CDC)
STM32组合设备 STM32配置组合设备(HID+CDC) 1. CDC基础工程,HID基础工程生成 2.USB工程熟悉 2.1 USB初始化 2.2USB中断 2.3 相关结构体 2.3.1 ` ...
- STM32配置读取BMP280气压传感器数据
STM32配置读取BMP280气压传感器数据 BMP280是在BMP180基础上增强的绝对气压传感器,在飞控领域的高度识别方面应用也比较多. BMP280和BMP180的区别: 市面上也有一些模块: ...
- STM32配置CH375B成HID Host模式读取自定义HID设备的数据 ——STM32配置CH375B接口函数
接着上一篇上传,这个是STM32配置CH375B时用到的接口函数 头文件: #ifndef __BSP_CH375_H__ #define __BSP_CH375_H__#include " ...
- STM32 控制LED灯
STM32 控制LED灯 一.简述 记--直接通过设置寄存器来控制LED灯.通过使用STM库函数来控制LED灯实现流水灯. 例子1:链接: https://pan.baid ...
- 音频开发-----STM32配置CODEC之AD1939
文章目录 一.简介 二.芯片框图 三.AD1939寄存器 四.配置代码 五.资料下载 STM32配置CODEC之AD1939 一.简介 因芯片价格上涨,所有使用AD1939代替原来的方案. 二.芯片框 ...
最新文章
- IDEA 中比较骚后缀补全技巧!你可能没用过
- pytorch垃圾分类
- 微信小程序/uni-app 封装请求
- python pipe stdout 实现cat|grep 功能
- mysql sleep详解_关于MySQL的SLEEP(N)函数
- oracle12版本无scott解决,Oracle12C中scott账户与表问题
- 华为P30系列新配色官宣:9月6日IFA2019上见!
- python导入第三方库dlib报错解决
- vc 写一个计算机功能,VC++的一个实例
- 6个好用免费的LiDAR数据处理软件【2021最新】
- do还是doing imagine加to_“imagine to do”与“imagine doing”的区别是什么?
- [译]const T vs. T const ——Dan Saks 【翻译】
- 解决电脑桌面程序图标变白问题
- Ceph集群搭建系列(六):RBD块设备的使用场景、原理分析及其创建
- 推荐算法:为什么浏览器总是知道我喜欢的内容?
- 花呗套现买基金,90后韭菜有多拼?
- 跨境电商erp系统是什么?
- 小灵通听证?这些律师是不识字还是不懂法?
- python3打造一款游戏辅助软件
- 5G LAN是什么?5G LAN商用实现工业物联网5G无线接入