GPIO的使用
1.GPIO八种工作模式
保护二极管的作用:用来保护IO,一般情况IO的范围在0~3.3V,有些IO可以支持5V,IO输入电压大于3.3V保护二极管VDD导通,IO输入电压小于0V,保护二极管VSS导通。
1.1 上拉输入
1.配置相关寄存器
IO 和上拉电阻连接,此时输入为高电平
TTL肖特基触发器用来稳定输入电平,TTL肖特基触发器会提供两个参考电压,输入电压高于高参考电压,则为高电平,输入电压低于低参考电压,则为低电平,低于高参考电压,高于低参考电压,则保持不变(原来是高电平就保持高电平,反之一样)
1.2 下拉输入
1.配置相关寄存器
IO 和 下拉电阻连接,此时输入为低电平
1.3 浮空输入
1.配置相关寄存器
IO 即不与上拉电阻连接,也不与下拉电阻连接
1.4 模拟输入
1.配置相关寄存器
上拉输入、下拉输入、浮空输入,输入的信号都为数字信号
模拟输入,输入的信号为模拟信号,GPIO无效,引脚直接接入内部ADC
一般用于ADC采样
1.5 推挽输出
1.配置相关寄存器
使P-MOS 导通 N-MOS 断开 此时IO连接的是VDD,所以输出高电平
使P-MOS 断开 N-MOS 导通 此时IO连接的是VSS,所以输出低电平
推挽输出具有一定的电压与电流驱动能力,可以直接驱动一些合适的元件工作
1.6 开漏输出
1.配置相关寄存器
开漏模式只有N-MOS工作 P-MOS一直处于断开状态
IO 输出高电平 N-MOS断开,此时IO的状态为高阻态
IO 输出低电平 N-MOS导通,此时IO的状态为低电平
开漏输出没有驱动能力,需要依靠外部电路进行驱动
推挽输出 | 开漏输出 | |
---|---|---|
高电平 | P-MOS导通 N-MOS端口 输出3.3V | P-MOS 断开 N-MOS 断开 高阻态 |
低电平 | P-MOS 断开 N-MOS 导通 输出 0V | P-MOS 断开 N-MOS 导通 输出 0V |
优点 | 可以直接输出 3.3V | 配合外部电路 更加灵活 |
缺点 | 只能输出 3.3V | 高电平是高阻态 无法输出电流 |
1.7 复用推挽输出
由片上外设控制,高电平接VDD,低电平接VSS
1.8 复用开漏输出
由片上外设控制,高电平为高阻态,低电平接VSS
2.相关寄存器
2.1 寄存器配置IO
输出模式与输出速度是通过GPIOX_CRL与GPIOX_CRH两个寄存器来配置的,通过4个位来配置1个IO,CNF1,MODE1,CNF0,,MODE0
例1:将PC1设置成上拉输入
{GPIOC->CRL&=0XFFFFFF0F;GPIOC->CRL|=(u32)8<<4; GPIOC->ODR&=0XFFFFFFFD;GPIOC->ODR|=(u32)1<<1;}
1.GPIOC->CRL&=0XFFFFFF0F; //将PC1引脚配置的寄存器先清零
2.GPIOC->CRL|=(u32)8<<4; //1000B左移四位与CRL求或,PC1引脚配置寄存器被设置为1000B(此时端口被设置为 输入模式)
3.GPIOC->ODR&=0XFFFFFFFD; // 将PC1引脚输出的寄存器先清零
4.GPIOC->ODR|=(u32)1<<1; // PC1输出寄存器设置为1 (上拉为1,下拉为0)
例2:将PC1设置成50MHz通用输出
{GPIOC->CRL&=0XFFFFFF0F;GPIOC->CRL|=(u32)3<<4; GPIOC->ODR&=0XFFFFFFFD;GPIOC->ODR|=(u32)1<<1;}
1.GPIOC->CRL&=0XFFFFFF0F; //将PC1引脚配置的寄存器先清零
2.GPIOC->CRL|=(u32)8<<4; //0011B左移四位与CRL求或,PC1引脚配置寄存器被设置为0011B(此时端口被设置为 通用输出模式)
3.GPIOC->ODR&=0XFFFFFFFD; // 将PC1引脚输出的寄存器先清零
4.GPIOC->ODR|=(u32)1<<1; // PC1输出寄存器设置为1 (1或0多可以)
配置IO先查看表17,然后再设置CRL或CRH寄存器
MODE1,MODE 为 00 是输入
MODE1,MODE 为01,10,11是输出
GPIOx_ODR 寄存器 如果IO配置为输出模式,则设置成1或0
GPIOx_ODR 寄存器 如果IO配置为输入模式则用来设置上拉输入,还是下拉输入
3.相关库函数
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)//初始化 u8 GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) //读取指定端口管脚的输入 u16 GPIO_ReadInputData(GPIO_TypeDef* GPIOx) //读取指定的 GPIO 端口输入 u8 GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) //读取指定端口管脚的输出 u16 GPIO_ReadOutputData(GPIO_TypeDef* GPIOx) //读取指定的 GPIO 端口输出 void GPIO_SetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) //设置指定的数据端口位 void GPIO_ResetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)//清除指定的数据端口位 void GPIO_WriteBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin, BitAction BitVal)//设置或者清除指定的数据端口位 void GPIO_Write(GPIO_TypeDef* GPIOx, u16 PortVal)//向指定 GPIO 数据端口写入数据