GPIOMode_TypeDef 学习备注

学习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模式简介
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)上拉输入


学习使用,仅供参考!

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值