使用STM32单片机点亮LED

控制/MCU

1815人已加入

描述

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

传说,每一个成功的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部分的原理图。

STM32

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

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

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

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

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

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

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

Part 2

用库函数编程方法点灯

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

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

STM32

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() 函数,查看其详细信息

STM32

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

继续查看GPIO_InitTypeDef类型的定义。

STM32

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软件建立的工程中。可参考以下形式。(细节详见文末提供的资料分享)

STM32

STM32

STM32

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

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分