GPIO的八种使用模式
前言:需要掌握的问题
- 脑子里要有各种工作模式的开关结构图
- 知道各种工作模式的工作特点、适用场合
- 能够区分P-MOS和N-MOS,以及可以分析有MOS管的简单电路
八种使用模式概览
对于开漏模式的用途,进行如下补充:
- 匹配电压
如果芯片外部需要驱动的芯片所需的电压不是3.3V,就可以通过开漏模式配合外面的上拉电路,提供所需的电压。 - 线与实现IIC
如图,所有从设备的SDA管脚设定为开漏模式,只要从设备中有一个为低电平,由于线与的逻辑,总线上的SDA也就被下拉为低电平,从而提示主设备进行下一步操作。
详细链接
更详细的内容请参考这位前辈的文章
链接: 深刻理解GPIO(上拉输入、下拉输入、模拟输入、浮空输入,开漏输出,推挽输出的区别,以STM32为例)
MOS管内容补充
对于MOS管,进行简单的复习:
- N型半导体是自由电子浓度远大于空穴浓度,以“电子”导电
- P型半导体则是空穴浓度远大于自由电子浓度,以“空穴”导电,假想为正电荷导电
- MOS管简单一览表
详细内容可以参看这两个链接
链接: MOS管的原理和特性
链接: CMOS工艺OD门,传输门,三态门原理应用浅析
GPIO 使用流程
前言:需要掌握的问题
- 在确定使用GPIO的哪一个管脚、什么工作模式之后,知道该如何通过HAL函数进行相关的设置
- 使用规范的文件结构
GPIO使用流程和对应的函数
对GPOI的使用,包括三个步骤:
- 使能对应IO口的时钟(和51不同);
- 用HAL_GPIO_Init()函数初始化管脚,包括设置IO管脚的工作模式和工作速度等;
- 对IO进行操作,如读/写等;
对应函数的使用方法分别是:
- stm32f4xx_hal_rcc_ex.h和stm32f4xx_hal_rcc.h中定义了GPIOx(x为A/B/C……)的时钟使能函数,故只要工程中包含对应的.c和.h文件,即可调用形如__HAL_RCC_GPIODx_CLK_ENABLE()的函数来使能时钟;
- 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);
- 对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各个成员变量的可能取值:
-
右击GPIO_InitTypeDef,选择进入其定义:
-
进入定义后,可以看到每一个变量后都有注释,注意@ref后面的这些标题,如下图框框所示
-
比如我现在向看看mode可以有哪些合法的取值,也就是HAL库事先声明好的宏定义,操作如下:
首先选中“GPIO_mode_define”这条标题,然后电机选项卡里的如上功能按键,也就是ctrl+F,将look in选为Current Document就可以看到,有时候定义会在别的文件里,则可以将look in 选为Current Project放大范围,或点击上面的Find in Files进行更大范围的搜索。 -
根据搜索到的界面相关提示选择自己要用的那个模式就可以了: