0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何快速成为点灯大师?

dyquk4xk2p3d 来源:良许Linux 作者:良许Linux 2022-12-13 09:48 次阅读

大家好,我是良许。

随着疫情的平稳,最近全国各地都陆续放开了。但很不幸,我的几个号主朋友不小心中招了,成了「阳过」。

良许在此提醒各位朋友,放开不等于躺平,该做的防护一个都不能少。虽然现在病毒没有刚爆发时的可怕,但也绝不是大号的感冒。根据身边的阳大侠反馈,一旦中招那是相当不舒服的,千万不要以身试毒。

好了,回归正题。最近在录制一套 STM32 的课程,导致公众号的原创变少了,跟各位朋友说声抱歉哈。从现在开始,我也在公众号连更一些 STM32 相关的内容,毕竟俺是嵌入式开发工程师哦(不是你们以为的运维哈)~

学习嵌入式,最经典的第一个实验就是点亮一颗 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);

点灯操作就到此结束了,后面我还会继续更新 STM32 的其它干货内容,敬请期待哦~

我也建了个嵌入式交流群,专门进行技术交流,而且也会发一发小福利,到时候也会将源码放在群里,想要进群的小伙伴可以扫描下面二维码进群哈:

4. 小结

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

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

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

审核编辑:汤梓红

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

    关注

    237

    文章

    22455

    浏览量

    645899
  • STM32
    +关注

    关注

    2240

    文章

    10675

    浏览量

    348866
  • GPIO
    +关注

    关注

    16

    文章

    1137

    浏览量

    50596

原文标题:如何快速成为点灯大师?

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    详析3D打印、快速成型与快速制造技术

     傻傻分不清楚——3D打印、快速成型与快速制造技术解析当前,3D打印、3D打印机、三维打印、快速成型、快速制造、数字化制造这些名词,如同一股旋风,仿佛一夜之间就在学术界、政界、传媒界、
    发表于 08-04 11:13 6503次阅读

    电子元器件快速销售 快速成为优质商家

    醒目标识 浮层展示实体认证信息 三大权威认证 保证金额度 工商认证情况 诚信积分 加入华强电子网会员:帮助公司做推广 帮助公司快速营销 帮助公司快速网络接单华强电子网电话 华强电子网会员申请 华强电子网咨询热线咨询电话:*** 0755-83796808QQ:969295
    发表于 08-04 22:26

    一本让你成为开关电源大师的书,非常经典!!!!

    本帖最后由 sjsazm 于 2015-9-9 21:51 编辑 一本让你成为开关电源大师的书,非常经典!!!!
    发表于 09-09 21:46

    emwin福利来了,emWin实例速成教程_如何快速入门ucGUI_emWin

    想学emwin的网友,福利来了emWin实例速成教程000_如何快速入门ucGUI_emWin
    发表于 03-30 16:27

    Altium designer PCB画板速成 郑振宇

    哪位大师有“Altium designer PCB画板速成 郑振宇 ”这本书籍的PDF资料和视频啊??有的话可以共享下吗?非常感谢的!!!!!!!!!!!
    发表于 07-10 11:49

    emWin实例速成教程000_如何快速入门ucGUI_emWin

    emWin实例速成教程000_如何快速入门ucGUI_emWin
    发表于 11-06 10:52

    速成Cadence Allegro的方法概述

    4周小白成为大神,速成Cadence Allegro 让你走向职场巅峰!.pdf(114.83 KB)
    发表于 10-08 07:49

    如何实现快速点灯并延长灯的使用寿命?

    本文提出了一种新型启动电路,并采用了电流积分作为识别冷热启动的判据,可靠地实现了快速点灯并延长了灯的使用寿命。
    发表于 05-17 06:02

    什么是3D打印?什么是快速成型?主流快速成型工艺的成型原理及优缺点分析

    3D打印机 , 快速成型 , 快速制造 若谈到近年来的制造业,3D打印、3D打印机、三维打印、快速成型、快速制造、数字化制造等等都是几大热词。这些名词,如同一股旋风,仿佛一夜之间就在学
    的头像 发表于 06-06 09:06 3.1w次阅读

    2020年底中国将会快速成为全球用户规模最大的5G市场

    根据运营商业务发展目标规划,2020年底国内5G用户预计将发展到两亿,中国也将快速成为全球用户规模最大的5G市场。
    发表于 04-01 09:57 1166次阅读

    快速成型解决方案:满足执业工程师的需求

    快速成型解决方案:满足执业工程师的需求
    发表于 03-22 20:29 6次下载
    <b class='flag-5'>快速成</b>型解决方案:满足执业工程师的需求

    什么是3d打印快速成型技术与其优点及原理

    3d打印技术是什么?确切的说,3D快速成型技术是众多快速成型技术之一,速成型技术大致可分为7大类,包括立体印刷、叠层实体制造、选择性激光烧结、熔融沉积成型、三维焊接、三维打印、数码累积成型等。
    的头像 发表于 04-03 17:24 1.1w次阅读

    快速IO链接PHY大师决议

    快速IO链接PHY大师决议
    发表于 04-18 19:36 9次下载
    <b class='flag-5'>快速</b>IO链接PHY<b class='flag-5'>大师</b>决议

    嵌入式驱动程序(5-1)点灯大师①之74HC595

    控制几十盏灯。所以会出一系列“点灯”文章。励志成为一个“点灯大师点灯大师①之74HC9591
    发表于 11-24 10:51 37次下载
    嵌入式驱动程序(5-1)<b class='flag-5'>点灯</b><b class='flag-5'>大师</b>①之74HC595

    51点灯与Linux驱动点灯的区别

    嵌入式初学者入门的第一个“项目”就是LED点灯,那么,本文带你看看51、STM32、Linux点灯有什么区别?
    的头像 发表于 03-10 17:37 2703次阅读