第12章 GPIO输出—使用固件库点亮LED

本文详细介绍了如何使用STM32 HAL库控制GPIO输出,以点亮和控制LED灯。通过硬件设计和软件设计两部分,讲解了LED灯的硬件连接、GPIO初始化、宏定义以及主函数中的LED控制逻辑。代码示例展示了如何通过宏定义实现LED的亮灭、颜色混合,并介绍了STM32 HAL库中的断言功能和防止头文件重复包含的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本章参考资料:《STM32F76xxx参考手册》、库帮助文档《STM32F779xx_User_Manual.chm》。

利用库建立好的工程模板,就可以方便地使用STM32 HAL库库编写应用程序了,可以说从这一章我们才开始迈入STM32F7开发的大门。

LED灯的控制使用到GPIO外设的基本输出功能,本章中不再赘述GPIO外设的概念,如您忘记了,可重读前面“GPIO框图剖析”小节,STM32 HAL库中GPIO初始化结构体GPIO_TypeDef的定义与“定义引脚模式的枚举类型”小节中讲解的相同。

12.1  硬件设计

本实验板连接了一个RGB彩灯及一个普通LED灯,RGB彩灯实际上由三盏分别为红色、绿色、蓝色的LED灯组成,通过控制RGB颜色强度的组合,可以混合出各种色彩。

 

12-1 LED硬件原理图

这些LED灯的阴极都是连接到STM32GPIO引脚,只要我们控制GPIO引脚的电平输出状态,即可控制LED灯的亮灭。图中左上方,其中彩灯的阳极连接到的一个电路图符号“口口”,它表示引出排针,即此处本身断开,须通过跳线帽连接排针,把电源跟彩灯的阳极连起来,实验时需注意。

若您使用的实验板LED灯的连接方式或引脚不一样,只需根据我们的工程修改引脚即可,程序的控制原理相同。

12.2  软件设计

这里只讲解核心部分的代码,有些变量的设置,头文件的包含等可能不会涉及到,完整的代码请参考本章配套的工程。

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

12.2.1  编程要点

1. 使能GPIO端口时钟;

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

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

12.2.2  代码分析
1. LED灯引脚宏定义

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

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

1 //引脚定义

 2 /*******************************************************/

 3 //R 红色灯

 4 #define LED1_PIN                  GPIO_PIN_10

 5 #define LED1_GPIO_PORT            GPIOH

 6 #define LED1_GPIO_CLK()           __GPIOH_CLK_ENABLE()

 7

 8 //G 绿色灯

 9 #define LED2_PIN                  GPIO_PIN_11

10 #define LED2_GPIO_PORT            GPIOH

11 #define LED2_GPIO_CLK()           __GPIOH_CLK_ENABLE()

12

13 //B 蓝色灯

14 #define LED3_PIN                  GPIO_PIN_12

15 #define LED3_GPIO_PORT            GPIOH

16 #define LED3_GPIO_CLK()           __GPIOH_CLK_ENABLE()

17

18 //小指示灯

19 #define LED4_PIN                  GPIO_PIN_11

20 #define LED4_GPIO_PORT            GPIOD

21 #define LED4_GPIO_CLK()           __GPIOD_CLK_ENABLE()

22 /************************************************************/

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

其中的GPIO时钟宏“__GPIOH_CLK_ENABLE()”和“__GPIOD_CLK_ENABLE()”是STM32 HAL库定义的GPIO端口时钟相关的宏,它的作用与“GPIO_PIN_x”这类宏类似,是用于指示寄存器位的,方便库函数使用。它们分别指示GPIOHGPIOD的时钟,下面初始化GPIO时钟的时候可以看到它的用法。

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

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

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

1

 2 /* 直接操作寄存器的方法控制IO */

 3 #define digitalHi(p,i)         {p->BSRR=i;}  //设置为高电平      

 4 #define digitalLo(p,i)         {p->BSRR=(uint32_t)i << 16;}   //输出低电平

 5 #define digitalToggle(p,i)   {p->ODR ^=i;}   //输出反转状态

 6

 7

 8 /* 定义控制IO的宏 */

 9 #define LED1_TOGGLE     digitalToggle(LED1_GPIO_PORT,LED1_PIN)

10 #define LED1_OFF        digitalHi(LED1_GPIO_PORT,LED1_PIN)

11 #define LED1_ON         digitalLo(LED1_GPIO_PORT,LED1_PIN)

12

13 #define LED2_TOGGLE     digitalToggle(LED2_GPIO_PORT,LED2_PIN)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值