前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >蓝桥杯嵌入式之LED讲解

蓝桥杯嵌入式之LED讲解

作者头像
用户5935416
发布2019-08-01 18:00:31
1.2K0
发布2019-08-01 18:00:31
举报
文章被收录于专栏:IT界的小白帽IT界的小白帽

LED是比较简单且常用的模块。通过高低电平可以控制LED灯的亮灭。常见的可以用LED灯的闪烁表示程序的正常运行,也可以用LED灯的亮灭表示电梯所在的楼层或某些警告的有无等。

蓝桥杯嵌入式开发板LED灯的电路连接:

由上图可以看出LED灯的接法是共阳接法,由74HC573锁存I/O的端口输出电平。所以如果想使LED灯亮的话可以先使能74HC573的使能端,然后使相应的I/O口为低电平,那么就可以使该LED灯点亮。

74HC573的HD0~HD7(及LED灯的阴极端口)和74HC573的使能端与芯片的I/O端口电路连接如下图:

LED1—PC8

LED2—PC9

LED3—PC10

......................

LED8—PC15

NLE(74HC573使能端)—PD2

因其要用到的I/O口(PC8—PC15)也是LCD要用到的I/O口,即LED的I/O口被复用。一般情况下,LED的I/O口要分时使用,否则就会造成LED的显示不理想和LCD的黑屏或闪屏等不理想的现象。所以通过74HC573锁存器的锁存功能来分时使用这些I/O口。当74HC573的使能端(NLE)为高电平时,可以对这些I/O口进行相应的设置,使LED做出相应的亮灭变化。然后将NLE变为低电平,这时这些I/O口的高低电平被锁存到74HC573中。LED等的亮灭情况也会暂时不会改变,直至NLE被使能和I/O端口的高低电平有变化。NLE变为低电平后可以用作LCD的使用。并且LCD的显示效果不会因LED灯的亮灭状态变化而有人眼能察觉到的变化。

LED灯相应I/O端口初始化函数及解释

LED灯对应芯片的I/O口初始化代码如下

代码语言:javascript
复制
/**  * @说明     LED 相关GPIO引脚工作模式及时钟源配置  * @参数     None   * @返回值   None  */void LED_Init(void){    GPIO_InitTypeDef  GPIO_InitStructure;      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
    //LED引脚配置,PC08~PC15    GPIO_InitStructure.GPIO_Pin = LED0 |LED1 | LED2 | LED3 | LED4 | LED5 | LED6\                                  | LED7;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;    GPIO_Init(GPIOC, &GPIO_InitStructure);
    //74HC573锁存引脚配置,PD2    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;    GPIO_Init(GPIOD, &GPIO_InitStructure);}

其中LED0~LED7的定义可以为

代码语言:javascript
复制
//CT117E LED#define LED0    GPIO_Pin_8#define LED1    GPIO_Pin_9#define LED2    GPIO_Pin_10#define LED3    GPIO_Pin_11#define LED4    GPIO_Pin_12#define LED5    GPIO_Pin_13#define LED6    GPIO_Pin_14#define LED7    GPIO_Pin_15#define LEDALL  GPIO_Pin_All

GPIO_InitTypeDef为GPIO初始化结构定义,是一个结构体,包含要初始化具体哪个I/O端口、端口的速度和模式。GPIO_InitTypeDef的定义在stm32f10x_gpio.h的第87行。

RCC_APB2PeriphClockCmd为I/O口时钟使能函数。其参数为I/O端口号和是否使能信号。该函数定义在stm32f10x_rcc.c中的第1095行、声明在stm32f10x_rcc.h中的第693行。且其函数容易与stm32f10x_rcc.h中的第700行的RCC_APB2PeriphResetCmd函数搞混,有时会利用第二个函数初始化I/O口的时钟,导致I/O口无法正常使用。

其第一个参数的全部可用变量别名定义在stm32f10x_rcc.h中的第497行,第二个参数的全部可用变量别名定义在stm32f10x.h中的第522行。快速定位这些变量别名的方法:利用函数内部这些参数是否正确的函数,其定义的改行或上面为这些变量别名的全部列举,其他变量别名的查找也可以用这种方法。

RCC_APB2PeriphClockCmd与RCC_APB1PeriphClockCmd的区别(来源于openedv论坛):

RCC_APB2PeriphClockCmd负责AD、I/O、串口1、高级TIM

RCC_APB1PeriphClockCmd负责DA、串口2,3,4,5、普通TIM、USB、IIC、CAN

GPIO_InitTypeDef的第一个元素GPIO_Pin为要初始化的哪个I/O口。因为32 的I/O口比较多,所以可以不需刻意记住,用到的时候查看官方提供的电路图(比赛的时候有)。其全部的变量别名定义在stm32f10x_gpio.h中的第127行。

第二个元素GPIO_Mode为I/O口模式选择,其全部变量别名为GPIO_Mode_AIN(模拟输入)、GPIO_Mode_IN_FLOATING(浮空输入)、GPIO_Mode_IPD(下拉输入)、GPIO_Mode_IPU(上拉输入)、GPIO_Mode_Out_OD(开漏输出)、GPIO_Mode_Out_PP(推挽输出)、GPIO_Mode_AF_OD(复用开漏输出)、GPIO_Mode_AF_PP(复用推挽输出)。根据实际需求进行选择。其定义在stm32f10x_gpio.h中的第82行。

第三个元素GPIO_Speed为I/O口速度选择,其全部变量别名为GPIO_Speed_10MHz、GPIO_Speed_2MHz、GPIO_Speed_50MHz。可以根据数字和单位知道其含义。根据实际需求进行选择,两两之间的影响不大。其定义在stm32f10x_gpio.h中的第64行。

函数GPIO_Init为I/O口初始化函数。其第一个参数为I/O的变量别名,第二个参数为GPIO初始化结构定义变量的指针(或地址)。第一个参数的全部变量别名定义在stm32f10x.h中的第1408行。

I/O口的初始化步骤为:

1、定义GPIO初始化结构定义变量

2、初始化I/O口时钟

3、GPIO初始化结构定义变量的赋值

4、I/O口初始化函数的调用

LED灯控制函数(建议使用)

因为大多数的情况要多次改变LED灯的亮灭状态,如果在改变时进行相应函数的编写的话比较麻烦,而且也会提高代码的冗余度。所以一般写一个LED灯的控制函数,解决以上的问题。因为LED灯的控制函数要根据情况进行确定,种类多样。所以以下只是列举一般的控制函数。

代码语言:javascript
复制
/**  * @说明     控制LED打开或关闭  * @参数     Led: LED编号,GPIO_Pin_8到GPIO_Pin_15  * @参数     Ledstatus: 0,关闭LED;1,打开LED  * @返回值   None  */void LED_Control(uint16_t LED,uint8_t LED_Status){    if(LED_Status == 0){        GPIO_SetBits(GPIOC,LED);        GPIO_SetBits(GPIOD,GPIO_Pin_2);        GPIO_ResetBits(GPIOD,GPIO_Pin_2);  //状态锁存    }            else    {        GPIO_ResetBits(GPIOC,LED);        GPIO_SetBits(GPIOD,GPIO_Pin_2);        GPIO_ResetBits(GPIOD,GPIO_Pin_2);  //状态锁存        }}

函数GPIO_SetBits是使相应的I/O口设置为高电平。函数GPIO_ResetBits是使相应的I/O口设置为低电平。其第一个参数和第二个参数合起来确定使能哪个I/O口。函数GPIO_SetBits定义在stm32f10x_gpio.c中的第358行、声明在stm32f10x_gpio.h中的第357行。函数GPIO_ResetBits定义在stm32f10x_gpio.c中的第374行、声明在stm32f10x_gpio.h中的第358行

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT界的小白帽 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档