STM32F103C8 GPIO

2023-11-08 20:20
文章标签 gpio stm32f103c8

本文主要是介绍STM32F103C8 GPIO,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

图片及文章内容摘自江科大自化协B站视频

目录

一、GPIO是什么

二、GPIO的基本结构

三、GPIO具体电路结构

四、GPIO输出实例

1、点灯

2、流水灯

3、读取输入电平


一、GPIO是什么

GPIO(General Purpose Input Output)  通用输入输出口,也就是俗称的IO口,他的引脚电平是0V~3.3V,部分引脚可容忍5V(这里的5V意思是可以接收5V的电压,但是输出最多是3.3V),想要知道哪些引脚是可以容忍5V的时候,可以参考STM32手册的引脚定义,里面带FT的就是可以容忍5V的。

输出模式下GPIO可以控制输出高或低的电平,所有对于高低电平能够实现的功能都可以通过这个来控制,如果控制的是功率比较大的设备,只需要再加入驱动电路即可,输出模式还可以用于输出模拟通讯协议。

输入模式下可以读取端口的高低电平或电压,用于读取按键输入等各种模块或协议的输入

二、GPIO的基本结构

  在STM32中,所有的GPIO都是挂载在APB2外设总线上的,其中GPIO外设的名称是按照GPIOA,GPIOB等等这样来命名的,每个GPIO外设总共有16的引脚,编号是从0到15,GPIOA的第0号引脚,我们一般就用PA0来命名。在每个GPIO模块内,主要包含了寄存器和驱动器这些东西,寄存器就是一段特殊的存储器,内核可以通过APB2总线对寄存器进行读写,从而完成输出电平和读取电平的功能。其中输出寄存器写1,对应的引脚就会输出高电平,写0就输出低电平,输入寄存器读取为1,就证明对应的端口目前是高电平,读取为0就是低电平。STM32里的寄存器都是32位的,但是这里的端口只有16位,所以这里的寄存器只有低16位有对应端口。驱动器的作用是增加信号的驱动能力,寄存器只负责存储数据,如果要对外面的设备进行一些操作还是需要驱动器来负责增大驱动能力。

三、GPIO具体电路结构

如上图,左边的部分是寄存器,中间的部分是驱动器,右边是对应的具体IO引脚。上面一的一半是输入部分,下面是输出部分。

这个部分是输入部分IO引脚处的保护二极管,此处二级管的作用是对输入电压进行限幅,这里可以看到在二极管的上端接着Vdd,也就是3.3V的电压,这个时候如果输入电压比3.3V还要高,上方的二极管就会导通。

 这是下方输出部分的二极管,此时Vss是0V,这里的作用是防止IO口电压为负时使二极管导通,就不会从内部电路汲取电流,保护内部电路。

 这是输入部分的与IO口连接的地方,此处连接了一个上拉电阻和一个下拉电阻,上拉电阻至Vdd,下拉电阻至Vss,这个开关是可以通过程序进行配置的。上面导通,下面断开,就是上拉输入模式;下面导通,上面断开,就是下拉输入模式;两个都断开,就是浮空输入模式。这里的上拉与下拉表示的是在引脚悬空时引脚对应的电平,上拉表示悬空时引脚为高电平,下拉表示悬空时引脚为低电平。

 沿着导线接下去将会遇到这个施密特触发器(图中为肖特基触发器),这个触发器的作用是对输入电压进行整形。如果输入电压大于阈值上限,输出就会瞬间成为高电平,如果低于阈值下限,输出就会瞬间降为低电平,这是处理数字信号在实际应用中可能产生的各种失真的情况(这里要注意的是上限与下限是不相等的,这样就不会出现信号在高低电平频繁波动的情况)

接下去经过触发器整形后的波形将会直接写入输入数据寄存器,我们再通过程序读取输入寄存器对应某一位的数据,得到端口的输入电平。

输入片上外设的部分分为模拟输入和复用功能输入(是数字输入),模拟输入一般给ADC等所以要提供模拟量,导线接在施密特触发器前面;复用功能输入一般连接到其他需要读取端口的外设上,接收的是数字信号,导线接在施密特触发器后面。

 输出部分可以由输出数据寄存器或片上外设控制,如果选择通过输出数据寄存器控制,写数据寄存器的某一位就可以操作对应的端口了,寄存器只能够整体读写,所以要想实现只改变一位数据而不影响其他数据,便有了下图,位设置/清除寄存器用来实现刚刚的操作。(实际上有两种方式能够实现单独改变一个数据,一个是通过按位与或的方式,一个是通过该寄存器,但是第一种方法速度会比第二种慢很多)

 

上面是P-MOS,下面是N-MOS,MOS管是一种电子开关,由信号来控制开关的导通和关闭,开关负责将IO口接到VDD或VSS,这里也可以通过开关选择推挽,开漏或关闭三种输出方式。

选择推挽输出模式时,P-MOS和N-MOS均有效,数据寄存器为1就上管导通,下管断开,输出直接接到VDD,输出高电平;数据寄存器为0就上管断开,下管导通,输出直接接到VSS,输出低电平。这种模式下高低电平均有较强的驱动能力,所以推挽输出模式也可以叫强推输出模式,这种模式下STM32对IO口有绝对的控制权。

选择开漏输出模式时,P-MOS是无效的,只有N-MOS在工作,数据寄存器为1就把下管断开,这时输出就相当于断开了,成为高阻模式;数据寄存器为0就把下管导通,输出直接接到VSS,输出低电平。这个模式只有低电平有驱动能力,高电平是没有驱动能力的,一般用于作为通信协议的驱动方式,在多机通信的情况下这个模式可以避免各个设备相互干扰。开漏模式也可以用于输出5V的电平信号,只需在IO口外接一个上拉电阻到5V的电源,当输出低电平时,由内部的N-MOS直接接VSS,当输出高电平时,由外部的上拉电阻达到5V。这样就可以输出5V电平信号,用于兼容一些5V的电平设备。

选择关闭输出模式时,两个MOS管都无效,输出关闭,端口电平由外部信号控制。

通过上面的各种不同的模块,我们就可以把端口配置成8种不同的模式,只有在模拟输入时,单片机会关闭数字的输入功能。

四、GPIO输出实例

1、点灯

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
int main(void)
{//RCC初始化操作RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIO具体引脚初始化操作GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//GPIO_SetBits(GPIOA,GPIO_Pin_0);//拉高引脚输出电平//GPIO_ResetBits(GPIOA,GPIO_Pin_0);//拉低引脚输出电平//GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);//拉低引脚输出电平//GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);//拉高引脚输出电平int temp = 0;
//	temp = 0;
//	GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)temp);//用0 1代表高低电平时,前面加上BitAction强转,不然会warning
//	Delay_ms(100);
//	temp = 1;
//	GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)temp);
//	Delay_ms(100);while(1){
//		temp = 0;
//		GPIO_WriteBit(GPIOA,GPIO_Pin_0,temp);
//		Delay_ms(100);
//		temp = 1;
//		GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)temp);
//		Delay_ms(100);GPIO_Write(GPIOA,~0x0001);Delay_ms(100);
//		GPIO_Write(GPIOA,~0x0000);
//		Delay_ms(100);}
}

2、流水灯

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
int main(void)
{//RCC初始化操作RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//如果是选定的几种引脚,则 RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB//GPIO具体引脚初始化操作GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//如果是选定的几个引脚,则 GPIO_Pin_0 | GPIO_Pin_1GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//GPIO_SetBits(GPIOA,GPIO_Pin_0);//拉高引脚输出电平  //如果是选定的几个引脚,则 GPIO_Pin_0 | GPIO_Pin_1//GPIO_ResetBits(GPIOA,GPIO_Pin_0);//拉低引脚输出电平//GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);//拉低引脚输出电平//GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);//拉高引脚输出电平while(1){GPIO_Write(GPIOA,~0x0001);Delay_ms(100);GPIO_Write(GPIOA,~0x0002);Delay_ms(100);GPIO_Write(GPIOA,~0x0004);Delay_ms(100);GPIO_Write(GPIOA,~0x0008);Delay_ms(100);GPIO_Write(GPIOA,~0x0010);Delay_ms(100);GPIO_Write(GPIOA,~0x0020);Delay_ms(100);GPIO_Write(GPIOA,~0x0040);Delay_ms(100);GPIO_Write(GPIOA,~0x0080);Delay_ms(100);}
}

3、读取输入电平

if (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12) == 0)

这篇关于STM32F103C8 GPIO的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/372294

相关文章

A20 操作GPIO口

例如:先在 Sys_config.fex文件中 [1302_para] 1302_used      = 1 1302_clk             = port:PD05<1><default><default><0> 1302_dat             = port:PD06<1><default><default><0> 1302_rs

新路程------sil9135 hi3516a gpio功能确认

首先确认SCDT管脚 数据手册解释: 也就是hi3516端应该配置为in,这个pin用来表示有video进来,那么进来前后,pin的状态是如何变化的呢? 还有编程手册里 有寄存器可以读取这个SCDT的值,那么还要这个pin干什么呢?不太理解,以后解释 接下来是int pin,中断好配, hi3516a这边是gpio11_2,先看是否配成gpio /usr #

【STM32开发】GPIO最全解析及应用实例

目录 【1】GPIO概述 GPIO的基本概念 GPIO的应用 【2】GPIO功能描述 1.IO功能框图 2.知识补充 3.功能详述 浮空输入 上拉输入 下拉输入 模拟输入 推挽输出 开漏输出 复用开漏输出和复用推挽输出 【3】GPIO常用寄存器 相关寄存器介绍 4个32位配置寄存器 2个32位数据寄存器 1个32位 置位/复位寄存器 2个32位 复用功能配置寄存器 常用寄存器详述 GPIO端

集成电路学习:什么是GPIO通用输入输出

GPIO:通用输入输出         GPIO,全称General Purpose Input/Output,即通用输入/输出端口,是嵌入式系统中非常重要的基本硬件资源之一。以下是对GPIO的详细解析: 一、GPIO的定义与功能         GPIO是一种非常灵活的接口,可以实现数字输入、数字输出、模拟输入、模拟输出等多种功能。它作为微控制器、嵌入式系统或其他电子设备与外部世界进行

TI DSP TMS320F280025 Note9:GPIO输入输出与外部中断功能原理与应用

TMS320F280025 GPIO输入输出与外部中断功能原理与应用 文章目录 TMS320F280025 GPIO输入输出与外部中断功能原理与应用GPIO原理输入输出模式的共同特性1. 复用设置2. 内部上拉设置3. GPIO状态读取 对于输出模式输出电平设置开漏输出设置 对于输入模式极性设置采样类型不同步(异步输入)只同步到SYSCLKOUT使用采样窗口进行鉴定 外部输入中断G

笔记 10 : 彭老师课本第 5 章 , GPIO , vim 的复制剪切删除 ; uboot读写内存的 md , nm 命令

(77) 进入代码实验以来,开始有机会频繁的修改源代码。补充 vim 的使用: ++ (78) 如何只查看某个文件的权限,属性: (79) 关于 rm 命令: (80) 接着学习 新的 Uboot 命令: md/nm 显示内存与修改内存: uboot 有很多不错的调试命令。之前学习和使用了 loadb 指令指定指令的加载地址, 如 40008000 H: ++ nm

STM32 GPIO的深度了解

STM32的开发学习主要涉及软硬件两个部分的实现,包含众多外设和总线的理解配置。STM32的整个学习曲线并不陡峭,但入门却相当困难,因此在学习之初,多动手实验和测试相当重要,GPIO作为整个STM32与外部连接的端口,难度不高,却十分重要。从深入解析GPIO外设开始,一步步熟悉掌握STM32各个模块,就是STM32的整个学习流程。 GPIO模块回顾     在嵌入式软件开发中,几乎所有功

【openwrt-21.02】T750 openwrt-21.02 Linux-5.4.238 input子系统----gpio-keys实现分析

input子系统           输入子系统是由设备驱动层(input driver)、输入核心层(input core)、输入事件处理层(input event handle)组成 input子系统架构图 gpio-keys         gpio-keys是基于input子系统实现的一个通用按键驱动,该驱动也符合linux驱动实现模型,即driver和device分离模型.一

RK方案有时一开机要设置GPIO口点平

有时候RK方案,需要一开机就设置GPIO口电平,需要在uboot阶段,board.c #define GPIO_BANK0 0#define GPIO_BANK1 32#define GPIO_BANK2 64#define GPIO_BANK3

树莓派 raspberry pi GPIO python

转自https://blog.csdn.net/m0_38039437/article/details/80300680 树莓派 raspberry pi GPIO python   RPiGPIO模块基本使用 导入模块引脚编号方式设置一个通道输入输出设置多个通道的输出清空GPIO 输入 上拉或者下拉电阻测试输入轮询中断与边沿检测线程回调开关去抖GPIO 输出 设置RPiGPIO设置