使用STM32单片机点亮LED

2023-06-21 11:11:09 来源:学嵌入式的钉子君

有一人,登场于金庸先生的《神雕侠侣》,以大理段氏“一阳指”自成一派,武学修为登峰造极,“天下五绝”之一,号称“南帝”,他就是“一灯大师”。如今,武林中逐渐被遗忘的“一灯大师”,却活跃在另一个行业——嵌入式开发中。

传说,每一个成功的MCU(俗称单片机)开发组中,都有一名“一灯大师”,他精通所有开发板的点灯方法,对于企业引入的新开发板,总是勤学苦练,从点灯开始,快速掌握新开发板的编程要点,带领团队走向胜利。

成为“一灯大师”,离不开持续的修行,离不开对一招一式的勤学苦练。本文将讲解如何通过编程来控制STM32点亮一个LED


(资料图片)

学习环境:

1.软件:Keil5

2.硬件:STM32开发板(笔者使用信盈达公司的M4开发板,芯片型号为STM32F407ZGT6)

适合人群:

在校初入电子坑的小白,不懂STM32编程的硬件开发人员和想了解库函数编程的人。

文末将提供示例代码和文档的资料分享。

Part 1

点灯的思路讲解

本文中的点灯,是指用STM32单片机点亮与之连接的LED的操作。首先我们先了解一下LED这种器件。

LED的本质是一种发光二极管,所以点灯的核心就是:如何用STM32控制一个二极管电路。

市场上各类LED(直插式/贴片式以及各种颜色的LED,都有点区别)在导通时的压降一般在1.8~3.3V。所以点灯需要先查看电路图,确定驱动LED的方法。

下图是笔者使用到STM32开发板的LED部分的原理图。

本文接下来将以点亮LED1为例进行讲解。通过上图,我们可以看到或总结出以下信息:

1.LED1与单片机的PF6引脚连接。

2.由于LED1是一个二极管,点亮LED1需要PF6引脚上的电压值为低电平(满足发光二极管的导通压降需求即可)。

3.由于需要实现控制LED1点亮和LED1熄灭,需要将PF6引脚配置为输出模式,且输出电平可控。

故在编程步骤中主要需要完成两个部分:LED初始化函数(主要是配置引脚PF6为输出模式)和 点亮/熄灭LED1的接口(控制引脚PF6输出低/高电平)。

其中,LED1初始化的主要步骤为:

激活外设GPIOF(PF6是外设GPIOF的IO引脚之一)。将PF6配置为输出模式将PF6的输出类型配置为推挽输出配置PF6输出速度为低速(其他速度也可以)配置PF6的输出数据(点亮/熄灭LED1)

Part 2

用库函数编程方法点灯

本方法是通过调用STM32官方提供的库函数,完成对引脚有关的一系列操作。库函数编程方法简单易用,适合新人学习。

Step1,打开STM32F4xx官方库函数文档(stm32f4xx_dsp_stdperiph_lib_um.chm),找到以下函数。

void  RCC_AHB1PeriphClockCmd (uint32_t RCC_AHB1Periph, FunctionalState NewState)   此函数用于激活AHB1总线上的外设(GPIOF在此总线上)void  GPIO_Init (GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_InitStruct)   此函数将基于参数初始化GPIOxvoid  GPIO_SetBits (GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)   此函数用于控制指定IO引脚输出高电平void  GPIO_ResetBits (GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)   此函数用于控制指定IO引脚输出低电平

Step2,通过在库函数帮助文档中点击函数名,查看函数的定义,明确参数填写方法。

比如,点击GPIO_Init() 函数,查看其详细信息

通过阅读图中文字,可知:第一个参数填写为GPIOx,其中x需要用字母A~K替代(取决于引脚),由于本例使用PF6引脚,故填写为GPIOF;第二个参数需要先定义一个GPIO_InitTypeDef类型的结构体变量,对其成员赋值后,再将变量的地址传入。

继续查看GPIO_InitTypeDef类型的定义。

GPIO_InitTypeDef结构体类型中的这5个成员分别表示对以下内容的配置:IO引脚的模式、输出类型、引脚序号、内置电阻和 输出速度。

其他几个函数也可以参考此方法进行查看,从而确定函数的调用形式。

Step3,结合前文“点灯的思路讲解”写出代码

//1. 激活外设GPIOFRCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOF, ENABLE);
//2. 将PF6配置为输出模式//3. 将PF6的输出类型配置为推挽输出//4. 配置PF6输出速度为低速GPIO_InitTypeDef   gpio_InitStruct ;gpio_InitStruct.GPIO_Mode   =  GPIO_Mode_OUT ;gpio_InitStruct.GPIO_OType   = GPIO_OType_PP ;gpio_InitStruct.GPIO_Pin     = GPIO_Pin_6 ;gpio_InitStruct.GPIO_PuPd   = GPIO_PuPd_NOPULL ;gpio_InitStruct.GPIO_Speed   =  GPIO_Low_Speed ;GPIO_Init (GPIOF , &gpio_InitStruct);
//5. 点亮/熄灭LED1#define LED1_ON    GPIO_ResetBits (GPIOF, GPIO_Pin_6)#define LED1_OFF   GPIO_SetBits (GPIOF, GPIO_Pin_6)

Step4,整理代码,将他们添加到用Keil5软件建立的工程中。可参考以下形式。(细节详见文末提供的资料分享)

Step5,编程工程,下载到开发板,观察现象。正常现象是LED1以固定的频率交替进行亮和灭动作。

留给读者的思考,本文提供的开发板的LED部分原理图中还有另外3个LED,尝试编写代码,驱动他们。有条件的朋友建议购买开发板直接实物验证,将理论与实践结合,早日成为“一灯大师”!

标签:

上一篇:Linux系统中的抽象级别和层数|环球实时
下一篇:最后一页