2. GPIO读写

news/2024/11/14 3:25:48/文章来源:https://www.cnblogs.com/CrescentWind/p/18331234

GPIO简介

GPIO(全称为General Purpose Input/Output),即通用输入/输出,可以认为GPIO是片外外设与片内的通信接口,通过控制GPIO的电平状态,可以实现片外外设与片内的通信以及数据的输入输出。

对于st32F103系列的GPIO,其命名规则为GPIO+端口号,如GPIOA,GPIOB。对于每个端口又有着16个引脚(pin),编号为0~15。

以下便是一个GPIO引脚的结构图:
image

通过对不同寄存器的配置,可以切换GPIO的工作模式。

GPIO工作模式

从大致上分,GPIO有两种工作模式:

  • 输入模式:GPIO可以作为输入,通过读取GPIO的电平状态来获取外设的输入信号。
  • 输出模式:GPIO可以作为输出,通过控制GPIO的电平状态来驱动外设的输出信号。

而输入模式又可以分为:

  • 上拉输入模式(GPIO_MODE_IPU):通过内部上拉电阻,引脚悬空时默认为高电平,当输入低电平时,GPIO的电平状态为低电平。
  • 下拉输入模式(GPIO_MODE_IPD):通过内部下拉电阻,引脚悬空时默认为低电平,当输入高电平时,GPIO的电平状态为高电平。
  • 浮空输入模式(GPIO_MODE_IN_FLOATING):内部无上拉电阻或下拉电阻,易受外部电平干扰,精度不高,可外接上拉或下拉电阻来实现输入电平的上拉或下拉。
  • 模拟输入模式(GPIO_MODE_AIN):通过ADC模块,将模拟信号转换为数字信号,输入到GPIO。

输出模式又可以分为:

  • 推挽输出模式(GPIO_MODE_OUT_PP):输出高电平或低电平(三极管导通压降),通过控制GPIO的电平状态来驱动外设的输出信号。输出的高低电平均有驱动能力。
  • 开漏输出模式(GPIO_MODE_OUT_OD):该模式下,高电平无驱动能力(高阻态),低电平有驱动能力。
  • 复用推挽输出模式(GPIO_MODE_AF_PP)和复用开漏输出模式(GPIO_MODE_AF_OD),用到再学。

使用标准库来实现GPIO读写

image

由上图GPIO的结构可知,GPIO算是stm32的片内外设,且挂载在APB2总线上。在
stm32结构中,可以知道想要使用stm32的片内外设,必须先使能外设对应的时钟,这样才能让外设运行。

这里使用标准库来实现GPIO的各种操作。

以下给出使用标准库使能GPIOA第0引脚的例子。

#include "stm32f10x.h"int main(void)
{// 使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 设置GPIO的各种参数GPIO_InitTypeDef GPIO_InitStructure;// 设置GPIO为推挽输出模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;// 设置GPIO初始化第0引脚 GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;// 设置GPIO速度为50MHzGPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;// 调用GPIO初始化函数,并指定初始化的GPIO,传入参数结构GPIO_Init(GPIOA, &GPIO_InitStructure);while(1){}
}

RCC_APB2PeriphClockCmd函数中,传入需要使能的外设名称,具体参数的名称可以在函数定义中找到,第二个参数选择ENABLE或DISABLE,即使能或失能时钟。

而在GPIO_Init函数中,需要指定初始化的GPIO代号,如GPIOA等,而第二个参数接受一个GPIO_InitTypeDef结构体,该结构体中包含了GPIO的各种参数,如GPIO模式、引脚号、速度等,需要提前定义并配置好该结构,并以结构指针的形式传入。

值得注意的是GPIO_InitTypeDef的结构体变量一般命名为GPIO_InitStructure,这样可以使得代码更加易读。

初始化后,可以通过几个库函数来实现对应引脚的输入输出操作。

/*输入读取操作*/
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);/*输出设置操作*/
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

在这些函数中,GPIOx参数代表GPIO的代号,如GPIOA等,GPIO_Pin参数代表GPIO的引脚号,如GPIO_Pin_0等。

对于有后缀Bits / Bit的函数,可以设置或读取单个引脚的电平状态,而对于没有后缀的函数,可以设置或读取整个端口的电平状态。

最后实现使用GPIO读取光敏传感器输入,并通过输入控制另一个GPIO的输出来控制Led亮灭。

代码如下

#include "stm32f10x.h"                  // Device header
#define true 1
#define false 0
typedef unsigned int uint;int main(void)
{   // 使能GPIOA, GPIOB时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);// 配置GPIO模式GPIO_InitTypeDef GPIO_InitStructureA;GPIO_InitTypeDef GPIO_InitStructureB;// 配置输入GPIOA_Pin_0, 连接到光敏传感器GPIO_InitStructureA.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入GPIO_InitStructureA.GPIO_Pin  = GPIO_Pin_0;GPIO_InitStructureA.GPIO_Speed= GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructureA);// 配置输出GPIOB_Pin_0,控制Led亮灭GPIO_InitStructureB.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructureB.GPIO_Pin  = GPIO_Pin_0;GPIO_InitStructureB.GPIO_Speed= GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructureB);// 变量区uint8_t light = 0;while(true){light = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);if (light == 1)GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);elseGPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET);}
}

引脚连接: Led正极连接到3.3V,负极连接到GPIOB_Pin_0, 光敏传感器的VCC连接3.3V,GND连接GND,信号端DO连接GPIOA_Pin_0。当未被遮挡时,DO端一直将引脚下拉至0,当被遮挡时,DO端将保持高电平。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Easysearch 打造企业内部知识问答系统

大家可能都有这样的经历,刚入职一家企业时,同事往往会给你分享一些文档资料,有可能是产品信息、规章制度等等。这些文档有的过于冗长,很难第一时间找到想要的内容。有的已经有了新版本,但员工使用的还是老版本。 基于这种背景,我们可以利用 Easysearch 加 LLM 实现一个内…

Web系列-文件上传

Web系列-文件上传 做题思路 前端限制了上传文件的后缀,可以在前端修改代码或者bp抓包,再上传符合前端要求的文件类型,抓包后进行修改。 如果是php的环境,可以利用.user.ini,是一个局部配置文件,可以通过配置选项使每个php文件头或文件尾都进行文件包含 .user.ini利用需要…

【ollama】手把手教你布置本地大语言模型 以及各种常见用途#如何加载guff模型到ollama #如何更改ollama目录

ollama介绍 Ollama 是一个开源框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计。 以下是其主要特点和功能概述:简化部署:Ollama 目标在于简化在 Docker 容器中部署大型语言模型的过程,使得非专业用户也能方便地管理和运行这些复杂的模型。轻量级与可扩展:作…

SPONGE常用教程0:软件安装教程

课程准备阶段,介绍最简明安装流程,安装过程中如果遇到其他问题,请移步官方教程。第三方软件只提供个人安装心得。 软件安装环境默认为linux。 软件支持 SPONGE(Simulation Package tOward Next GEneration molecular modelling)是由北京大学高毅勤课题组开发的分子动力学模…

使用高速收发器进行数据传输(一)

本来想做一个这样的项目,但是简单地使用这个方法传递数据实在是没意义; 我希望最后以万兆网来实现这点; 目前事实上只是按照UG476的要求给IP核数据和取数即可,并不困难;

虚拟机:GCC共享库在连接时的搜索位置和优选次序

假设有两个相同的共享库,一个在标准的共享库搜索目录(/lib/i386-linux-gnu), 一个在非标准目录(/home/charles/tmp):在/home/charles/tmp下有个测试程序main.c, 调用共享库里的函数。 用如下的命令编译: 用ldd看一下link的共享库:可以看出,虽然我们指定了 要使用 …

mysql导出csv文件中文乱码解决方案

确认csv文件导出编码格式,如果已经知道了 ->从文本/csv导出 ->选择文件原始格式 ->转换保存即可 如果不知道是什么编码可以通过记事本或者 nop++打开查看文件编码格式 一般导出和保存的编码格式为:utf8,gb2312,ANSI

SmartSQL:一款方便、快捷的数据库文档查询、生成工具

SmartSQL ⚡ 一款方便、快捷的数据库文档查询、生成工具 致力于成为帮助企业快速实现数字化转型的元数据管理工具 🚩 项目介绍SmartSQL 是一款方便、快捷的数据库文档查询、导出工具!从最初仅支持SqlServer数据库、CHM文档格式开始,通过不断地探索开发、集思广益和不断改进…

Django-APP及项目入门

1. APP定义:Django中功能的细分,每个APP有独立的数据库、表结构、HTML模版、CSS。创建APP python manage.py startapp app01重要文件介绍 views.py:常用文件,urls中的函数常常在此处定义。 models.py:常用文件,对数据库进行操作。2. 项目入门确保app也注册(settings.py)…

7.22 ~ 7.28

原来模拟赛就是一个不断挂分的过程啊7.22 上午听学长讲课。 不过这次讲的还是挺快的。可能因为都是数学? 然后打了打前几天的板子,改完了前几天的题,赛后总结就先咕了 下午依然是模拟赛。 T1 T2 都是签到题,但题面出了一点小问题:T1 没有规定 \(a_i\) 的正负; T2 没有说明…

Label Smoothing

简单的说,Label Smoothing就是把one-hot向量从[0,0,1,0,0,0,...,0]变成[0.01,0.01,0.8,0.01,0.01,0.01,...,0.01],用公式表示,就是其中,k是类别数量,a是一个较小的数.这样做的目的是为了缓解模型过于武断的问题,增强模型的泛化能力,预防过拟合等等.但是也会带来一些问题,如增加…