STM32学习笔记三——深度讲解GPIO及其应用

目录

STM32GPIO端口位基本结构图:

结构图I/O引脚:

GPIO输入输出总结

1.GPIO引脚的四种输入方式及其特点:

1)上拉输入(GPIO_Mode_IPU)   

2)下拉输入(GPIO_Mode_IPD)    

3)模拟输入(GPIO_Mode_AIN)

4)浮空输入(GPIO_Mode_IN_FLOATING)

2.GPIO引脚的四种输出方式及其特点:

1)推挽输出:

2)开漏输出:

3)复用开漏输出、复用推挽输出:

STM32的GPIO设置举例

端口配置低寄存器(GPIOx_CRL) (x=A..E)

端口配置高寄存器(GPIOx_CRH) (x=A..E)

端口输入数据寄存器(GPIOx_IDR) (x=A..E)

端口输出数据寄存器(GPIOx_ODR)(x=A....E)

端口位设置/清除寄存器(GPIOx_BSRR)(x=A.....E)

端口位清除寄存器(GPIOx_BRR) (x=A..E)

配置GPIO令LED灯闪烁代码+注解 


STM32GPIO端口位基本结构图:

图片描绘了STM32GPIO口内部的基本结构:左边寄存器  中间驱动器  右边I/O口引脚

结构图I/O引脚:

由于STM32芯片内部电路所能承受的电压有限,因此I/O引脚向里是两个保护二极管,他们的作用是:当有静电等瞬间电压波动进入I/O引脚时,若此波动电压大于3.3V(VDD),则上方的保护二极管导通,将电压引入电源,让电源网络吸收;若此波动电压小于0V(VSS),则下方的保护二极管导通。

GPIO输入输出总结


STMO2的GPIO的输入输出方式有以下8种:
(1) GPIO_Mode_AIN  模拟输入:
(2) GPIO_Mode_IN_FLOATING浮空输入:
(3) GPIO_Mode_IPD 下拉输入:
(4) GPIO_Mode_IPU  上拉输入:

(5) GPIO_Mode_Out_OD开漏输出:
(6) GPIO_Mode_Out_PP推挽输出:
(7) GPIO_Mode_AF_OD复用开漏输出:
(8) GPIO_Mode_AF_PP复用推挽输出。

1.GPIO引脚的四种输入方式及其特点:

1)上拉输入(GPIO_Mode_IPU)   

        上拉输入,就是信号进入芯片后被内部的一个上拉电阻上拉,再经过施密特触发器转换成0、1信号,因此,复位后该引脚电平为高电平。

2)下拉输入(GPIO_Mode_IPD)    

        下拉输入,就是信号进入芯片后被内部的一个下拉电阻下拉,再经过施密特触发器转换成0、1信号,因此,复位后该引脚电平为低电平。

3)模拟输入(GPIO_Mode_AIN)

        信号进入芯片后不经过上拉电阻或者下拉电阻,也不经过施密特触发器,经由另一线路把电压信号传送到片上相应的外设模块。    例如,通常是ADC模块,然后由ADC采集电压信号。因此,可以将这种方式理解为模拟输入的信号是未经处理的信号。

4)浮空输入(GPIO_Mode_IN_FLOATING)

        信号进入芯片内部后,既没有经过上拉电阻也没有经过下拉电阻,只经由施密特触发器输入。如果被配置成这个模式,用电压表测量其引脚电压为1伏左右,是个不确定值。

        由于其输入阻抗比较大,所以一般把这种模式用于标准的通信协议,如IIC、USART等。

2.GPIO引脚的四种输出方式及其特点:

1)推挽输出:

        可以输出高、低电平,连接数字器件。推挽结构一般是指P-MOS和N-MOS两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止,各负责正、负半周的波形放大任务。电路工作时,两个对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流(拉电流)。推挽输出既提高了电路负载能力,又提高了开关速度。推挽输出有一定的电压与电流驱动能力,可以直接驱动一些合适的原件工作。

        一般情况下:当我们控制I/O口输出高电平时,P-MOS激活,N-MOS关闭,VDD连接到I/O口引脚;当我们控制I/O口输出低电平时,N-MOS激活,P-MOS关闭,VSS连接到I/O口引脚

2)开漏输出:

        开漏模式下只有N-MOS工作  P-MOS一直处于断开状态

        输出端相当于三极管的集电极,因此要得到高电平状态需要外接上拉电阻才行。该方式适合于做电流型的驱动,其吸收电流的能力相对较强(可达到20mA)。开漏输出没有电流电压驱动能力,必须依靠外部的电压源来驱动,而且选用开漏输出必须选择能够5V容忍的I/O口

        例如,用该方式去驱动继电器。该方式的特点是:利用外部电路的驱动能力,减少IC内部的驱动,IC 内部仅需很小的栅极驱动电流:开漏可用来连接不同电平的器件,以实现电平匹配:提供灵活的输出方式,可以将多个开漏输出引脚并接到一条线上。通过一个上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。这也IIC、SMBus 等总线判断总线占用状态的原理。

(如图所示:芯片定义图中有"FT"的都可以容忍5V电压)

3)复用开漏输出、复用推挽输出:

        可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用I/O口使用),STM32的很多引脚是多功能复用的,所以对此必须要重视:
(1)复用开漏输出:片内外设功能,如TX1、MOSI、MISO、SCK、SS等。

(2)复用推挽输出:片内外设功能,如IIC的SCL、SDA等。

STM32的GPIO设置举例

在每个GPIO模块内,主要包含了寄存器和驱动器

寄存器:可以理解为特殊的存储器,内核可以通过APB2总线对寄存器进行读写,由此完成输出电平和读取电平的功能,and与此同时,寄存器的每一位对应一个引脚,由于STM32是32位单片机,因此STM32内部的寄存器都是32位的,但由于端口只有16位,所以这个寄存器只有低16位所对应的有端口,高16位没有用到

驱动器:增加驱动能力

 库函数使用的是读写位设置和位清除寄存器的方法

GPIO配置寄存器,每个端口的模式由4位进行配置(16个端口就需要64位)

端口配置低寄存器(GPIOx_CRL) (x=A..E)

端口配置高寄存器(GPIOx_CRH) (x=A..E)

端口输入数据寄存器(GPIOx_IDR) (x=A..E)

低16位对应16个引脚,高16位没有用

端口输出数据寄存器(GPIOx_ODR)(x=A....E)

低16位对应16个引脚,高16位没有用

端口位设置/清除寄存器(GPIOx_BSRR)(x=A.....E)

BRy: 清除端口x的位y (y = 0…15) (Port x Reset bit y)
BSy: 设置端口x的位y (y = 0…15) (Port x Set bit y)

如果想要对多个端口同时进行位设置和位清除——使用端口位设置/清除寄存器,可保证位设置和位清除的同步性

端口位清除寄存器(GPIOx_BRR) (x=A..E)

配置GPIO令LED灯闪烁代码+注解 
#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟
															//使用各个外设前必须开启时钟,否则对外设的操作无效
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;					//定义结构体变量
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//GPIO模式,赋值为推挽输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;				//GPIO引脚,赋值为第0号引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//GPIO速度,赋值为50MHz
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);					//将赋值后的构体变量传递给GPIO_Init函数
															//函数内部会自动根据结构体的参数配置相应寄存器
															//实现GPIOA的初始化
	
	/*主循环,循环体内的代码会一直循环执行*/
	while (1)
	{
		/*设置PA0引脚的高低电平,实现LED闪烁,下面展示3种方法*/
		
		/*方法1:GPIO_ResetBits——设置低电平,GPIO_SetBits——设置高电平*/
		GPIO_ResetBits(GPIOA, GPIO_Pin_0);					//将PA0引脚设置为低电平
		Delay_ms(500);										//延时500ms
		GPIO_SetBits(GPIOA, GPIO_Pin_0);					//将PA0引脚设置为高电平
		Delay_ms(500);										//延时500ms
		
//		/*方法2:GPIO_WriteBit设置低/高电平,由Bit_RESET/Bit_SET指定*/
//		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);		//将PA0引脚设置为低电平
//		Delay_ms(500);										//延时500ms
//		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);			//将PA0引脚设置为高电平
//		Delay_ms(500);										//延时500ms
//		
//		/*方法3:GPIO_WriteBit设置低/高电平,由数据0/1指定,数据需要强转为BitAction类型*/
//		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);		//将PA0引脚设置为低电平
//		Delay_ms(500);										//延时500ms
//		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);		//将PA0引脚设置为高电平
//		Delay_ms(500);										//延时500ms
	}
}

(代码来自江科大STM32教学视频)

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

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

相关文章

信创ARM架构QT应用开发环境搭建

信创ARM架构QT应用开发环境搭建 前言交叉工具链Ubuntu上安装 32 位 ARM 交叉工具链Ubuntu上安装 64 位 ARM 交叉工具链 交叉编译 QT 库下载 QT 源码交叉编译 QT 源码 Qt Creator交叉编译配置配置 Qt Creator Kits创建一个测试项目 前言 有没有碰到过这种情况?开发出…

幻兽帕鲁服务器怎么搭建?Palworld多人联机教程

玩转幻兽帕鲁服务器,阿里云推出新手0基础一键部署幻兽帕鲁服务器教程,傻瓜式一键部署,3分钟即可成功创建一台Palworld专属服务器,成本仅需26元,阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…

Awesome Chrome Form UI - 界面设计与实现

上苍不会让所有幸福集中到某个人身上,得到了爱情未必拥有金钱;拥有金钱未必得到快乐;得到快乐未必拥有健康;拥有健康未必一切都会如愿以偿。知足常乐的心态才是淬炼心智、净化心灵的最佳途径。一切快乐的享受都属于精神,这种快乐把忍受变为享受,是精神对于物质的胜利。这…

C语言实现memcpy、memmove库函数

目录 引言一、库函数介绍二、库函数详解三、源码实现1.memcpy源码实现2.memmove源码实现 四、测试1.memcpy函数2.memmove函数 五、源码1.memcpy源码2.memmove源码 六、参考文献 引言 关于memcpy和memmove这两个函数,不论是算法竞赛还是找工作面试笔试,对…

STM32单片机的基本原理与应用(六)

串口测试实验 基本原理 在串口实验中,是通过mini_USB线搭建终端与电脑端(也可称终端,为做区分称电脑端)的“桥梁”,电脑端的串口调试助手通过mini_USB线向终端发送信息,由CH340芯片将USB接口进行转换&…

DelayQueue的使用

具体思路: 在容器初始化的时候就创建出一个 延迟队列 然后项目启动后随即启动一个线程一直监听这个队列 手动调用接口往队列中添加任务 依赖 一个最简单的web的应用即可项目文件结构 第一步:在项目启动的时候就创建出一个延迟队列 Configuration publ…

数据结构 - 线段树

1. 预制值: 构建的数组为,nums:【2, 5, 1, 4, 3】区间和问题,假设求区间 [1,3] 的和 2. 建树 2.1 构建线段树数组 int[] segT new int[4*n](为什么数组大…

理解进程的一些知识准备

1. 认识冯诺依曼体系结构 计算机有很多的体系结构,但到如今,冯诺依曼体系结构变成了主流。 输入设备:话筒、键盘、摄像头、鼠标、磁盘、网卡… 输出设备:声卡、显示器、打印机、显卡、网卡、磁盘… 有的设备既能作为输入设备又能…

机器学习的整个流程

机器学习的整个流程定义了数据科学团队执行以创建和交付机器学习模型的工作流。此外,机器学习流程还定义了团队如何协作合作,以创建最有用的预测模型。 机器学习high level的流程 机器学习流程的关键步骤包括问题探索(Problem Exploration&a…

力扣题目训练(7)

2024年1月31日力扣题目训练 2024年1月31日力扣题目训练387. 字符串中的第一个唯一字符389. 找不同401. 二进制手表109. 有序链表转换二叉搜索树114. 二叉树展开为链表52. N 皇后 II 2024年1月31日力扣题目训练 2024年1月31日第七天编程训练,今天主要是进行一些题训…

2024杭州国际安防展览会:引领数字城市安全与智能未来

随着科技的不断进步,数字城市已经成为未来城市发展的重要趋势。作为数字城市建设的重要组成部分,安防技术的创新与应用对于保障城市安全、提高生活品质具有重要意义。为此,2024杭州国际安防展览会将于4月份在杭州国际博览中心隆重召开&#x…

DFS——连通性和搜索顺序

dfs的搜索是基于栈,但一般可以用用递归实现,实际上用的是系统栈。有内部搜索和外部搜索两种,内部搜索是在图的内部,内部搜索一般基于连通性,从一个点转移到另一个点,或者判断是否连通之类的问题&#xff0c…

react将选中本文自动滑动到容器可视区域内

// 自动滚动到可视区域内useEffect(() > {const target ref;const wrapper wrapperRef?.current;if (target && wrapperRef) {const rect target.getBoundingClientRect();const wrapperRect wrapper.getBoundingClientRect();const isVisible rect.bottom &l…

如何选择日本大带宽服务器?

随着互联网的高速发展,对于大带宽服务器的需求也日益增长。而在日本,由于其先进的网络基础设施和数据中心技术,大带宽服务器成为了许多企业和开发者的首选。那么,如何选择合适的日本大带宽服务器呢? 首先,了解自己的需…

linux☞ Centos 基础篇

切换用户 重启系统、退出 su 用户 ### su switch user 重启系统 reboot 退出当前账户 logout 或者 exit 或者 CtrlD 修改网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEthernet:指明网卡类型为以太网 DEVICEens33:指定当前配置的…

c++类和对象(二)

类与对象 一.类的6个默认成员函数1.1类的6个默认成员函数 二.构造函数2.1.1构造函数的概念2.1.2构造函数的特性 三.析构函数3.1.1概念3.1.2特点 四.拷贝函数4.1.1概念4.1.2特征 一.类的6个默认成员函数 1.1类的6个默认成员函数 在C中,如果在一个类中什么成员都没有…

docker maven插件使用介绍

1、配置docker连接 开放docker tcp连接参考本专栏下令一篇文章 2、docker service窗口 3、根据dockerfile 构建镜像 注意 idea 用通过管理员身份启动,否则连不上docker 构建前添加maven goal 打包 4、运行镜像 创建容器 5、运行docker compose 报错 需要先配置d…

Java并发之synchronized详解

☆* o(≧▽≦)o *☆嗨~我是小奥🍹 📄📄📄个人博客:小奥的博客 📄📄📄CSDN:个人CSDN 📙📙📙Github:传送门 📅&a…

QtAV学习:(一)Windows下编译QtAV

QtAV 主页: QtAV by wang-bin 作者的编译构建说明文档: Build QtAV wang-bin/QtAV Wiki GitHub 我的编译环境: 编译环境:win10/msvc2015/Qt5.6.3 第一步:GitHub拉取代码,执行子模块初始化 地址: …

web前端-------弹性盒子(2)

上一讲我们谈的是盒子的容器实行,今天我们来聊一聊弹性盒子的项目属性; *******************(1)顺序属性 order属性,用于定义容器中项目的出现顺序。 顺序属性值,为整数,可以为负数&#xff…