GPIO
GPIO,通用I/O端口。
在嵌入式系统中,经常需要控制许多结构简单的外部设备或者电路,这些设备有的需要通过CPU控制,有的需要CPU提供输入信号。
对设备的控制,使用传统的串口或者并口就显得比较复杂,所以,在嵌入式微处理器上通常提供了一种“通用可编程“I/O端口”,也就是GPIO。
一个GPIO端口至少需要两位寄存器,一个做控制用的“通用IO端口控制寄存器”,还有一个是存放数据的“通用I/O端口数据寄存器”。
数据寄存器的每一位是和GPIO的硬件引脚对应的,而数据的传递方向是通过控制寄存器设置的,通过控制寄存器可以设置每一位引脚的数据流向
STM32 芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及采集的功能。
STM32103VET6 GPIO引脚
STM32103VET6总共有100个引脚,其中GPIO口有80个。
STM32F10x系列引脚分类
引脚分类 | 引脚说明 |
电源 | (VBAT)、(VDD VSS)、(VDDA VSSA)、(VREF+VREF-)等 |
晶振 IO | 主晶振 IO,RTC(实时时钟)晶振 IO |
下载IO | 用于JTAG下载的IO:JTMS、JTCK、JTDI、JTDO、NJTRST |
BOOT IO | BOOT0,BOOT1用于设置系统的启动方式 |
复位 IO | NRST,用于外部复位 |
上面5部分IO组成单片机最小系统 | |
32 | 专用器件接专用总线,如 I2C,SPI,SDIO,FSMC,DCMI等总线的器件要接到专用的IO |
普通的元器件接到GPIO,比如蜂鸣器,LED,按键等需要接到普通GPIO口 | |
如果还有剩下的IO,根据扩展需求置空或者引出 |
每个GPIO端口都有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32位置位、复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR).
IO 端口位的基本结构
- IO引脚电压保护措施,当正常IO口电压低于VDD(3.3V),由于反向二极管,VDD向IO口、IO口向VSS均没有电流;当IO口电压略高于VDD时,电流流出VDD端;当IO口电压低于VSS时,电流由VSS流出IO口,从而保护了芯片内部电路。但是这个电路还不足以保护芯片被脉冲电流烧毁。
- 当数据写入ODR输出数据寄存器,输出控制确定两个MOS管高低电平,输出IO口是0 V还是3.3 V.
推挽输出 |
---|
INT端 由ODR输出寄存器输出的1或者0,经过反相器变成0或者1。若经过反相器为0,则PMOS基极为0,Ug<Us,PMOS管导通(NMOS截止),则OUT电压等于VDD为3.3V;若经过反相器为1,则NMOS基极为1,Ug>Us,NMOS管导通(PMOS截止),则OUT电压等于0。寄存器输出1,则VDD向OUT推(灌)电流,寄存器输出0,NMOS接地端向OUT挽(拉)电流,高电平由VDD决定,低电平由VSS决定,故称推挽输出。优点效率比较高,电流大(可以直接点亮LED灯),驱动能力强 |
开漏输出 |
INT 输出0,经过反相器变为1,Ug>Us,NMOS管导通,OUT 输出0;INT 输出1,经过反相器变为0,NMOS管截止,OUT输出1。缺点:由于存在较大的上拉电阻,只能输出低于VDD的电平,不能输出高电平,电压由VDD和上拉电阻确定 |
- ODR端口输出数据寄存器
&emsp32位,低16位有效,对应16个GPIO端口引脚。输出数据时候,可以直接修改ODR,也可以修改BSRR位设置/清除寄存器,低16位置位,写1有效,置1;高16位清0,写1有效,清零。还有BRR端口位清除寄存器,32位低16位有效,相当于BSRR寄存器的高16位。若同时清0置1,则置1有效。 - 复用功能输出:内容来自片上外设,如串口输出。
- IDR(INPUT DATA REGISTER)数据输入寄存器:32位低16位有效,只读,0:外部输入0; 1:外部输入1。
当IO口输入电流,到达位置1的复合开关,CRL被配置成上拉输入或者下拉输入,BSRR置位写1或者清除写1,置位或清除输出寄存器。电流TTL施密特触发器起门限作用,将高于TTL高电平2V的置1,低于TTL低电平1.2V的置0,然后输入IDR对应的位设为0,或者1。 - 复用功能输入,电流不经过IDR这条电路,进入外设寄存器。
- 模拟输入不经过触发器,比如ADC采集。(模拟输出DAC也不经过输出寄存器,直接输出到IO口)
端口配置低寄存器
在确定好使用哪些GPIO口之后,需要对GPIOx进行端口配置。32位端口配置低寄存器每两位控制一个GPIO口
比如控制GPIOB 0口输出,低四位设置成 00 01 :推挽输出,输出最大速度为10MHz ; GPIOB 1输入,4-7位设置成 00 00, 模拟输入模式
输出输入寄存器设置顺序
- GPIO输出
- 选定GPIO口
- 配置为设置寄存器CRL(控制0-7位GPIO),CRH (控制8-15位GPIO,两个寄存器是一样的
- 控制输出高电平,低电平——ODR,BRR,BSRR
- GPIO输入
- 确定是哪个输入方式……