目录
1) STM32 的 IO 口 可以由软件配置成如下 8 种模式:
一.GPIO基本原理:
1.GPIO的工作方式:
1) STM32 的 IO 口 可以由软件配置成如下 8 种模式:
1、输入浮空模式
在浮空输入的情况下那两个开关是不打开的 ,此时施密特触发器是打开的,这样电平就会传入输入数据寄存器,以此CPU就可以通过数据寄存器读取到外部输入的高级电平的值。
2、输入上拉模式
此时相较于输入浮空模式,上面的开关是被接通的,拉了一个电阻(大概是30-50K)到VDD ,其余步骤和输入浮空模式相同。
例:在cmos芯片上,为了防止静电造成的破坏,不用的管脚不能悬空,一般接上拉电阻产生降低阻抗,提供泄荷通路。
3、输入下拉模式
此时下连上的,上方电阻是不连上的,其余与浮空相似。
例:为加大输出引脚的驱动能力,有的单片机管脚上也经常使用上拉电阻。
上拉就是将不确定的信号通过一个电阻嵌位在高电平!电阻同时起限流作用!下拉同理!
4、模拟输入模式
此时以电压的模式输入而不是电平,枢密特触发器也会停止使用,通过模拟输入通道通入CPU。模拟输入是指传统方式的输入,数字输入是输入PCM数字信号,即0、1的二进制数字信号,通过数模转换,转换成模拟信号,经前级放大进入功率放大器,功率放大器还是模拟的。
5、开漏输出模式
从最左边开始:如果在输出控制电路中输出1,N-MOS是关闭状态,那么高低电平则是由外部上拉或者下拉来决定的。但是如果在输出控制电路那里输出的是0,那么N-MOS板属于开启状态,这是I/O口的电平就会被N-MOS板拉到Vss,这时I/O口输出来的就是低电平。
注:
- 一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。比如加上上拉电阻就可以提供TTL/CMOS电平输出等。(上拉电阻的阻值决定了逻辑电平转换的沿的速度 ,阻值越大,速度越低功耗越小,所以负载电阻的选择要兼顾功耗和速度。)
- OPEN-DRAIN提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。
-
只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma内)。
6、推挽输出模式
若输出控制电器输出为1的话,P-MOS管会被导通,N-MOS管就会被截止,在I/O端就会输出1;若输出的是0,那么一切相反。
推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形方法任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小,效率高。输出即可以向负载灌电流。推拉式输出级即提高电路的负载能力,又提高开关速度。
7、推挽式复用功能模式
通过复用功能相关的复用通道,其余与上个相同。
可以理解为GPIO口被用作第二功能时的配置情况(并非作为通用IO口使用)。
8、开漏复用功能模式
来自片上的外设模块来决定的,其余与开漏输出模式相同。
可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)。端口必须配置成复用功能输出模式(推挽或开漏)。
注:上电复位后,GPIO默认为浮空状态,部分特殊功能引脚为特定状态。
2)3种最大翻转速度:
-2MHZ
-10MHz
-50MHz
3)每个 IO 口可以自由编程,但 IO 口寄存器必须要按 32 位字被访问。STM32 的很多 IO 口都 是 5V 兼容的,这些 IO 口在与 5V 电平的外设连接的时候很有优势.
2.GPIO的基本结构:
1)I/O端口的基本结构:
注:大部分I/O口都是可以容忍5V的(带FT标识的可以)。没有加FT的不行。
3.STM32引脚的说明:
1)引脚的数量:
是144叫脚的芯片: STM32F103ZET
- 一共有7组IO口
- 每组IO口有16个IO
- 一共16X7=112个IO GPIOA,GPIOB---GPIOG(从PA0到PA15)
2)引脚的作用:
STM32的大部分引脚除了当GPIO使用外,还可以复用为外设功能引脚(比如串口)。
例如:PA9,PA10默认是I/O口功能,但也可以作为串口来作为发送和接收引脚。也可以作为定时器相应通道的引脚。
二:相关寄存器的配置
1.每组GPIO端口的寄存器包括:
两个32位配置寄存器(GPIOx_CRL ,GPIOx_CRH) ,
两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR),
一个32位置位/ 复位寄存器(GPIOx_BSRR),
一个16位复位寄存器(GPIOx_BRR),
一个32位锁定寄存器(GPIOx_LCKR)。
每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问) 。每组IO口含下面7个寄存器。也就是7个寄存器,一共可以控制一组GPIO的16个IO口。
- GPIOx_CRL :端口配置低寄存器
- GPIOx_CRH:端口配置高寄存器
- GPIOx_IDR:端口输入寄存器
- GPIOx_ODR:端口输出寄存器
- GPIOx_BSRR:端口位设置/清除寄存器
- GPIOx_BRR :端口位清除寄存器
- GPIOx_LCKR:端口配置锁存寄存器
1) 下图为端口配置低寄存器:
从PA0-PA7一共8个引脚,上下表同时看。
2)下图为端口配置高寄存器:
同低寄存器。
3)下图为端口输入数据寄存器:
4)下图为端口输出数据寄存器:(非常重要)
设置为1的话输出高电平,输出为0的话,反之。可用来配置上拉还是下拉。
配置为1的话,是上拉;配置为0的话是下拉。
5)下图为端口位设置/清除寄存器:
用高位,低位;0,1来控制产不产生影响以及是否清除。
6)端口位清除寄存器:
三.STM32引脚说明:
1.端口复用功能
--作用:最大限度的利用端口资源.
2.端口重映射功能
就是可以把某些功能引脚映射到其他引脚。比如串口1默认引脚是PA9,PA10可以通过配置重映射映射到PB6,PB7.
--作用:方便布线.
注:u所有IO口都可以作为中断输入 。
四:跑马灯硬件连接:
硬件连接图。
GPIO输出模式:推挽输出。LED1输出的是0,使得两端的压差,导致两个灯的亮;若LED1输出的是1,输出的是高电平,那么久不会有亮的了。
1.重要函数:
1个初始化函数:(选中是哪一个I/O口)
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
作用:初始化一个或者多个IO口(同一组)的工作方式和速度。
该函数主要是操作GPIO_CRL(CRH)寄存器,在上拉或者下拉的
时候有设置BSRR或者BRR寄存器
GPIOx: GPIOA~GPIOG
注意:外设(包括GPIO)在使用之前,几乎都要先使能对应的时钟。
2个读取输入电平函数:
1)uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:读取某个GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。
例如:
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输入电平
2)uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
作用:读取某组GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。
例如:
GPIO_ReadInputData(GPIOA);//读取GPIOA组中所有io口输入电平
2个读取输出电平函数:
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
4个设置输出电平函数:
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);(在I/O口输出高电平)
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);(在I/O口输出低电平)
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
五:手把手写跑马灯实验
不同的IO组,调用的时钟使能函数不一样。
GPIO_SetBits();
GPIO_ResetBits();