如何快速成为点灯大师?

发布者:boyhxz最新更新时间:2024-01-11 来源: elecfans关键字:STM32  LED 手机看文章 扫描二维码
随时随地手机看文章

学习嵌入式,最经典的第一个实验就是点亮一颗 LED 灯。别小看这个实验,从我辅导的学员来看,不少初学者连这么简单的案例都做不出来。


想要成这一名优秀的点灯大师,第一步就是要学会 STM32 最基础的外设——GPIO。


1. 什么是GPIO?

1.1 定义

GPIO是通用输入输出(general-purpose input/output)端口的简称,简单来说就是STM32可控制的引脚STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。

这是比较正式的说法,是不是听得一愣一愣的?

再简单一点,就是芯片里拉出一堆引脚,这些引脚在我们的控制下可以输出高电平/低电平,或者可以通过这些引脚向芯片输入一些信号,从而实现你们的一些目的。

1.2 命名规则

STM32F103C8T6 这颗芯片为例,它的 GPIO 口一共有 37 个,如何对它们进行命名呢?总不能叫翠花、二蛋、狗剩吧?

咱有正规的命名规则,那就是组编号+引脚编号。

什么是组编号?那就是 GPIOA, GPIOB, GPIOC, GPIOD .. GPIOG,一般最多到 GPIOG 。

什么是引引脚编号?那就是 0,1,2,3 ... 15。

所以组合起来,就是:

PA0, PA1, PA2 .. PA15

PB0, PB1, PB2 .. PB15

PC0, PC1, PC2 .. PC15

...

但并不是所有的芯片都有 A 到 G 个组,就比如咱这颗芯片就只有 A~D 四组。而且也不是每组都有 15 个引脚,就比如 D 组就只有 0 和 1 两个引脚。

1.3 内部框架

6a772586-7a1d-11ed-8abf-dac502259ad0.jpg

上面这张图来自于官方手册,看起来是不是有点吓人?

吓到你就对了,第一次看到的时候我也吓哭了。但是,作为初学者,可以先不用研究太底层的内容,咱先把灯点起来再说,否则你学会了一堆理论知识,结果到头来连颗灯都点不起来,岂不是本末倒置了?

1.4 推挽输出与开漏输出

咱先看下这两种输出的电路图

6a8c9a10-7a1d-11ed-8abf-dac502259ad0.jpg

从电路图可以看出,这两种输出有着本质的区别:

推挽输出: 可以真正的输出高电平和低电平

开漏输出: 开漏输出无法真正输出高电平,即高电平时没有驱动能力,需要借助外部上拉电阻完成对外驱动。

2. 如何点亮一颗 LED 灯?

我们先看下 LED 灯的接线。

6a9df896-7a1d-11ed-8abf-dac502259ad0.jpg

可以看到,LED 灯都是一侧通过电阻拉高,另一侧接到 GPIO 脚。所以,GPIO脚必须拉低,这样才会产生电压,对应的 LED 灯才会亮起来。

以 LED1 为例,它又接到了哪个引脚上呢?咱看原理图,一定要遵循一个原则:标号一样的导线在物理上是连接在一起的。

6aae01e6-7a1d-11ed-8abf-dac502259ad0.jpg

很明显,LED1 引脚是连接在 PB8 这个 GPIO 口的。所以,我们只要编程将 PB8 拉低,就可以实现将 LED1 灯点亮。

3. 编程实现点灯

3.1 常用 GPIO HAL 库函数

对于单片机编程,一般有三种方式:寄存器编程、标准库编程、HAL 库编程。目前,HAL 库编程方式是 ST 公司主推的编程方式,这也是时代的潮流,所以我们主要介绍的还是 HAL 库编程。

GPIO 常用 HAL 库函数有以下这几个:

voidHAL_GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_Init);

voidHAL_GPIO_WritePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,GPIO_PinStatePinState);

GPIO_PinStateHAL_GPIO_ReadPin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin)

voidHAL_GPIO_TogglePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);


HAL_GPIO_Init 这个函数是初使化一个 GPIO 引脚的,如果你使用 CubeMX 的话,那么初始化的代码将自动生成,你甚至都不需要自己动手写。

HAL_GPIO_WritePin 就是可以将对应的引脚拉高或拉低,我们点灯的时候用的就是这个函数。而它的兄弟 HAL_GPIO_ReadPin 就是获取某个引脚的状态(拉高 or 拉低)。

最后的 HAL_GPIO_TogglePin 可以实现引脚电平的翻转,比如原来是高电平,则会被翻转为低电平;原来是低电平,则会被翻转为高电平。

3.2 CubeMX 配置

配置debug模式

6aca0724-7a1d-11ed-8abf-dac502259ad0.jpg

配置 PB8 引脚

右侧选中 PB8 引脚,然后选择 GPIO_Output 模式。

6ae428de-7a1d-11ed-8abf-dac502259ad0.jpg

在中间栏里,点击对应的 GPIO 管脚,然后属性按图中所示设置。特别要注意,咱刚开始要将 PB8 拉高,否则一上电 LED1 就亮了。我们要在代码中将它点亮。

6af72e66-7a1d-11ed-8abf-dac502259ad0.jpg

配置工程

注意哈,一定不要将工程放在有中文路径的地方,否则将出现异常情况!

6b115250-7a1d-11ed-8abf-dac502259ad0.jpg6b2e2f42-7a1d-11ed-8abf-dac502259ad0.jpg

都配置完成之后,就可以点击右上角的 GENERATE CODE 来生成工程了。

3.3 编写代码

到这边,我们的工作已经完成大半了。CubeMX 的强大之处,就是它可以通过简单的几次点击,就可以自动生成初始化代码。

比如下面的这段 GPIO 口初始化代码,如果自己写的话,至少需要几分钟时间,但它都已经自动帮你写好了,非常方便!

voidMX_GPIO_Init(void)

{


GPIO_InitTypeDefGPIO_InitStruct={0};


/*GPIOPortsClockEnable*/

__HAL_RCC_GPIOA_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();


/*ConfigureGPIOpinOutputLevel*/

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);


/*ConfigureGPIOpin:PB8*/

GPIO_InitStruct.Pin=GPIO_PIN_8;

GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull=GPIO_NOPULL;

GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);


}


接下来,我们就可以在 main 函数的 while 循环里写自己的这么一段代码,就可以实现 LED1 隔 1 秒点亮 1 秒的效果了。

一定要注意哈,要把代码放在 USER CODE BEGIN 和 USER CODE END 里,否则你修改了 cubemx 的配置,自动生成的代码会将你写好的代码覆盖掉,那你的代码就白写了!

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);

HAL_Delay(1000);

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);

HAL_Delay(1000);


点灯操作就到此结束了


4. 小结

千里之行,始于足下。点亮 LED 灯不难,但这是你学习 STM32 的第一步。千万不要过于自大,觉得这个太简单,然后就不自己动手操作。

很多小伙伴学习编程,都是觉得这个简单,然后不自己动手,结果学了一段时间后,突然发现,貌似自己啥也没学会~

所以,动手才是硬道理,千万不要自大,盲目自信!!


关键字:STM32  LED 引用地址:如何快速成为点灯大师?

上一篇:cortex-m3的操作模式及特权级别
下一篇:memheap死机问题的分析与解决

推荐阅读最新更新时间:2024-11-03 19:07

美国国家半导体推出具动态调压功能的LED驱动器
美国国家半导体公司(National Semiconductor Corporation)(美国纽约证券交易所上市代码:NSM)宣布推出业界首款具有动态电压调整功能并拥有多条输出通道的大功率LED驱动器。这款控制器的特点是可以驱动多达4串LED,每串LED的驱动电流大小一致,偏差极小,而且效率极高。这款型号为LM3464的控制器属于美国国家半导体PowerWise®高能效系列,可以最大化提高系统效率,精简系统设计,从而降低开发成本,尤其适用于需要大量采用LED驱动器的照明系统,例如工业照明系统、路灯及汽车照明系统。 传统的高亮度LED驱动器都分别为每串LED提供独立的驱动电流。而LM3464
[电源管理]
美国国家半导体推出具动态调压功能的<font color='red'>LED</font>驱动器
STM32之父谈2019产品蓝图:性价比、AI、开发体验
日前,在2019年STM32峰会上,STM32之父,意法半导体微控制器事业部全球市场总监Daniel Colonna介绍了STM32产品规划及生态战略。 Daniel几十年来的工作一直围绕着微控制器。自2006年起任意法半导体微控制器事业部全球市场总监 。他于1982年加入德州仪器,担任微控制器应用工程师;1986年加入Thomson-Mostek,负责8位微控制器业务;三年后,加入意法半导体法国公司,担任8位微控制器产品市场经理,并于90年代后期致力于启用ARM32位架构。 2002年,意法半导体推出首个基于ARM7的产品系列STR7,Daniel对此作出了重要贡献。后来,他带领团队启用新的Cortex-M架构,为意法半导体
[单片机]
<font color='red'>STM32</font>之父谈2019产品蓝图:性价比、AI、开发体验
基于半桥驱动器IR2153的荧光电子镇流器
摘要:介绍了一个基于自激式半桥驱动器IR2135的荧光灯电子镇流器电路,着重介绍了灯丝预热和启动保护等单元电路的构成和的特点,并给出了详细电原理图。 关键词:电子镇流器;功率因数校正;灯丝预热;重启动   0 引言 荧光灯的发光效率优于白炽灯已成为不争的事实,为此,近20年来,电子镇流器在世界范围内得到了迅速的普及和发展,各半导体厂家推出了众多的用于电子镇流器的驱动电路,本文介绍的电子镇流器基于IR公司开发的IR2153驱动器和摩托罗拉公司的MC33262功率因数控制器,是一种结构简单,成本低廉,可靠性高的解决方案。 1 自激式半桥驱动器IR2153介绍 IR2153是在IR2155和IR2151基础上推出
[电源管理]
基于半桥驱动器IR2153的荧光<font color='red'>灯</font>电子镇流器
stm32 exti 5~9 中断源区分
void EXTI9_5_IRQHandler(void) { u32 Temp = 0x00; PEout(2) = ~PEout(2); Temp = EXTI- PR; //取读是那个引脚的中断 switch(Temp) { case Exti_From_Pin8: EXTI_ClearITPendingBit(EXTI_Line8); break; case Exti_From_Pin9: if(Sys_Status MAX_STATUS) { Sys_Status ++; } EXTI_ClearITPendingBit(EXTI_Line9)
[单片机]
<font color='red'>stm32</font> exti 5~9 中断源区分
Marvell推出88EM8187 LED 驱动器
Marvell 88EM8187 LED控制器提供无与伦比的深度调光性能和业界最高集成度 采用创新性数字架构,经过兼容性测试,与照明控制领导者Lutron的调光器兼容,提供超深度、无闪烁、微光少的调光性能,需要更少组件,延长灯泡寿命 2014年2月25日,北京讯- 全球整合式芯片解决方案的领导厂商美满电子科技(Marvell,Nasdaq:MRVL)今日宣布,推出Marvell® 88EM8187 LED 控制器集成电路(IC)系列。该系列控制器是切相、深度调光、单级AC/DC恒流控制器,用于可调光LED灯和灯具。该驱动器IC系列以业界领先的88EM8183为基础上而开发,采用独特的混合信号架构,并内置先进的数字
[电源管理]
STM32 HAL库的功能和使用方法 STM32 HAL库和标准库的区别
HAL(Hardware Abstraction Layer)是指硬件抽象层,是一种封装底层硬件接口驱动的编程库。在嵌入式系统中,HAL库可以更加方便地实现硬件控制和设备访问,提高代码可移植性和可维护性,从而节省开发成本和时间。STM32 HAL库是STM32系列芯片的HAL库,由ST公司提供和维护。下面将介绍STM32 HAL库的功能、使用方法以及与标准库的区别。 STM32 HAL库的功能 HAL库提供了一系列API函数和硬件抽象接口,用于实现对STM32芯片上各种外设的控制,包括输入输出控制(如GPIO、USART、SPI等)、定时器和计数器控制、中断控制、时钟控制等。STM32 HAL库主要实现了以下功能: 直接调用硬
[单片机]
【实例剖析】如何应对LED封装失效?
在用到 LED 灯的时候最怕的就是LED灯不亮,这个时候不要责怪环境,不正确的安装方法、保护措施和过高电源是导致灯不亮的重要原因。当然很多时候也是人为因素。这里结合8大实例来剖析如何应对 LED封装 失效?    死灯不亮,不要责怪环境,不正确的安装方法、保护措施和过高电源是导致灯不亮的重要原因。   1、 LED散热 不好导致固晶胶老化,层脱,芯片脱落   预防措施:焊接时防止LED悬浮,倾斜。做好LED散热工作,保证LED的散热通道顺畅。   2、过电流过电压冲击导致驱动,芯片烧毁,灯具处于开路或短路状态   预防措施:做好EOS防护,防止电流和电压大于灯具的电流和电压冲击或者长时间驱动LED。   3、过电流冲击,烧断金线
[电源管理]
stm32控制舵机
#include stm32f10x.h void GPIO_TimPWM(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM_CH2 GPIOA_Pin_7输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50M
[单片机]
<font color='red'>stm32</font>控制舵机
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved