【STM32F103】GPIO通用输入输出口

GPIO

简介

GPIO(General Purpose Input Output)通用输入输出口是微控制器(MCU)必备的片上外设,可以实现微控制器与外部设备的数字交换。

STM32F103系列的芯片最多可以提供112个多功能双向IO引脚,但是显然我们的STM32F103C8T6没有那么多IO口,直接把核心板拿起来看看就可以知道。具体可以查看一下引脚定义表(来自b站江科大自化协):

虽然没有112个那么多,但是一般情况下也是够我们用的。

STM32的一部分功能是有指定某些引脚的,所以我们再设计线路的时候应该优先把有特殊功能的引脚先分配给那些特殊功能。

例如USART的TX和RX口分别分配到了GPIOA的9号口和GPIOA的10号口。那么如果我们的项目中涉及到了USART1,我们就应该先把这两个口给USART留着。如果这两个引脚我们就是没办法留下来,那我们也还有最后一手,那就是引脚重映射。

表格的最后一项有说明某些引脚可以重定义为哪些功能,例如GPIOA的9号和10号引脚我们没法为USART1留住,我们还可以将GPIOB的6号和7号引脚重映射为USART1(同步异步收发器)的TX和RX,关于这个,后面会演示。

命名

STM32的GPIO引脚命名分为两部分,第一部分是端口号,第二部分是引脚号。

端口号就是GPIOx,x为大写字母,可以从上面引脚定义表看出,一般我们用的就是GPIOA或者是GPIOB,GPIOC的话仅有3个引脚,并且都有各种特殊的使命。

引脚号从0~15一共16个,也就是我上面说的x号引脚。

工作模式

STM32芯片的IO引脚一共有8种工作模式,输入输出各占4个。

不同模式的不同结构我就不细说了,一共有三点原因。

第一点是我自己都迷迷糊糊懵懵懂懂的就不误人子弟了。

第二点是就算不了解物理结构也不妨碍我们使用。

第三点参考第一点。

输入模式

浮空输入GPIO_Mode_IN_FLOATING

默认情况为高阻态,一般用在数据传输的时候,例如SPI。

给低电平则读出逻辑0,给高电平则读出逻辑1,什么也不给的话就不确定了。

上拉输入GPIO_Mode_IPU

默认情况下为高电平,也就是给低电平的时候读出逻辑0,给高电平或者是什么也不给的话就读出逻辑1。

下拉输入GPIO_Mode_IPD

默认情况下为低电平,也就是给高电平的时候读出逻辑1,给低电平或者是什么也不给的话就读出逻辑10。

模拟输入GPIO_Mode_AIN

将芯片引脚模拟信号引到内部的模数转换器ADC中。用到ADC的时候用到这个。

输出模式

开漏输出GPIO_Mode_Out_OD

利用外部电路的驱动能力,减少IC内部的驱动。一般来说,如果要求输出电流大,或者是外部电平不匹配的时候,我们就选择开漏输出。

开漏复用输出GPIO_Mode_AF_OD

在开漏输出的条件下,当GPIO口被用作第二功能的时候(并非作为同样IO口),我们选择开漏复用输出。

推挽输出GPIO_Mode_Out_PP

导通损耗小,效率高,既能提高负载能力又能提高开关速度。简单来说,纪要输出高电平又要输出低电平的情况下,我们就选择推挽输出。

推挽复用输出GPIO_Mode_AF_PP

同上,在推挽输出的条件下,当GPIO口被用作第二功能的时候(并非作为同样IO口),我们选择推挽复用输出。

GPIO输出速度

如果GPIO为输出模式,那么我们可以选择输出的速度,固件库给我们提供了三种选择,分别为2MHz,10MHz,50MHz。

一般推荐GPIO输出速度为输出信号的5~10倍。例如我们使用USART时,撑死也就115200的波特率,2MHz就够用了。

使用I2C的话,如果使用了400000b/s的速率,那么就可以选用10MHz。

使用SPI的话,或许就要使用50MHz了。

总之就是输出的信号速率越大,我们给的输出速度就越大,如果实在拿不准的话直接50MHz也是可以的。

如果只是点灯,点数码管,让蜂鸣器叫个响之类的不用传输信号的,那么给个2MHz就可以了,减小了噪声也更加省电。

固件库函数

注:红色字体为固定的函数名,绿色字体为推荐的参数 

GPIO初始化 

GPIO_Init(GPIOA,&itd)

第一个参数填入需要初始化的GPIO端口号,STM32F103C8T6中仅能使用GPIOA和GPIOB。

第二个参数为类型为GPIO_InitStruct类型变量的地址,通过给该类型变量的成员赋值来配置GPIO的初始化。

GPIO_Pin用于指定要初始化的引脚号。

GPIO_Speed用于指定输出的频率,如上文所说一共有三种选择,如果我们仅仅是点灯的话使用2MHz就行,GPIO_Speed_2MHz

 GPIO_Mode用于指定GPIO口的模式,具体可选的参数请自行去库函数文件里寻找(注释里有提醒),我们点灯的话使用推挽输出,GPIO_Mode_Out_PP

设置输出的电平

能够设置输出电平的函数很多,我这里仅列出几个常用的,具体可以参考库函数文件。

GPIO_WriteBit(GPIOA,GPIO_Pin_0,1)

指定GPIO的端口以及引脚来输出指定的电平。

参数一指定端口。

参数二指定引脚。

参数三指定输出的电平,类型为BitAction,实际上是枚举类型,我们填入0(低电平)或是1(高电平)即可。

如果嫌这样一个个引脚指定太麻烦了,我们也有更方便的函数。

GPIO_Write(GPIOA,0x00)

参数一指定端口。

参数二填入一个16位的数,这个数可以指定整个端口的16个引脚的输出电平,16位刚好对应了每个端口的16个引脚。

获取输入的电平

这两个函数的参数和上面设置输出电平的函数类似,相信大家看看着俩函数的名字也可以知道怎么使用它们来读取电平,就不再赘述了。

流水灯示例

 

#include "stm32f10x.h"                  // Device header
#include "Delay.h"int main(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef itd;itd.GPIO_Mode=GPIO_Mode_Out_PP;                     //使用推挽输出itd.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;      //可以用|来一次初始化多个引脚itd.GPIO_Speed=GPIO_Speed_2MHz;                     //点个灯,2MHz足矣GPIO_Init(GPIOA,&itd);GPIO_Write(GPIOA,0x00);while(1){GPIO_WriteBit(GPIOA,GPIO_Pin_0,1);Delay_ms(500);GPIO_WriteBit(GPIOA,GPIO_Pin_0,0);GPIO_WriteBit(GPIOA,GPIO_Pin_1,1);Delay_ms(500);GPIO_WriteBit(GPIOA,GPIO_Pin_1,0);GPIO_WriteBit(GPIOA,GPIO_Pin_2,1);Delay_ms(500);GPIO_WriteBit(GPIOA,GPIO_Pin_2,0);}
}

GPIO重映射

来填一下文章开头的坑,如果GPIOA的9号和10号引脚我都另外有用了,但是同时我还需要使用USART1,那么根据引脚定义表我们可以将GPIOA的9号引脚和10号引脚的USART1_TX和USART1_RX的功能重映射到GPIOB的6号和7号引脚。

我们只需要在原本的使用USART1的代码上做一些改变。

第一步是修改GPIO的初始化,将原本初始化GPIOA的9号和10号引脚的配置改为GPIOB的6号和7号引脚。

第二步是加上打开AFIO外设时钟的代码:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

AFIO是专门负责功能引脚重映射的。所以我们需要将其的外设时钟打开。

第三步就是开始重映射:

GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);

 这个函数的第一个参数是选择重映射的方式,第二个参数是ENABLE或是DISABLE,要开启重映射就选择ENABLE,开启后要关闭就选择DISABLE。

选择重映射的方式,这个是需要查看参考手册的,在第116页。查询过后我们还需要跑到库函数文件里去查找对应的参数选项,还是挺麻烦的,所以这类有特殊功能的引脚我们尽量先分配给这个特殊功能。

参考

STM32F10xxx参考手册(中文)

b站江科大自化协

《ARM Cortex-M3 嵌入式原理及应用(基于STM32F103微控制器)》

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

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

相关文章

机器学习-回归问题(Regression)

前言 与KNN分类任务预测的输出为离散型不同. 在机器学习中,回归任务是用于预测连续数值型变量的任务。回归任务在很多领域都有着广泛的应用. 回归问题求解 在一个回归问题中,很显然模型选择和好坏会直接关系到将来预测结果的接近程度,举个…

规则引擎专题---2、开源规则引擎对比

开源规则引擎 开源的规则引擎整体分为下面几类: 通过界面配置的成熟规则引擎,这种规则引擎相对来说就比较重,但功能全,比较出名的有:drools, urule。 基于jvm脚本语言,互联网公司会觉得drools太重了,然后…

常见的AI安全风险(数据投毒、后门攻击、对抗样本攻击、模型窃取攻击等)

文章目录 数据投毒(Data Poisoning)后门攻击(Backdoor Attacks)对抗样本攻击(Adversarial Examples)模型窃取攻击(Model Extraction Attacks)参考资料 数据投毒(Data Poi…

GEE:不同方向的线性检测算子

作者:CSDN @ _养乐多_ 本文将介绍在 Google Earth Engine(GEE)平台上,使用不同方向的线性检测算子进行卷积操作的代码框架、核心函数和多种卷积核,比如 E-W、NE-SW、N-S、NW-SE 方向检测算子等。 结果如下图所示, 文章目录 一、定向检测算子二、完整代码三、代码链接一…

JAVA代码优化:CommandLineRunner(项目启动之前,预先加载数据)

CommandLineRunner接口是Spring Boot框架中的一个接口,用于在应用程序启动后执行一些特定的代码逻辑。它是一个函数式接口,只包含一个run方法,该方法在应用程序启动后被自动调用。可以帮助我们在应用程序启动后自动执行一些代码逻辑&#xff…

Java(十)(网络编程,UDP,TCP)

目录 网络编程 两种软件架构 网络通信的三要素 IP IPv4的地址分类 特殊IP 端口号 协议 用UDP协议发送数据 用UDP接收数据 TCP接收和发送数据 TCP通信--支持与多个客户端同时通信 网络编程 可以让设备中的程序与网络上其他设备的程序进行数据交互(实现网络通信) 两…

【面试经典150 | 二分查找】搜索二维矩阵

文章目录 写在前面Tag题目来源题目解读解题思路方法一:二分查找 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等…

Fiddler抓包工具之fiddler的composer可以简单发送http协议的请求

一,composer的详解 右侧Composer区域,是测试接口的界面: 相关说明: 1.请求方式:点开可以勾选请求协议是get、post等 2.url地址栏:输入请求的url地址 3.请求头:第三块区域可以输入请求头信息…

springmvc+mybatis+mysql8+idea+jqgrid前端

一、背景 主要是为了学习jqgrid前端技术,熟练一下前后端交互数据 二、效果图 访问地址:http://localhost:8080/cr/views/jqGridDemo.jsp 三、代码展示 控制层JqGridController.java Controller RequestMapping("/jqgrid") public class Jq…

拥抱变化,良心AI工具推荐

文章目录 💥 简介🍄 工具介绍🍓 功能特点🥗 使用场景🎉 用户体验🧩 下载地址🍭 总结 💥 简介 我是一名资深程序员,但薪资缺对不起资深两个字,为了生存&#x…

安装selenium+chrome详解

1、创建yaml文件 创建yaml文件,命名为:docker-compose-chrome.yaml,具体内容如下: version: "3.9" services:spiderdriver:image: selenium/standalone-chrome:114.0restart: alwayshostname: spiderdrivercontainer_name: spiderdriverdeploy:resources:limit…

使用Docker部署开源分布式任务调度系统DolphinScheduler

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 使用Docker部署开源分布式任务调度系统DolphinScheduler 前些天发现了一个巨牛的人工智能学习网…

【iOS】Bug调试

文章目录 前言一、定位编译错误二、设置与查看断点1.文件行断点设置2.符号断点设置3.Exception Breakpoint4.Constraint Error Breakpoint 三、调试工具四、输出窗口五、变量查看窗口六、查看线程七、LLDB调试工具1.p,po命令2.expr命令3.bt命令 前言 在我们的编码过…

Collection的其他相关知识

前置知识:可变参数 就是一种特殊参数,定义在方法 构造器的形参列表里,格式是:数据类型...参数名称; 可变参数的特点和好处 特点:可以不传数据给它;可以传一个或者同时传多个数据给它&#xff…

Vue3+nuxt+ts项目引入高德地图API实现步骤

看了好多相关的文章都没有完全贴合选用Vue3nuxtts框架的,也不太靠谱,只好自己踩坑实现了 首先去高德开放平台用自己的账号申请一个key,位置如下,申请好后保存好生成的key 我们使用vuemap/vue-amap,一个高德地图2.0版本…

阅读软件OmniReader Pro mac功能特色

OmniReader Pro mac是一款文字识别和阅读软件,它可以将印刷体和手写体的文字转换为数字文本,并将其朗读出来。该软件适用于视力受损、阅读困难、语言障碍等用户,可以帮助他们更加轻松地获取信息和阅读文本。 OmniReader Pro具有简洁直观的用户…

单细胞个性化细胞注释

关于单细胞中级的课程内容,前面已经有了三次直播。欢迎回看~ 单细胞直播一理解seurat数据结构与pbmc处理流程 单细胞直播二从GSE104154中理解seurat结构 单细胞直播三seurat数据结构与数据可视化 本期主要内容 本期指哪打哪,自己选定细胞&…

java的四种内部类,从0讲清楚

什么是内部类? 为什么要学习内部类? 可以发现,发动机虽然跟汽车相关,但发动机不像车龄或颜色一样,只用一个变量就可以描述,而是要有发动机品牌,发动机年限,多个变量描述发动机。那么…

MATLAB 自抗扰控制 - Active Disturbance Rejection Control

系列文章目录 MATLAB 模型参考自适应控制 - Model Reference Adaptive Control 文章目录 系列文章目录前言一、控制器结构1.1 一阶逼近1.2 二阶逼近 二、指定控制器参数参考 前言 自抗扰控制 (ADRC) 是一种无模型控制方法,适用于为具有未知动态特性以及内部和外部…

Azure Machine Learning - 使用 Azure SDK 进行全文搜索

了解如何使用 Azure SDK 中的 Azure.Search.Documents 客户端库创建、加载和查询使用示例数据的搜索索引,实现全文搜索。 全文搜索使用 Apache Lucene 进行索引和查询,使用 BM25 排名算法对结果进行评分。 关注TechLead,分享AI全维度知识。作…