STM32的GPIO 输出—使用固件库点亮LED

2023-02-23  

硬件设计

在本教程中STM32 芯片与LED 灯的连接见图1,这是一个RGB 灯,里面由红蓝绿三个小灯构成, 使用PWM控制时可以混合成256 不同的颜色。

图1 LED 硬件原理图


这些LED 灯的阴极都是连接到STM32 的GPIO引脚,只要我们控制GPIO引脚的电平输出状态,即可控制LED 灯的亮灭。若您使用的实验板LED 灯的连接方式或引脚不一样,只需根据我们的工程修改引脚即可,程序的控制原理相同。


软件设计

为了使工程更加有条理,我们把LED 灯控制相关的代码独立分开存储,方便以后移植。在“工程模板”之上新建“bsp_led.c”及“ bsp_led.h”文件,其中的“bsp”即BoardSupport Packet 的缩写(板级支持包),这些文件也可根据自己的喜好命名,这些文件不属于STM32 标准库的内容,是由我们自己根据应用需要编写的。


编程要点

  • 使能GPIO端口时钟;

  • 初始化GPIO目标引脚为推挽输出模式;

  • 编写简单测试程序,控制GPIO引脚输出高、低电平。


代码分析

LED灯引脚宏定义

在编写应用程序的过程中,要考虑更改硬件环境的情况,例如LED 灯的控制引脚与当前的不一样,我们希望程序只需要做最小的修改即可在新的环境正常运行。这个时候一般把硬件相关的部分使用宏来封装,若更改了硬件环境,只修改这些硬件相关的宏即可,这些定义一般存储在头文件,即本例子中的“bsp_led.h”文件中,见代码清单1。

代码清单1 LED控制引脚相关的宏


以上代码分别把控制LED 灯的GPIO端口、GPIO引脚号以及GPIO 端口时钟封装起来了。在实际控制的时候我们就直接用这些宏,以达到应用代码硬件无关的效果。

其中的GPIO 时钟宏“RCC_APB2Periph_GPIOB”是STM32 标准库定义的GPIO 端口时钟相关的宏,它的作用与“GPIO_Pin_x”这类宏类似,是用于指示寄存器位的,方便库函数使用,下面初始化GPIO时钟的时候可以看到它的用法。


控制LED灯亮灭状态的宏定义

为了方便控制LED 灯,我们把LED 灯常用的亮、灭及状态反转的控制也直接定义成宏,见代码清单2。

代码清单2 控制LED亮灭的宏


这部分宏控制LED 亮灭的操作是直接向BSRR、BRR 和ODR 这三个寄存器写入控制指令来实现的,对BSRR 写1 输出高电平,对BRR 写1 输出低电平,对ODR 寄存器某位进行异或操作可反转位的状态。

RGB 彩灯可以实现混色,如最后一段代码我们控制红灯和绿灯亮而蓝灯灭,可混出黄色效果。

代码中的“”是C 语言中的续行符语法,表示续行符的下一行与续行符所在的代码是同一行。代码中因为宏定义关键字“#define”只是对当前行有效,所以我们使用续行符来连接起来,以下的代码是等效的:



应用续行符的时候要注意,在“”后面不能有任何字符(包括注释、空格),只能直接回车。


LED GPIO 初始化函数

利用上面的宏,编写LED 灯的初始化函数,见代码清单3。

代码清单3 LED GPIO初始化函数


整个函数与“构建库函数雏形”章节中的类似,主要区别是硬件相关的部分使用宏来代替,初始化GPIO端口时钟时也采用了STM32 库函数,函数执行流程如下:

(1) 使用GPIO_InitTypeDef 定义GPIO 初始化结构体变量,以便下面用于存储GPIO 配置。

(2) 调用库函数RCC_APB2PeriphClockCmd 来使能LED 灯的GPIO端口时钟,在前面的章节中我们是直接向RCC 寄存器赋值来使能时钟的,不如这样直观。该函数有两个输入参数,第一个参数用于指示要配置的时钟,如本例中的“RCC_ APB2Periph_GPIOB”,应用时我们使用“|”操作同时配置3 个LED 灯的时钟;函数的第二个参数用于设置状态,可输入“Disable”关闭或“Enable”使能时钟。

(3) 向GPIO初始化结构体赋值,把引脚初始化成推挽输出模式,其中的GPIO_Pin 使用宏“LEDx_GPIO_PIN”来赋值,使函数的实现方便移植。

(4) 使用以上初始化结构体的配置,调用GPIO_Init 函数向寄存器写入参数,完成GPIO的初始化,这里的GPIO 端口使用“LEDx_GPIO_PORT”宏来赋值,也是为了程序移植方便。

(5) 使用同样的初始化结构体,只修改控制的引脚和端口,初始化其它LED 灯使用的GPIO引脚。

(6) 使用宏控制RGB 灯默认关闭。


主函数

编写完LED 灯的控制函数后,就可以在main 函数中测试了,见代码清单4。

代码清单4 控制LED等,main文件


在main 函数中,调用我们前面定义的LED_GPIO_Config 初始化好LED 的控制引脚,然后直接调用各种控制LED 灯亮灭的宏来实现LED 灯的控制。以上,就是一个使用STM32 标准软件库开发应用的流程。

下载验证

把编译好的程序下载到开发板并复位,可看到RGB 彩灯轮流显示不同的颜色。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。