江协STM32:点亮第一个LED灯和流水灯

ee9ee087cb7b4b52a7a4bf3db90f74ca.png

很多单片机都是高电平弱驱动,低电平强驱动,所以这里是低电平有效

 

点亮一个LED灯

操作STM32的GPIO需要三个操作:

第一个使用RCC开启GPIO的时钟

第二步使用GPIO_Init函数初始化GPIO

第三步使用输出或输入函数控制GPIO

 

 

1.使用RCC开启GPIO的时钟

 

1.1.RCC的库函数

点击

efca2beb819f4f96880c86b0ca36e6fa.png

c6ba051a4c4b4d219a3fe4a30482c467.pngdc00826cd71a4f32a1be1ff2a6e62d5b.png主要用到这三个函数

904de417ed0a4563b54759ecbc9253e4.png

1126这个函数:第一个参数选择外设,第二个参数使能或失能

ac32b54ab851453f8cebc0c9414018f6.png

示例 开启GPIOA的时钟

1.2.GPIO库函数:

还是Librayry里面

0b8ac10f31df46238bf0dd26f248db57.png

7c1e600ee75648a583cb2a0a3f3105c8.png

GPIO全部函数

349行函数调用之后,所指定的GPIO函数外设就会被复位,这个就是这个函数的用途

350行函数,作用:复位AFIO外设

351行函数,非常重要,这个函数的作用是用结构体的参数来初始化GPIO口,我们需要先定义一个结构体变量,再给结构体赋值,最后调用这个函数,这个函数内部就会自动读取结构体的值,然哈自动把外设的各个参数配置好

 

352行函数,这个函数可以把结构体变量赋给一个默认值

353-356这四个函数就是GPIO的读取函数

357-360这四个就是GPIO的写入函数

353-360这些函数就可以实现读写GPIO口的功能

361-366目前不用

 

这里面最重要的函数是:351,353-360

 

LED灯程序编写:

489d7951123548efb84f7359db1e88f6.png2.1.首先调用RCC里面的APB2外设时钟控制函数

22ab690ab30948d891cedd5e86199d7d.png因为要点亮PA0口的LED,所以选择RCC_APB2Periph GPIOA这一项

ac32b54ab851453f8cebc0c9414018f6.png

第二个参数选择ENABLE,放到第二个参数

这样时钟就开启了

2.2.然后调用GPIO_Init函数

08491b9a24d64decae23223cc3506b3f.png

28ff1bfc8538455d9ca6555078ebb016.png

efd8efd6d12e4baeb06d6a446bd375b3.png第一个参数选择GPIOA,第二个参数是一个结构体

11d70070b3d54eae8d881d7abc3897f3.png把结构体定义出来

b9acaa60d6f54c33a45bc78b7923b91b.png然后用点把结构体的成员都定义出来

a59385fc759443bcb8a8f88cfb67cb0d.png

然后从8开始到10都是一个套路,右键跳转,看说明,复制粘贴一下参数

6aa8109a662b437f82a52f84b36b93df.png

选择这个,Ctrl+F搜索一下,然后跳转下图

d19af6cfc6484de6b710bf7fb71cbbfc.png这里就是GPIO的八种工作模式

AIN是模拟输入,IN_FLOATING是浮空输入,IPD是下拉输入,IPU是上拉输入

OUT_PD是开漏输出,OUT_PP是推挽输出,AF_OD是复用开漏,AF_PP是复用推挽

e7599225556745b480eae59c1e40f1c9.png

点灯是推挽输出,所以复制OUT_PP

推挽输出:可以高电平也可以低电平

bc58b16a792d4577af888d1ad16557a5.png

接下来GPIO_Pin选择引脚,然后继续右键跳转

317b9fa8c01642bc95bad2eabaeb5240.png选择menber

0621d6c3715a49a4ba20c815eef11edf.png然后选择这个,Ctrl+F然后跳转下图

c42e76cf42774671a9754585cd7b07b2.png这里因为用的是GPIOA外设的0号引脚,所以选择GPIO_Pin_0

1ca4d782900e4bab9349f59ac594caf8.png

这样就设置好引脚了

b5dfbdb4e0774babb0a442fd32dfb894.png

然后设置第三个,还是右键跳转

ae398349d9b64426b32d7d682a335225.png

Ctil+F搜索,跳转下面页面

94cd352432494de797d98a9e47d9c3db.png输出速度选50HZ就行

464f5ed0ec074427a26bb18676480c8c.png

最后把GPIO初始化结构体的地址放到GPIO_Init的第二个参数就行了,这样GPIO初始化就完成了

当这个GPIO_Inlt函数执行完,这个GPIO外设的0号引脚就自动被配置为推挽输出,50HZ的速度了

 

它内部的主要执行逻辑就是读取结构体的参数,执行一堆判断和运算,最后写入到GPIO的配置寄存器

上面步骤已经把GPIO初始化完成,下面就可以使用输入输出函数了

ecffa8a086e144c1a71cc20443f776ee.png

2.3.这次试验就用这四个输出函数

GPIO_Setbits:

第一个参数是GPIOx,也就是设置IO口,例如如果是PA那就是GPIOA,第二个参数是GPIO_Pin,这个函数可以把指定的端口设置为电平

GPIO_ResetBits:

第一个参数是GPIOx,也就是设置IO口,例如如果是PA那就是GPIOA,第二个参数是GPIO_Pin,这个函数可以把指定的端口设置为电平

GPIO_Writebit:

这个函数有三个参数,前两个跟上面一样,第三个是BitValue,这个是根据第三个参数的值来设置指定的端口

GPIO_Write

第一个参数是GPIOx,也就是设置IO口,第二个参数是PortVal,这个函数可以同时对16个端口进行写入操作

 

 

开始实践

用一下第一个函数

de54bfd64af8465187290aceb477bfa1.png看注释

第一个GPIOx,x可以是A到G

第二个GPIO_Pin_x,x可以是0到15

3089c2c6d20e495eb68c3e1a6e2f9fd7.png这样就是控制了PA0

f6e23cc0fdb24df3bf8e31f0ea5c06a2.png这个函数是把指定端口设置低电平,所以灯亮了

56a3d06471454575a8a17eb7ed0cc9ac.png再来试试这个函数

e7eff00c720245b6ab63eb168482b71a.png

这个函数是把指定端口设置高电平,所以灯灭了

然后再来试试第三个函数

c1079342e6124af892f9db6687800a7a.png

第三个参数介绍的是指定写入的数据值,这个参数可以是BitAction这个枚举中的一个值

fc1365ae8bb2408a99c6febf4aa1e057.pngBit_RESET是清除端口值,也就是置低电平

Bit_SET是设置端口值,也就是置高电平

e3afb8ae84b740169f97b12a9f37c8c2.png写Bit_RESET

2cf3cfcade014828822d7bd8069e1eaf.png灯又亮了

 

596587e1aa2f4567b3baadd13d2ebfd4.pngBit_SET

6eb35531053b4aa39eeced52b5db44f3.png

灯又灭了

这就是这三个函数的用法

 

流水灯实验

0c0c318fe2ed4c03a9ebba27a9696b65.png

还是之前LED的文件,复制粘贴一下

e9292fbedbb74d8c95a67e496b303ffd.png

流水灯是用GPIOA的0-7号端口,所以这里要加端口1-7,在GPIO_Pin_0后面或运算GPIO_Pin_1或运算GPIO_Pin_2,这样就可以一次性把三个端口一次性都初始化了

f172220da6b545e08c9e78301e5edc3c.png

为什么可以这样呢,我们看这个,这里可以看到,Pin0对应的是0x0001

cb6e308db1154b14867ae729825cbed8.png

这个是二进制形式

以此类推,每个端口对应一个位,如果把它们进行按位或的操作,这就是按位或的操作逻辑

比如Pin0,Pin1,Pin2按位或,结果就是0111,这样就相当于同时选中了三个端口

ad35805198be4c3891cded287de5bc50.png

这里还有一个这个函数,GPIO_Pin_All,它对应的数据就是0xFFFF,也就是所有位都为1,这样就相当于选中了所有的引脚

 

b7961ed8a18c4bbabe95c667e615519a.png

时钟控制这一项,也是可以利用按位或的操作方式来选择多个外设的,数据规律是每一位对应一个外设

 

a65d70db6993470aa71e1f03e08cb586.png

这个也可以利用按位或选择多个引脚,所以Setbit+了个s

6506ae4c1e884659889b914204ced7c3.png

这个函数也是一样的意思

 

97ca45a17e23440db7c3a18000e58d00.png

这里的话就直接用GPIO_Pin_Alll了,这样就把16个端口全部配置为了推挽输出模式

20b53d024783427f8158d9abdc01583f.png为了现在同时控制16个端口,我们就可以使用GPIO_Write这个函数了

GPIO_Write

第一个参数是GPIOx

610fdfaf6ec84725967d2edb95df46dd.png

跳转看看,这里写的是,指定写到输出数据寄存器的值

1f4e31b5d98d412f90196a0450f73375.png可以看到,这第二个参数就是直接写道GPIO的ODR寄存器里面的

6d7bcd2250a4453eace1811153e3fd03.png所以直接写0x0001,因为c语言不支持写二进制,所以这里只能写十六进制

fa2fe6770bdd4397980eeabbaaf4b218.png最低位对应PA0,然后往上依次是PA1,PA2

efdac11ca0264e789e1479a737723932.png

一直到PA15

93e5dcba78bd4ea38fb355d846c8d88f.png

因为是低电平点亮,所以要在前面再加按位取反的符号

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/494080.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

政安晨:【深度学习神经网络基础】(一)—— 逐本溯源

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 与计算机一样的古老历史 神经网络的出现可追溯到20世纪40年…

【有限状态机】- FSM详细讲解 【附Autoware有限状态机模型代码讲解】

参考博客: (1)FSM(有限状态机) (2)关于有限状态机(FSM)的一些思考 (3)状态设计模式 1 状态机简介 有限状态机FSM:有限个状态以及在这些状态之间的转移和动作…

对比HTTP与WebSocket

目录 对比HTTP与WebSocket1. HTTP协议概述2. WebSocket协议概述3. HTTP与WebSocket的区别4. 使用场景比较5. 性能比较6. 安全性比较7. 应用案例分析8. 总结与展望 对比HTTP与WebSocket 1. HTTP协议概述 1.1 HTTP的基本概念 HTTP(Hypertext Transfer Protocol&…

基于Java实现宠物领养救助交流平台设计和实现

基于Java实现宠物领养救助交流平台设计和实现 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源码联…

腾讯云4核8g服务器多少钱?轻量和CVM收费价格表2024年最新

2024年腾讯云4核8G服务器租用优惠价格:轻量应用服务器4核8G12M带宽646元15个月,CVM云服务器S5实例优惠价格1437.24元买一年送3个月,腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图: 腾讯云4核8G服务器优惠价格 轻…

RabbitMQ简单介绍

什么是消息队列 消息队列是一种在应用程序之间传递消息的通信模式。它提供了一种异步的、可靠的方式来处理分布式系统中的消息传递。在消息队列中,消息发送者(Producer)将消息发送到队列(Queue)中,而消息接…

R语言 | 上下双向柱状图

1. 效果图 2. 代码 # 生成测试数据 difdata.frame(labelspaste0("pathway", 1:3),upc(30,15,1),downc(10,20,40) ) rownames(dif)dif$labels dif#变形 difreshape2::melt(dif) dif# 绘图 ggplot(dif, aes(xlabels, yifelse(variable"up", value, -value), …

ubuntu 中安装docker

1 资源地址 进入ubuntu官网下载Ubuntu23.04的版本的镜像 2 安装ubuntu 这里选择再Vmware上安装Ubuntu23.04.6 创建一个虚拟机,下一步下一步 注意虚拟机配置网络桥接,CD/DVD选择本地的镜像地址 开启此虚拟机,下一步下一步等待镜像安装。 3…

边缘计算迎来“量子飞跃”!支持抗量子密码,AMD推出FPGA新系列

3月6日,AMD宣布推出AMD Spartan™ UltraScale™ FPGA系列,这是AMD成本优化FPGA和自适应SoC广泛产品组合的最新成员。 距离1月22日,AMD推出业界首款符合VESA DisplayPort 2.1标准的FPGA和自适应SoC实现,也才过了一个多月的时间。 S…

【pytest、playwright】allure报告生成视频和图片

目录 1、修改插件pytest_playwright 2、conftest.py配置 3、修改pytest.ini文件 4、运行case 5、注意事项 1、修改插件pytest_playwright pytest_playwright.py内容如下: # Copyright (c) Microsoft Corporation. # # Licensed under the Apache License, Ver…

前端埋点全解及埋点SDK实现方式

一、什么是埋点 所谓“埋点”,是数据采集领域(尤其是用户行为数据采集领域)的术语,指的是针对特定用户行为或事件进行捕获、处理和发送的相关技术及其实施过程。比如用户某个icon点击次数、观看某个视频的时长等等。 埋点…

Day22 LeedCode:235.二叉搜索树的最近公共祖先 701.二叉搜索树的插入操作 450.删除二叉搜索树的结点

235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大&…

openGauss增量备份恢复

openGauss 增量备份恢复 openGauss 数据库自 2020 年 6 月 30 日发布以来,很多小伙伴都提到“openGauss 数据库是否有增量备份工具?“这么一个问题。 在 openGauss 1.0.0 版本的时候,关于这个问题的回答往往是:“Sorry…”&…

ClickHouse10-ClickHouse中Kafka表引擎

Kafka表引擎也是一种常见的表引擎,在很多大数据量的场景下,会从源通过Kafka将数据输送到ClickHouse,Kafka作为输送的方式,ClickHouse作为存储引擎与查询引擎,大数据量的数据可以得到快速的、高压缩的存储。 Kafka大家…

免费SSL证书和付费SSL证书的区别点

背景: 在了解免费SSL证书和付费SSL证书的区别之前,先带大家了解一下SSL证书的概念和作用。 SSL证书的概念: SSL证书就是基于http超文本传输协议的延伸,在http访问的基础上增加了一个文本传输加密的协议,由于http是明…

【SQL】1633. 各赛事的用户注册率(COUNT函数 表达式用法)

题目描述 leetcode题目:1633. 各赛事的用户注册率 Code select contest_id, round(count(*)/(select count(*) from Users)*100, 2) as percentage from Register group by contest_id order by percentage desc, contest_id ascCOUNT()函数 COUNT函数用法&#…

每日一题 --- 链表相交[力扣][Go]

链表相交 题目:面试题 02.07. 链表相交 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 图示两个链表在节点 c1 开始相交**:** 题目数据 保证 整个链式结…

【每日力扣】452. 用最少数量的箭引爆气球与763. 划分字母区间

🔥 个人主页: 黑洞晓威 😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害。 452. 用最少数量的箭引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0…

Chronos: 将时间序列作为一种语言进行学习

这是一篇非常有意思的论文,它将时间序列分块并作为语言模型中的一个token来进行学习,并且得到了很好的效果。 Chronos是一个对时间序列数据的概率模型进行预训练的框架,它将这些值标记为与基于transformer的模型(如T5)一起使用。模型将序列的…

阿里云ubuntu服务器搭建可视化界面

连接终端 最好初始化服务器的时候 不要以root权限创建 否则会出错 1更新软件: sudo apt-get update2安装ubuntu desktop : sudo apt-get install ubuntu-desktop3 配置ubuntu desktop并重启: sudo apt-get -f install sudo dpkg-reconfigure ubuntu-desktop sudo reboot4 su…