学习STM32——当需要用的GPIO引脚的时候往往要进行GPIO初始化,配置GPIO结构体函数。
GPIO初始化:
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //GPIO引脚,赋值为第1号引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,赋值为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //将赋值后的构体变量传递给GPIO_Init函数
其中,GPIO_Mode 有如下分类:
GPIO_Mode | 模式 | 简介 |
GPIO_Mode_AIN | 模拟 输入 | GPIO无效,专供模拟输入ADC使用 |
GPIO_Mode_IN_FLOATING | 浮空 输入 | 读取引脚,可以做外部按键输入识别 |
GPIO_Mode_IPD | 下拉 输入 | 读取引脚电平,悬空默认低电平,高电平代表有输入 |
GPIO_Mode_IPU | 上拉 输入 | 读取引脚电平,悬空默认高电平,低电平代表有输入 |
GPIO_Mode_Out_OD | 开漏 输出 | 1,开漏引脚只能输出低电平,如果需要同时具备输出高电平功能,需要接外部上拉电阻获得高电平。 2,多个开漏输出可串联,形成逻辑“与”关系。 3,在IIC通信协议中可以作为输入。 4,当开漏输出“1”时,可读取外部电路电平信号。 |
GPIO_Mode_Out_PP | 推挽 输出 | 1,推挽输出能够输出两种稳定的状态,即高电平和低电平。 2,高低电平有较强的驱动能力,不需要外部驱动。 |
GPIO_Mode_AF_OD | 复用 开漏 输出 | 可以将一个引脚同时用作输入和输出。 当该引脚被配置为输出时,它将变为开漏输出模式, 当该引脚被外设配置为输入时, 它将变为高阻态。 |
GPIO_Mode_AF_PP | 复用 推挽 输出 | 可以将一个引脚同时用作输入和输出。 当该引脚被配置为输出时,它将变为推挽输出模式, 当该引脚被外设配置为输入时, 它将变为高阻态。 |
怎么去记它呢?笔者的想法是:只要是带 “I” 的为输入,其他都为输出;IPU 最后一个U 为 up 的意思,即为上拉;同理,D为 Dnow,IPD为下拉。AIN的 “A” 为 Analog,模拟信号的意思; FLOAT 就不用解释了吧。 再记住OD为开漏,PP为推挽,AF为复用,就没了。
该怎么去理解这几种GPIO模式呢?作为刚入门的新手来说,建议是先学完STM32全部课程,再去理解它。
我在网上查看他们的解释的时候发现,解释中有很多我没接触过的专有名称和场景。它们之间是相互关联的,所以前期看不懂没关系,后面边用 边理解更有效,学完回过头看,温故知新。但最重要的还是坚持下来!笔者的理解有限,如想要深入理解,下面这个博主写得很好:深刻理解GPIO(上拉输入、下拉输入、模拟输入、浮空输入,开漏输出,推挽输出的区别,以STM32为例)_下拉输出-CSDN博客
该怎么选择输入输出模式呢,主要方式是看参考手册。笔者还是整理了初学者入门学习几个应用实验场景的GPIO结构体配置,仅供学习参考,开发主要还是以参考手册为主。
1 LED灯、蜂鸣器初始化
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,赋值为推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIO引脚,赋值为第0号引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,赋值为50MHz
注:控制LED灯需要对LED灯对应的引脚 输出高低电平 来控制灯的亮灭,控制蜂鸣器也是通过 高低电平 来控制开关,故使用推挽输出模式。
2 按键初始化
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //GPIO模式,赋值为上拉输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
注:按键控制需要检测按键是否被按下,需要对输入电平来进行判断。故使用上拉输入模式。
3 光敏传感器控制蜂鸣器实验
蜂鸣器初始化:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,赋值为推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
光敏传感器初始化:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //GPIO模式,赋值为上拉输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
4 对射式红外传感器初始化
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //GPIO模式,赋值为上拉输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
5 旋转编码器初始化
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //GPIO模式,赋值为上拉输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
6 定时器初始化
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //GPIO模式,赋值为上拉输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
7 PWM初始化
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //GPIO模式,赋值为复用推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
注:PWM既要有定时器时基单元输入,又要输出有高有低的电平信号脉冲。故使用复用推挽输出模式。
8 PWM驱动直流电机实验
直流电机初始化:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,赋值为推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
注:直流电机有正转和反转两种方式,所以需要额外初始化 来控制方向引脚,使用推挽输出模式。
void Motor_SetSpeed(int8_t Speed)
{
if (Speed >= 0) //如果设置正转的速度值
{
GPIO_SetBits(GPIOA, GPIO_Pin_4); //PA4置高电平
GPIO_ResetBits(GPIOA, GPIO_Pin_5); //PA5置低电平,设置方向为正转
PWM_SetCompare3(Speed); //PWM设置为速度值
}
else //否则,即设置反转的速度值
{
GPIO_ResetBits(GPIOA, GPIO_Pin_4); //PA4置低电平
GPIO_SetBits(GPIOA, GPIO_Pin_5); //PA5置高电平,设置方向为反转
PWM_SetCompare3(-Speed); //PWM设置为负的速度值,因为此时速度值为负数,而PWM只能给正数
}
}
9 输入捕获初始化
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //GPIO模式,赋值为上拉输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
10 编码器初始化
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //GPIO模式,赋值为上拉输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
11 AD单通道、多通道初始化
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //GPIO模式,赋值为模拟输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 多通道: GPIO_Pin_1 | GPIO_Pin_2 | ...
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
12 串口初始化(发送+接收)
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //将PA9引脚初始化为复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //将PA10引脚初始化为上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
注:串口 Tx引脚是USART外设控制的输出脚,它在发送数据时需要输出定时翻转的高低电平,使用复用推挽输出模式。 Rx引脚是USART外设控制的输入脚,选择上拉输入模式。
13 IIC软件初始化
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //将PB10和PB11引脚初始化为开漏输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_10 | GPIO_Pin_11);
14 IIC硬件外设控制(MPU6050)初始化
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //将PB10和PB11引脚初始化为复用开漏输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_10 | GPIO_Pin_11);
注:I2C通常使用开漏输出模式,它在数据传输过程中引脚控制权会改变。复用模式与通用模式的区别为:复用模式下,引脚由外部设备来控制。
15 SPI软件初始化
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //将PA4、PA5和PA7引脚初始化为推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //将PA6引脚初始化为上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
注:SPI主机SS、SCK、MOSI引脚为通信输出,使用推挽输出模式。MISO为上拉输入。
16 SPI硬件初始化
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //将PA4引脚初始化为推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //将PA5和PA7引脚初始化为复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //将PA6引脚初始化为上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
注:SS(Pin4)为SPI从机选择,使用推挽输出。SCK(Pin5)、MOSI(Pin7)引脚为外设控制的输出,使用复用推挽输出。MISO(Pin6)为上拉输入。
学习使用,仅供参考!
标签:TypeDef,Pin,引脚,InitStructure,Mode,GPIOMode,GPIO,Speed,备注 From: https://blog.csdn.net/hjlkklk/article/details/141645840