有一人,登场于金庸先生的《神雕侠侣》,以大理段氏“一阳指”自成一派,武学修为登峰造极,“天下五绝”之一,号称“南帝”,他就是“一灯大师”。如今,武林中逐渐被遗忘的“一灯大师”,却活跃在另一个行业——嵌入式开发中。
传说,每一个成功的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)
此函数将基于参数初始化GPIOx
void 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. 激活外设GPIOF
RCC_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,尝试编写代码,驱动他们。有条件的朋友建议购买开发板直接实物验证,将理论与实践结合,早日成为“一灯大师”!