首页 > 其他分享 >GPIOMode_TypeDef 学习备注

GPIOMode_TypeDef 学习备注

时间:2024-09-04 15:53:02浏览次数:15  
标签:TypeDef Pin 引脚 InitStructure Mode GPIOMode GPIO Speed 备注

学习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)为上拉输入


学习使用,仅供参考!

标签:TypeDef,Pin,引脚,InitStructure,Mode,GPIOMode,GPIO,Speed,备注
From: https://blog.csdn.net/hjlkklk/article/details/141645840

相关文章

  • 42. typedef
    9.4typedeftypedef为C语言的关键字,作用是为一种数据类型(基本类型或自定义数据类型)定义一个新名字,不能创建新类型与#define不同,typedef仅限于数据类型,而不是能是表达式或具体的值#define发生在预处理,typedef发生在编译阶段#include<stdio.h>typedefintINT;typedefcharBY......
  • 原神4.8版本重点培养和抽到角色数据表:修改了添加倒计时.隐藏了抽到角色数据表删除按钮
    <!DOCTYPEhtml><htmllang="zh-cn"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>原神4.8版本抽到角色和重点培养数据表<......
  • 【C++】定义类型别名的三种方式及其优缺点:typedef,#define 和 using
    引言类型别名是一种给已存在的类型创建一个新名字的方式。这个新的名字(别名)和原类型在语义上是完全相等的,可以在任何原类型可以使用的地方使用。类型别名并不创建一个新的类型,只是为了提高代码的可读性和可维护性。在C++中,可以使用typedef,#define或者using来定义别名。每......
  • typedef在C/C++的用法
    typedef是C和C++中的一个关键字,用于为已有的数据类型创建新的类型名。它的主要用途如下:1.定义别名typedef最基本的功能是为一个现有的类型定义一个别名,使代码更简洁或更具可读性。例如:typedefunsignedlongulong;ulonga,b;这段代码将unsignedlong类型重......
  • 微信批量自动添加好友,自动备注,智能高效!
        告别手动加好友的繁琐,让个微管理系统成为你的智能助手,轻松扩展社交网络!1.多账号聚合管理   个微管理系统允许你同时在线管理多个微信号,实现无缝切换,告别繁琐的登录登出流程。2.客户数据一键导入    通过个微管理系统,你可以轻松批量导入客户......
  • 枚举、typedef、位运算、堆内存-malloc 函数
    目录枚举定义枚举值枚举类型枚举的优点枚举的注意事项示例程序总结typedef基本用法复杂数据类型的重命名位运算位移操作总结堆内存malloc 函数free 函数常见问题枚举定义在C语言中,枚举(enum)是一种数据类型,它允许定义一组具名的常量。使用枚举可以使代码......
  • 共用体、typedef、位运算
    共用体定义:共用体是一个用户自定义的类型,包含多个不同类型的成员,但在同一时间只能存储其中一个成员的值。共用体的声明类似于结构体,但使用关键字union。unionExample{inti;floatf;charc;}; 内存分配:共用体的大小等于其最大成员的大小。例如,如果......
  • c++ typedef 关键字详解
    在C++中,typedef关键字用于为已有的数据类型创建一个新的别名。这使得代码更加易读和维护,尤其是当使用复杂的类型定义时。typedef可以用来简化代码或使其更具描述性。基本语法typedefexisting_typenew_name;这里,existing_type是已有的类型,new_name是你为它创建......
  • C语言之typedef,位运算
    typedef用typedef声明新的类型名来代替已有的类型名声明INTEGER为整型TypedefintINTEGER定义整形变量定义结构体定义数组定义字符型声明POINT为指向函数的指针类型,该函数返回整型值typedefint(*POINT)();用typedef可以声明各种类型名,但不能用来定义变量......
  • 不单独部署注册中心,又要具备注册中心的功能,我能上天!
    开心一刻昨天看到一条广告:全国比丑大赛,一等奖2万奖金我高高兴兴骑着自行车去了场地,结果被保安拦着不让进我心里窃喜:莫非我长得不丑,不符合参赛条件?我说道:为什么不让我进保安:这是业余人员间的比赛,职业选手不能参加敢情不是不丑,而是太丑!书接上回上篇不单独部署注册中心,又......