当前位置: 首页 > news >正文

江协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

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

相关文章:

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

很多单片机都是高电平弱驱动,低电平强驱动,所以这里是低电平有效 点亮一个LED灯 操作STM32的GPIO需要三个操作: 第一个使用RCC开启GPIO的时钟 第二步使用GPIO_Init函数初始化GPIO 第三步使用输出或输入函数控制GPIO 1.使用RCC开启GPIO的时…...

设计模式之建造者模式精讲

也叫生成器模式。将一个复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 在建造者模式中,有如下4个角色: 抽象建造者(Builder):用于规范产品的各个组成部分,并进行抽象&…...

vue3源码解析——watch和watchEffect区别

watch和watchEffect是Vue 3.0中新增的两个响应式API,用于监听数据的变化。watch适用于需要获取新值和旧值,或者需要懒执行的场景,而watchEffect适用于需要监听多个数据源,并且需要立即执行的场景。它们之间的区别如下:…...

微服务(基础篇-006-Docker)

目录 初识Docker(1) Docker解决的问题(1.1) Docker与虚拟机(1.2) 镜像和容器(1.3) Docker和DockerHub(1.4) docker架构(1.5) 安…...

深度学习算法概念介绍

前言 深度学习算法是一类基于人工神经网络的机器学习方法,其核心思想是通过多层次的非线性变换,从数据中学习表示层次特征,从而实现对复杂模式的建模和学习。深度学习算法在图像识别、语音识别、自然语言处理等领域取得了巨大的成功&#xf…...

查找算法及查找常用数据结构总结

1.顺序表查找 基本方法: 设查找表以一维数组来存储,要求在此表中查找出关键字的值为x的元素的位置,若查找成功,则返回其位置(即下标),否则,返回一个表示元素不存在的下标&#xff0…...

大语言模型---强化学习

本文章参考,原文链接:https://blog.csdn.net/qq_35812205/article/details/133563158 SFT使用交叉熵损失函数,目标是调整参数使模型输出与标准答案一致,不能从整体把控output质量 RLHF(分为奖励模型训练、近端策略优化…...

前端三剑客 —— CSS (第二节)

目录 内容回顾: CSS选择器*** 属性选择器 伪类选择器 1):link 超链接点击之前 2):visited 超链接点击之后 3):hover 鼠标悬停在某个标签上时 4):active 鼠标点击某个标签时,但没有松开 5):fo…...

牛客NC31 第一个只出现一次的字符【simple map Java,Go,PHP】

题目 题目链接: https://www.nowcoder.com/practice/1c82e8cf713b4bbeb2a5b31cf5b0417c 核心 Map参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*…...

软考系统架构设计师(摘抄)01

架构师承担的责任 系统架构师设计师是承担系统架构设计的核心角色,他不仅是连接用户需求和系统进一步设计与实现的桥梁,也是系统开发早期阶段质量保证的关键角色。系统架构师就是项目的总设计师,他是一个既需要掌控整体又需要洞悉局部瓶颈&a…...

5G无线接入网和接口协议

**部分笔记** 4.3无线协议架构 NR无线协议分为两个平面:用户面和控制面。 用户面(UP):协议栈及用户数据采用的协议 控制面(Control Plane,CP)协议栈即系统的控制信令传输采用的协议簇。 虚线标注的是信令数据的流向。一个UE在…...

【力扣刷题日记】1173.即时食物配送I

前言 练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。 今日题目: 1173.即时食物配送I 表:Delivery 列名类型delivery_idintcustomer_idintorder_datedatecustomer…...

2024年github之node排行榜top50

如果有帮助到您还请动动手帮忙点赞,关注,评论转发,感谢啦!💕💕💕😘😘😘 本文由Butterfly一键发布工具发布 2024年github之node排行榜top50 语言star项目名称…...

当我们在地址栏输入URL的时候浏览器发生了什么

URL 解析 是否合法 首先判断你输入的是一个合法的 URL 还是一个待搜索的关键词,并且根据你输入的内容进行自动完成、字符编码等操作。检查http缓存 DNS 查询 浏览器缓存 -> 操作系统缓存 -> 路由器缓存 -> DNS缓存 -> 根域名服务器查询 TCP 连接 …...

【研发日记】Matlab/Simulink开箱报告(十一)——Requirements Toolbox

目录 前言 Requirements Toolbox 编写需求 需求联接设计 需求跟踪开发进度 追溯性矩阵 分析和应用 总结 前言 见《开箱报告,Simulink Toolbox库模块使用指南(六)——S-Fuction模块(TLC)》 见《开箱报告&#x…...

Elastic 8.13:Elastic AI 助手中 Amazon Bedrock 的正式发布 (GA) 用于可观测性

作者:来自 Elastic Brian Bergholm 今天,我们很高兴地宣布 Elastic 8.13 的正式发布。 有什么新特性? 8.13 版本的三个最重要的组件包括 Elastic AI 助手中 Amazon Bedrock 支持的正式发布 (general availability - GA),新的向量…...

MFC 截取对话框生成图片、截取整个屏幕(可取黑白反色或者整体图片取反色)

HWND hwnd ::GetDesktopWindow();//截整个屏幕,用从这往下4句HDC hdc ::GetDC(hwnd);CDC dc;dc.Attach(hdc);CRect rc,rcw;GetWindowRect(&rcw);GetClientRect(&rc);//只截对话框,用这句//rc.SetRect(0, 0, GetSystemMetrics(SM_CXSCREEN), Ge…...

【LeetCode: 331. 验证二叉树的前序序列化 + DFS】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...

【Consul】Linux安装Consul保姆级教程

【Consul】Linux安装Consul保姆级教程 大家好 我是寸铁👊 总结了一篇【Consul】Linux安装Consul保姆级教程✨ 喜欢的小伙伴可以点点关注 💝 前言 今天要把编写的go程序放到linux上进行测试Consul服务注册与发现,那怎么样才能实现这一过程&am…...

pytorch常用的模块函数汇总(1)

目录 torch:核心库,包含张量操作、数学函数等基本功能 torch.nn:神经网络模块,包括各种层、损失函数和优化器等 torch.optim:优化算法模块,提供了各种优化器,如随机梯度下降 (SGD)、Adam、RMS…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

【Oracle APEX开发小技巧12】

有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...