浅谈GPIO多种工作模式及原理,使用方法流程及编程时的参数查看方法

GPIO的八种使用模式

前言:需要掌握的问题

  1. 脑子里要有各种工作模式的开关结构图
  2. 知道各种工作模式的工作特点、适用场合
  3. 能够区分P-MOS和N-MOS,以及可以分析有MOS管的简单电路

八种使用模式概览

在这里插入图片描述
对于开漏模式的用途,进行如下补充:

  1. 匹配电压
    如果芯片外部需要驱动的芯片所需的电压不是3.3V,就可以通过开漏模式配合外面的上拉电路,提供所需的电压。
  2. 线与实现IIC
    在这里插入图片描述如图,所有从设备的SDA管脚设定为开漏模式,只要从设备中有一个为低电平,由于线与的逻辑,总线上的SDA也就被下拉为低电平,从而提示主设备进行下一步操作。

详细链接

更详细的内容请参考这位前辈的文章
链接: 深刻理解GPIO(上拉输入、下拉输入、模拟输入、浮空输入,开漏输出,推挽输出的区别,以STM32为例)

MOS管内容补充

对于MOS管,进行简单的复习:

  1. N型半导体是自由电子浓度远大于空穴浓度,以“电子”导电
  2. P型半导体则是空穴浓度远大于自由电子浓度,以“空穴”导电,假想为正电荷导电
  3. MOS管简单一览表
    在这里插入图片描述
    详细内容可以参看这两个链接
    链接: MOS管的原理和特性
    链接: CMOS工艺OD门,传输门,三态门原理应用浅析

GPIO 使用流程

前言:需要掌握的问题

  1. 在确定使用GPIO的哪一个管脚、什么工作模式之后,知道该如何通过HAL函数进行相关的设置
  2. 使用规范的文件结构

GPIO使用流程和对应的函数

对GPOI的使用,包括三个步骤:

  1. 使能对应IO口的时钟(和51不同);
  2. 用HAL_GPIO_Init()函数初始化管脚,包括设置IO管脚的工作模式和工作速度等;
  3. 对IO进行操作,如读/写等;

对应函数的使用方法分别是:

  1. stm32f4xx_hal_rcc_ex.h和stm32f4xx_hal_rcc.h中定义了GPIOx(x为A/B/C……)的时钟使能函数,故只要工程中包含对应的.c和.h文件,即可调用形如__HAL_RCC_GPIODx_CLK_ENABLE()的函数来使能时钟;
  2. HAL_GPIO_Init()需要传递的参数,打开定义可以看到:
void HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init)

需要传递两个参数,第一个的参数为GPIOx(x为A/B/C……),指明要初始化的管脚在哪一个GPIO分组,第二个参数为GPIO_Init的类对象,同样打开其定义:

typedef struct
{
  uint32_t Pin;      //对应管脚号,可为GPIO_PIN_y(其中y=0-15)
  uint32_t Mode;     //工作模式,可为GPIO_MODE_mode(其中mode为INPUT、OUTPUT_PP、OUTPUT_OD等)
  uint32_t Pull;    //是否上拉/下拉,可为GPIO_NOPULL、GPIO_PULLUP、GPIO_PULLDOWN
  uint32_t Speed;   //速度设置,可为GPIO_SPEED_FREQ_freq(其中freq为LOW/HIGH/MEIDUM/VERY_HIGH等)
  uint32_t Alternate;  //需要GPIO复用模式的时候,进行管脚的复用映射
}GPIO_InitTypeDef;

在本例中,知道是PF9管脚,需要工作在推挽输出、高速模式,故可用如下代码进行初始化(注意不是每个参数都需要设置,按需设置就好):

	GPIO_InitTypeDef GPIO_Initure;			 //声明一个类对象
    GPIO_Initure.Pin=GPIO_PIN_9|GPIO_PIN_10; //PF9,10
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOF,&GPIO_Initure);
  1. 对IO进行操作的方法较多,如可用位操作、对寄存器进行操作、调用HAL函数等,只记录调用HAL函数的方法:
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_RESET); //对PF9进行复位
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET);	//对PF9进行置位

参数变量查看方法

为了提高代码的可读性,mdk中有很多的宏定义,如前面列写GPIO初始化函数时,各个参数的可取值事实上都是整型的数字(数字值怎么取,可参考中文参考手册中的寄存器定义来进行),但却要用宏定义来写,因此必须要搞清楚如何查看这些宏定义。
比如想要查看void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)中GPIO_InitTypeDef各个成员变量的可能取值:

  1. 右击GPIO_InitTypeDef,选择进入其定义:
    在这里插入图片描述

  2. 进入定义后,可以看到每一个变量后都有注释,注意@ref后面的这些标题,如下图框框所示
    在这里插入图片描述

  3. 比如我现在向看看mode可以有哪些合法的取值,也就是HAL库事先声明好的宏定义,操作如下:
    在这里插入图片描述
    首先选中“GPIO_mode_define”这条标题,然后电机选项卡里的如上功能按键,也就是ctrl+F,将look in选为Current Document就可以看到,有时候定义会在别的文件里,则可以将look in 选为Current Project放大范围,或点击上面的Find in Files进行更大范围的搜索。

  4. 根据搜索到的界面相关提示选择自己要用的那个模式就可以了:
    在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值