做图片视频的网站有哪些问题,杭州广告设计公司,大连网络营销咨询服务,免费动画模板素材网站GPIO简介
GPIO#xff1a;即General Purpose Input/Output#xff0c;通用目的输入/输出。就是一种片上外设#xff08;内部模块#xff09;。
对于STM32的芯片来说#xff0c;周围有一圈引脚#xff0c;有时需要对引脚进行读写#xff08;读#xff1a;从外部输入一…GPIO简介
GPIO即General Purpose Input/Output通用目的输入/输出。就是一种片上外设内部模块。
对于STM32的芯片来说周围有一圈引脚有时需要对引脚进行读写读从外部输入一个信号连接到IO引脚上我们去读取输入电平写通过IO引脚向外输出电平但CPU本身不能直接读写IO引脚它必须通过GPIO帮它去执行这个功能。
每一组IO引脚对应一个GPIO例如PA0~15对应GPIOAPB0~15对应GPIOB。 GPIO的寄存器组
配置寄存器GPIOx_CR
功能用来设置IO引脚的参数共16份每一份4个比特位用来设置单个IO引脚的参数。
CR15CR14CR13CR12CR11CR10CR9CR8CR7CR6CR5CR4CR3CR2CR1CR0 比如CR0这4个比特位它负责设置Px0这个引脚的参数xA、B、...G。 输入数据寄存器GPIOx_IDR
这个寄存器共有16个比特位即对应了一组GPIO的16个引脚。
1514131211109876543210 IDR 15 IDR 14 IDR 13 IDR 12 IDR 11 IDR 10 IDR 9 IDR 8 IDR 7 IDR 6 IDR 5 IDR 4 IDR 3 IDR 2 IDR 1 IDR 0
功能读取外部输入电平。
例如IDR0比特位对应Px0引脚负责读取这个引脚上外部输入信号的电平。如果IDR0为0则外部输入为低电平如果IDR0为1则外部输入为高电平。所以我们可以通过读取输入数据寄存器的值来判断外部输入信号的电平。 输出数据寄存器GPIOx_ODR
功能控制IO引脚输出电平
同样是一个16位寄存器每一位对应一个IO引脚。例如ODR0对应Px0引脚我们向ODR0写入一个0则Px0引脚输出一个低电平。我们通过向这个输入数据寄存器写入一个值来控制IO引脚的输出电平。 GPIO的8种工作模式
为什么会有8种工作模式
STM32的功能比较复杂需要芯片周围这一圈的IO引脚能够适应不同的工作场景。为了适应不同的工作场景IO引脚就需要不同工作方式。
对于同一个IO引脚它既可以作为输入也可以作为输出既可以是通用也可以是复用。从不同角度组合后具体8个模式如下
输出输入输出推挽输入上拉输出开漏输入下拉复用推挽输入浮空复用开漏模拟模式 工作模式分类分析 分类标准1输入与输出 分类标准2通用与复用 分类标准3推挽与输出 分类标准4上拉、下拉和浮空 分类标准1输入与输出
输入通过IO引脚读取外部输入电平的高低
输出通过IO引脚向外输出高低电平
分类标准2通用与复用 通用CPU直接控制GPIO进行编程
复用CPU通过其他的片上外设去间接控制GPIO引脚的输出
对于输入模式没有通用和复用之分对于CPU和片上外设它们读取GPIO的输入值的时候多个对象之间同时读取也不会产生干扰。
分类标准3推挽和开漏 对于开漏PMOS管始终断开可去掉当输入为1时为高阻态输入为0时为低电平。
分类标准4上拉、下拉和浮空
针对输入模式分为上拉、下拉和浮空三种模式。对于IO引脚而言工作在输入模式下的时候相当于测量外部电压所以其内阻为无穷大。
对于某个引脚当外部为高电平时引脚为高电平外部为低电平时引脚为低电平。但当外部输入信号断开后此时IO引脚悬空会在空间中接收电磁波IO引脚上的信号会随着电磁波抖动制造一些杂乱无章的信号。此时为输入浮空模式。
因此我们可以给IO引脚添加上拉电阻或者加一个下拉电阻。当IO引脚悬空的时候给一个默认的电平 模拟模式
对于C8T6芯片内部有一个ADC模块此模块会采集外部的输入信号通过IO口。ADC模块有10个通道故需要10个引脚进行采集。当我们使用ADC的时候就需要将对应的IO引脚来设置成模拟模式。 IO的最大输出速度
最大输出速度IO允许输出电平的最大切换频率。仅对于输出模式
IO引脚的切换频率不能无限大因为IO引脚的最大切换速度受限于引脚的电平切换的上升时间和下降时间以及有效输出时间。
对于STM32其IO引脚最大输出速度有3档可选考虑功耗实际应用通常选取能满足要求的最小值。如下所示 附GPIO内部结构图 GPIO的标准库编程接口
初始化
void GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_TypeDef*GPIO_InitStruct)
//用于IO引脚的初始化
此函数用于IO引脚的初始化实际上就是配置CR寄存器里的比特位。 读IDR
UINT8_t GPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin)
//读取IDR的一个比特位UINT8_t GPIO_ReadInputData(GPIO_TypeDef*GPIOx)
//读取整个IDR寄存器 读ODR
UINT8_t GPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin)
//读取ODR的一个比特位UINT8_t GPIO_ReadOutputData(GPIO_TypeDef*GPIOx)
//读取整个ODR寄存器 写ODR
void GPIO_SetBits(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin)
//将ODR的某一位置1void GPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin)
//将ODR的某一位置0void GPIO_WriteBits(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin,BitAction BitVal)
//将ODR的某个比特位写0或写1void GPIO_Write(GPIO_TypeDef*GPIOx,uint16_t PortVal)
//写ODR寄存器