stm32GPIO的相关操作

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.3VP-MOS 断开 N-MOS 断开 高阻态
低电平P-MOS 断开 N-MOS 导通 输出 0VP-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 数据端口写入数据
    

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值