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

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

3天内不再提示

蓝桥杯的第一个项目,点亮一个LED

撞上电子 2025-01-02 21:02 次阅读

第一节 IO简介

GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。每个GPIO内部都有这样的一个电路结构:

d5c6ed70-c909-11ef-9434-92fbcf53809c.png


这边的电路图稍微提一下:

保护二极管:IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入。当引脚电压高于VDD时,上方的二极管导通;当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。但是尽管如此,还是不能直接外接大功率器件,须加大功率及隔离电路驱动,防止烧坏芯片或者外接器件无法正常工作。

P-MOS管和N-MOS管:由P-MOS管和N-MOS管组成的单元电路使得GPIO具有“推挽输出”和“开漏输出”的模式。这里的电路会在下面很详细地分析到。

Q-TTL肖特基触发器:信号经过触发器后,interwetten与威廉的赔率体系 信号转化为0和1的数字信号。但是,当GPIO引脚作为ADC采集电压的输入通道时,用其“模拟输入”功能,此时信号不再经过触发器进行TTL电平转换。ADC外设要采集到的原始的模拟信号。

这里需要注意的是,在查看数据手册中,会看到有“FT”一列,这代表着这个GPIO口时兼容3.3V和5V的;如果没有标注“FT”,就代表着不兼容5V。

GPIO支持4种输入模式(浮空输入、上拉输入、下拉输入、模拟输入)和4种输出模式(开漏输出、开漏复用输出、推挽输出、推挽复用输出)。同时,GPIO还支持三种最大翻转速度。每个I/O口可以自由编程,但I/O口寄存器必须按32位字被访问。下面将具体介绍GPIO的这八种工作方式。

1,浮空输入模式

浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。也就是说,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的。

2,上拉输入模式

d5e3aea6-c909-11ef-9434-92fbcf53809c.png

上拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(无信号输入)的情况下,输入端的电平可以保持在高电平;并且在I/O端口输入为低电平的时候,输入端的电平也还是低电平。

3,下拉输入模式

d60357c4-c909-11ef-9434-92fbcf53809c.png

下拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平可以保持在低电平;并且在I/O端口输入为高电平的时候,输入端的电平也还是高电平。

4,模拟输入模式

d6217aba-c909-11ef-9434-92fbcf53809c.png

模拟输入模式下,I/O端口的模拟信号(电压信号,而非电平信号)直接模拟输入到片上外设模块,比如ADC模块等等。

5,开漏输出模式

d637a812-c909-11ef-9434-92fbcf53809c.png

开漏输出模式下,通过设置位设置/清除寄存器或者输出数据寄存器的值,途经N-MOS管,最终输出到I/O端口。这里要注意N-MOS管,当设置输出的值为高电平的时候,N-MOS管处于关闭状态,此时I/O端口的电平就不会由输出的高低电平决定,而是由I/O端口外部的上拉或者下拉决定;当设置输出的值为低电平的时候,N-MOS管处于开启状态,此时I/O端口的电平就是低电平。同时,I/O端口的电平也可以通过输入电路进行读取;注意,I/O端口的电平不一定是输出的电平。

6,开漏复用输出模式

d64e808c-c909-11ef-9434-92fbcf53809c.png

开漏复用输出模式,与开漏输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的。

7,推挽输出模式

d6551f46-c909-11ef-9434-92fbcf53809c.png

推挽输出模式下,通过设置位设置/清除寄存器或者输出数据寄存器的值,途经P-MOS管和N-MOS管,最终输出到I/O端口。这里要注意P-MOS管和N-MOS管,当设置输出的值为高电平的时候,P-MOS管处于开启状态,N-MOS管处于关闭状态,此时I/O端口的电平就由P-MOS管决定:高电平;当设置输出的值为低电平的时候,P-MOS管处于关闭状态,N-MOS管处于开启状态,此时I/O端口的电平就由N-MOS管决定:低电平。同时,I/O端口的电平也可以通过输入电路进行读取;注意,此时I/O端口的电平一定是输出的电平。

8,推挽复用输出模式

d675a8ce-c909-11ef-9434-92fbcf53809c.png

推挽复用输出模式,与推挽输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的。

第二节 硬件解读

先看看原理图:

d69600ce-c909-11ef-9434-92fbcf53809c.png

开发板上面一共有3颗可编程LED,控制的引脚分别是PB2,PB5和PB12,LED右侧通过一共限流电阻上拉到3.3V,所有stm32给一个低电平就会点亮LED,反之则熄灭。

第三节 CubeMX配置

第一步:双击打开STM32CubeMX,如下图,新建项目。【注意:新建项目本教程只介绍一次,以后项目的建立不在重复】

d6a76940-c909-11ef-9434-92fbcf53809c.png

第二步:在英文状态下搜索芯片:STM32WLE5CCU6【注意:尽可能靠近该芯片,不一定是STM32WLE5CCU6,不同STM32CubeMX版本,芯片的名字不一样的】选后选择对应的芯片即可。

d6c3a876-c909-11ef-9434-92fbcf53809c.png

第三步:在1处查看芯片的视图,选择2处后可以看见芯片所有的功能,选择3处的RCC时钟,在4处配置外部高速时钟,一切配置完了之后,会在5处看见GPIO变绿色。,如下图。【注意:本教程晶振配置仅配置一遍,后续教程将不再重复】

d6e16a8c-c909-11ef-9434-92fbcf53809c.png

第四步:在1处切换到时钟树页面,在2处配置外部晶振大小,蓝桥杯物联网开发板外接高速晶振为32MHZ,所以这里配置成32MZH,在3处配置HCLK时钟为最大时钟,最大时钟为48MHZ。如下图。【注意:本教程时钟树配置仅配置一遍,后续教程将不再重复】

d6fa23ce-c909-11ef-9434-92fbcf53809c.png

d719137e-c909-11ef-9434-92fbcf53809c.png

第五步:配置下载器,在3处选择DEBUG,在4处选择JTAG模式,之后就可以看见5处和6处的GPIO变绿色了。【注意:本教程下载器配置仅配置一遍,后续教程将不再重复】

d73486c2-c909-11ef-9434-92fbcf53809c.png

第六步:配置STM32的PB2引脚为GPIO_Output,如下图:

d75d21b8-c909-11ef-9434-92fbcf53809c.png

第七步:以同样配置STM32的PB5和PB12引脚为GPIO_Output,如下图:

d77d7d82-c909-11ef-9434-92fbcf53809c.png

第八步:在1处可以看见选中GPIO的配置,在2处看见GPIO的输入输出的引脚,在3处选择PB2,在4处配置GPIO的默认高低电平,因为低电平LED亮,我们默认低电平,在5处配置为上拉,和硬件配置保持一致,在6处配置用户标签,便于管理。如下图:

d7b51134-c909-11ef-9434-92fbcf53809c.png

其中:具体配置信息如下:

GPIO output leve:表示上电的默认电平,可配置高(High)或者低(Low);

GPIO mode:表示输出模式,可为Output Push Pull(推挽输出)或Output Open Drain(开漏输出);

GPIO Pull-up/Pull-down:表示是否上下拉,可配置为上拉(Pull-up)或者下拉(Pull-down)或不上拉也不下拉(No Pull-up and no Pull-down);

Maximum output speed:表示输出速度,可配置为低速(Low)或者中速(Medium)或高速(High)或超高速(Very High);

User Label:表示用户标签,可修改IO口名称,比如可写入LED,把IO口名称变为LED;

第九步:和PB2一样配置其他2个GPIO。

第十步:选择项目信息,如下配置:2处是项目的名字;3处是项目的路径;4处是编译器;5处是编译器版本【注意:项目路径不能包含中文等其他非法字符;编译器一定要选择MDK-ARM;编译器版本要选择最新的,本教程为v5.37。后续教程将不在重复本步操作】

d7ca4810-c909-11ef-9434-92fbcf53809c.png

第十一步:如下图,将3,4处的按钮勾选,点击5处,生成Keil工程。注意:后续教程将不在重复本步操作】

d7e1762a-c909-11ef-9434-92fbcf53809c.pngd810f71a-c909-11ef-9434-92fbcf53809c.png

第十二步:点击上步的5处之后,会有一个对话框,意思分别是:打开项目文件夹位置;打开项目;关闭本窗口。注意:这里灵活处理,打开文件夹和项目都可以。后续教程将不在重复本步操作】

d824f3b4-c909-11ef-9434-92fbcf53809c.png

第四节 MDK代码

第一步,编译代码,检查STM32CubeMX生成的代码是否正常。如下图,点击1处编译,之后在2处可以看见一个警告,是因为MDK版本太新,高于CubeMX选择的V5.37,导致编译器不一样,但是不影响程序运行。注意:后续教程将不在重复本步操作】

d83559fc-c909-11ef-9434-92fbcf53809c.png

第二步:配置下载器,这一步很多步骤,希望大家仔细一点,一步一步来。注意:不要忘记点击“OK”,后续教程将不在重复本步操作】

d8436e52-c909-11ef-9434-92fbcf53809c.png

第三步:新建.h文件。在“项目名/Core/Inc”中新建一个“zsdz.h”的文件。注意:后续教程将不在重复本步操作】

d86dff00-c909-11ef-9434-92fbcf53809c.png

第四步:新建.c文件。在“项目名/Core/Src”中新建一个“zsdz.c”的文件。注意:后续教程将不在重复本步操作】

d881fa32-c909-11ef-9434-92fbcf53809c.png

第五步:添加“zsdz.c”文件。点击1处,可以看见项目的所有的文件,点击2,3处,准备添加“zsdz.c”文件,但是发现没有“zsdz.c”文件,如下图:需要返回到上一层文件目录中,点击4处。注意:后续教程将不在重复本步操作】

d8930188-c909-11ef-9434-92fbcf53809c.png

如下图:虽然没有发现“zsdz.c”文件,但是我们看见了Core文件夹,还记得我们的“zsdz.c”文件保存在哪吗?在“项目名/Core/Src”中,所以我们进入到“/Core/Src”,找到“zsdz.c”文件即可。注意:后续教程将不在重复本步操作】

d8ad1500-c909-11ef-9434-92fbcf53809c.pngd8cfedf0-c909-11ef-9434-92fbcf53809c.png

第六步:如下图,代表添加成功。注意:后续教程将不在重复本步操作】

d8e2e220-c909-11ef-9434-92fbcf53809c.png

第七步:如下,点击1处,可以看见MDK中的“zsdz.c”文件。注意:如果利用STM32CubeMX生成MDK项目,“zsdz.c”文件可能会从MDK项目中移除,请重新添加】

d8fe7026-c909-11ef-9434-92fbcf53809c.png

第八步:编写“zsdz.c”文件的代码,如下:注意:后续教程将不在重复本步操作】

d91a45da-c909-11ef-9434-92fbcf53809c.png

第九步:进入到“zsdz.h”文件,右键,选择“Go to Headerfile‘zsdz.h’”。注意:后续教程将不在重复本步操作】

d9362110-c909-11ef-9434-92fbcf53809c.png

第十步:编写“Zsdz.h”文件的代码,如下:注意:后续教程将不在重复本步操作】

d94d2bda-c909-11ef-9434-92fbcf53809c.png

第十一步:在Main中添加“zsdz.h文件”,如下:注意:只可以添加在“USER CODE BEGIN”和“USER CODE BEGINEND”之间,否则等下次利用STM32CubeMX生成MDK项目时,不在“USER CODE BEGIN”和“USER CODE END”之间的代码会被覆盖】

d9619cd2-c909-11ef-9434-92fbcf53809c.png

第十二步:编写LED的函数模板,具体如下:注意:不要忘记声明gpio.c文件。注意:后续教程将不在重复本步操作】

d9719786-c909-11ef-9434-92fbcf53809c.png

第十三步:以上就是LED所有的封装函数了,我们在“zsdz.h”文件中声明他们,如下图:注意:后续教程将不在重复本步操作】

d9806252-c909-11ef-9434-92fbcf53809c.png

第十四步:现在随便在main函数中写几个,看看效果。

d990b9ea-c909-11ef-9434-92fbcf53809c.png

第十五步:编译检查代码并下载。点击1处编译代码,之后在2处可以看见0错误0警告。代码没有问题之后,点击3处下载代码,在4处看见Flash Load finished at xxxx,就证明代码下载成功。注意:后续教程将不在重复本步操作】

d9988bc0-c909-11ef-9434-92fbcf53809c.png


第五节 实验现象

注意:

1,请用USB线连接电脑与开发板。

2,请选择A开发板。

现象:AL2以400ms为间隔闪烁。

来源:撞上电子微信公众号

版权:东莞市东城墨竹公子电子工作室

日期:2024.11.03


第六节 课后作业

请让AL1长亮,AL2以500ms为间隔闪烁,AL3以1000ms为间隔闪烁。

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

    关注

    242

    文章

    23299

    浏览量

    661424
  • STM32
    +关注

    关注

    2270

    文章

    10906

    浏览量

    356467
  • GPIO
    +关注

    关注

    16

    文章

    1205

    浏览量

    52163
  • 蓝桥杯
    +关注

    关注

    1

    文章

    128

    浏览量

    10158
收藏 人收藏

    评论

    相关推荐

    请问点亮第一个led使用的远程怎么操作?

    我选的桥接模式,unbanto 不能上网,和视屏中不样,还有就是关于点亮第一个led中使用的远程怎末操作,必须使用有线吗?无线行不行
    发表于 04-22 05:20

    如何使用STM32CUBEMX点亮你的第一个LED

    如何使用STM32CUBEMX点亮你的第一个LED
    发表于 10-11 09:35

    如何使用寄存器点亮第一个LED

    如何使用寄存器点亮第一个LED
    发表于 11-30 07:44

    如何用stm32cubeMX+MDK在蓝桥物联网开发板上面点亮LED

    第一节硬件解读任何实验都是从点亮LED开始的
    发表于 01-06 07:51

    如何去实现点亮第一个LED的设计呢

    点亮第一个LED/**************************************************************************************实验现象
    发表于 01-07 08:16

    点亮人生中的第一个流水灯

    上期回顾:上篇文章我写了单片机入门(二):点亮奇数位/偶数位LED灯**单片机入门(4):点亮人生中的第一个流水灯、需求分析做
    发表于 01-19 07:59

    如何点亮第一个LED灯?

    如何点亮第一个LED灯?
    发表于 01-20 06:58

    点亮第一个闪亮led

    单片机点亮第一个
    发表于 03-28 14:26 1次下载

    51单片机基础点亮第一个LED实验

    点亮第一个LED实验
    发表于 11-23 16:36 15次下载
    51单片机基础<b class='flag-5'>点亮</b><b class='flag-5'>第一个</b><b class='flag-5'>LED</b>实验

    蓝桥嵌入式主板G4】第三章 点亮LED

    第一节硬件解读任何实验都是从点亮LED开始的
    发表于 11-23 18:21 7次下载
    【<b class='flag-5'>蓝桥</b><b class='flag-5'>杯</b>嵌入式主板G4】第三章 <b class='flag-5'>点亮</b><b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>LED</b>

    STM32+cubeMX第一个工程,点亮LED

    STM32+cubeMX第一个工程,点亮LED打开cubeMX选择new project创建stm32工程,芯片选择stm32f103c
    发表于 12-03 13:06 0次下载
    STM32+cubeMX<b class='flag-5'>第一个</b>工程,<b class='flag-5'>点亮</b><b class='flag-5'>LED</b>

    单片机点亮第一个小灯

    点亮第一个小灯1、设计要求用开关控制LED亮灭。2、硬件设计Proteus ISIS 仿
    发表于 12-17 18:25 14次下载
    单片机<b class='flag-5'>点亮</b><b class='flag-5'>第一个</b>小灯

    第一个STM32CubeIDE项目

    使用STM32CubeIDE的第一个项目开始第一个项目添加代码今天开始做一个STM32CubeIDE的
    发表于 12-29 19:29 11次下载
    <b class='flag-5'>第一个</b>STM32CubeIDE<b class='flag-5'>项目</b>

    蓝桥物联网】第四章 ​点亮LED

    点击上方「撞上电子」关注我们第一节硬件解读任何实验都是从点亮
    的头像 发表于 08-10 18:22 771次阅读
    【<b class='flag-5'>蓝桥</b><b class='flag-5'>杯</b>物联网】第四章 ​<b class='flag-5'>点亮</b><b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>LED</b>

    蓝桥嵌入式主板G4】第三章 点亮LED

    点击上方「撞上电子」关注我们第一节硬件解读任何实验都是从点亮
    的头像 发表于 08-17 09:52 1327次阅读
    【<b class='flag-5'>蓝桥</b><b class='flag-5'>杯</b>嵌入式主板G4】第三章 <b class='flag-5'>点亮</b><b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>LED</b>