2-GPIO

GPIO:通用输入输出口

有八种输入输出模式

一个端口可以有多个输入但只能有一个输出,故配置输入不能输出,配置输出可以输入

模式名称性质特征
浮空输入数字输入可读取引脚电平,若引脚悬空,则电平不确定,最常用
上拉输入数字输入可读取引脚电平,内部连接上拉电阻,悬空时默认高电平,输入信号较弱,容易受到干扰且不稳定时选择
下拉输入数字输入可读取引脚电平,内部连接下拉电阻,悬空时默认低电平,不常用
模拟输入模拟输入GPIO无效,引脚直接接入内部ADC
开漏输出数字输出可输出引脚电平,高电平为高阻态(无驱动能力),低电平接VSS
推挽输出数字输出可输出引脚电平,高电平接VDD(有驱动能力),低电平接VSS
复用开漏输出数字输出由片上外设控制,高电平为高阻态,低电平接VSS
复用推挽输出数字输出由片上外设控制,高电平接VDD,低电平接VSS

引脚电平有3V3(引脚定义无写FT),5V(引脚定义有写FT)

作用

  • 输出模式:控制端口输出高低电平用以驱动元器件,模拟通信协议输出时序等
  • 输入模式:读取端口高低电平或电压用以读取按键输入、外设电平信号输入以及ADC电压采集,模拟通信协议接收数据等

GPIO_PIN可以使用按位或同时设置多个引脚,时钟也是可以

GPIO的输出(操作步骤)

使用RCC开启GPIO的时钟

RCC外设中的库函数,常用的只有以下三个函数,在keil内可以右键进入定义查看参数类型

void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);//RCC_AHB外设时钟控制
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);//RCC_APB1外设时钟控制
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);//RCC_APB2外设时钟控制

使用GPIO_Init函数初始化GPIO

GPIO外设中的库函数常用介绍

void GPIO_DeInit(GPIO_TypeDef* GPIOx);//复位
void GPIO_AFIODeInit(void);//复位AFIO外设
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);//用结构体参数初始化GPIO口
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);//将结构体变量赋一个默认值

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//读取输入数据寄存器某一端口的输入值,返回值为uint8_t,代表端口高低电平
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);//读取整个输入数据寄存器的输入值,返回值为uint16_t,每一位戴代表一个端口值
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//读取输出数据寄存器某一端口的输出值
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);//读取整个输出数据寄存器的输出值
//以上四个读取函数,输出模式用输出,输入模式用输入
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//设置指定端口为高电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//设置指定端口为低电平
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);//根据第三个参数设定指定端口
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);//可以同时对16个端口进行写入
//以上四个写入函数

使用输出或输入函数控制GPIO

即第二步的后八个函数以及其他操作等

  GPIO_Mode_AIN = 0x0,//模拟输入
  GPIO_Mode_IN_FLOATING = 0x04,//浮空输入
  GPIO_Mode_IPD = 0x28,//下拉输入
  GPIO_Mode_IPU = 0x48,//上拉输入
  GPIO_Mode_Out_OD = 0x14,//开漏输出
  GPIO_Mode_Out_PP = 0x10,//推挽输出
  GPIO_Mode_AF_OD = 0x1C,//复用开漏
  GPIO_Mode_AF_PP = 0x18//复用推挽

GPIO的输入

模块化编程

解释

当有多个外设联合驱动时,都放在主函数内会过于混乱,不方便管理且移植,故像这种驱动代码一般将他封装起来,单独放在.c与.h中,即在工程内建一个hardware的文件夹存放硬件驱动。

步骤

  • 先按三个箱子添加新的文件,再魔法棒C/C++内添加文件夹路径,然后在右栏右键Hardware添加.c和.h文件,表示某一个外设驱动的存放位置,如下图为LED的驱动程序的.c/.h文件。
    在这里插入图片描述

  • 在.c文件中右键,添加STM32头文件;
    在这里插入图片描述
    在这里插入图片描述

  • 在.h中添加以下代码的格式

#ifndef __LED_H//__(2个)文件名_(1个)H
#define __LED_H//__(2个)文件名_(1个)H

//中间写.c文件内定义的函数名

#endif

其他

AO模拟电压输出

DO数字电压输出

ctrl+alt+空格 --> 跳出补全搜索框

库函数的使用方法

  • 打开对应.h文件看一下有什么库函数,右键到定义查看具体内容
  • 官方库函数用户手册或帮助文档
  • 搜索引擎搜索

与C的联系的知识

  • 与51不同,int在这里是32位,而不是16位
  • 因为经常对不上,所以改变了他们的名字,使之更浅显易懂且对得上
关键字位数表示范围stdint关键字ST关键字
char8-128 ~ 127int8_ts8
unsigned char80 ~ 255uint8_tu8
short16-32768 ~ 32767int16_ts16
unsigned short160 ~ 65535uint16_tu16
int32-2147483648 ~ 2147483647int32_ts32
unsigned int320 ~ 4294967295uint32_tu32
long32-2147483648 ~ 2147483647
unsigned long320 ~ 4294967295
long long64-(2^64)/2 ~ (2^64)/2-1int64_t
unsigned long long640 ~ (2^64)-1uint64_t
float32-3.4e38 ~ 3.4e38
double64-1.7e308 ~ 1.7e308

  • 电路中一个电容一端接地,极大可能为滤波作用,可以去掉
  • 上拉下拉即指端口电压大小,变大为上拉,变小为下拉,在电路中用分压定理判断
  • 接地一般叫下接xx,接3V3/5V则叫上接xx
  • 单片机都有上拉模式,但是下拉模式不确定,所以设计电路时一般使用上拉模式
  • 外设配置不知道配置什么模式,可以查看数据手册的GPIO中的外设GPIO配置
i2c-gpio是一个在Linux内核中实现的I2C总线驱动程序,它使用GPIO引脚模拟I2C总线的功能。通过i2c-gpio,您可以在不具备硬件I2C总线的系统上使用软件模拟的I2C通信。 要使用i2c-gpio驱动程序,您需要进行以下步骤: 1. 确保内核配置中启用了i2c-gpio驱动程序。您可以通过查看内核配置文件(通常位于`/usr/src/linux/.config`)或通过内核配置工具(如make menuconfig)来检查。 2. 确保所需的GPIO引脚已正确配置为用于I2C通信。这通常涉及到在设备树或板级文件中进行配置。具体的配置方法取决于您所使用的硬件平台和内核版本。 3. 加载i2c-gpio模块。您可以使用`modprobe`命令来加载模块,例如: ``` modprobe i2c-gpio ``` 4. 配置i2c-gpio驱动程序的参数。您可以通过在/sys/class/i2c-gpio目录下的相应GPIO设备目录中设置参数文件来配置,例如: ``` echo "gpio=<SDA_GPIO_PIN>,<SCL_GPIO_PIN>" > /sys/class/i2c-gpio/<I2C_ADAPTER>/new_device ``` 其中,`<SDA_GPIO_PIN>`和`<SCL_GPIO_PIN>`分别是用于数据线(SDA)和时钟线(SCL)的GPIO引脚号,`<I2C_ADAPTER>`是i2c-gpio适配器的编号。 5. 完成上述步骤后,您应该能够在`/dev`目录下看到相应的I2C设备节点,例如`/dev/i2c-X`,其中X是适配器编号。 现在,您可以使用标准的I2C工具(如i2c-tools)或编写自己的应用程序来与通过i2c-gpio驱动程序模拟的I2C设备进行通信。 请注意,i2c-gpio是一种软件模拟的解决方案,在某些情况下可能会受到性能或兼容性方面的限制。因此,如果您的系统有硬件I2C总线可用,最好使用硬件解决方案来获得更好的性能和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值