GPIO初始化结构体和初始化函数中,enum枚举定义的结构体来限定Speed的模式(只有三种),Mode的模式(有八种)

文章介绍了如何通过结构体简化GPIO初始化过程,定义了包含GPIO引脚、速度和模式的结构体GPIO_InitTypeDef。同时,为了限制速度和模式的取值,文章使用了枚举类型GPIOSpeed_TypeDef和GPIOMode_TypeDef,分别定义了GPIO的速度选项(10MHz,2MHz,50MHz)和工作模式(输入、输出、浮空等)。枚举的使用提高了代码的可读性和维护性。
摘要由CSDN通过智能技术生成

定义完位操作函数后,控制GPIO输出电平的代码得到了简化,但在控制GPIO输出电平前还需要初始化GPIO引脚的各种模式,这部分代码涉及的寄存器很多,我们希望初始化GPIO也能以如此简单的方法去实现。为此,我们先根据GPIO初始化时涉及到的初始化参数以结构体的形式封装起来,先进行GPIO初始化结构以

typedef struct{
	uint16_t GPIO_Pin;
	uint16_t GPIO_Speed;
	uint16_t GPIO_Mode;
}GPIO_InitTypeDef;

这段结构体代码中包含了初始化GPIO所需的信息,包括了哪个引脚,哪个工作速率,和引脚的工作模式。

设计这个结构体的思路是,初始化GPIO前,先定义一个这样的结构体变量,根据需要配置GPIO的模式,对这个结构体的各个成员进行赋值,如何把这个变量作为“GPIO初始化函数”的输入参数,该函数能根据这个变量值中的内容去配置寄存器,从而实现GPIO的初始化

输出的时候你的速度是不是只有10MHZ,2MHZ,50MHZ,你只有三种选择,但是我们定义的时候定义成16位了也就是65536这么多了,我们可以限定结构体里面的成员只能取某些值,刚好C语言里面有种叫枚举定义叫enum

所以我们写两个枚举定义的结构体,来限定Speed的模式(只有三种),Mode的模式(有八种)


/*工作速度设置 枚举*/
typedef enum{
	GPIO_Speed_10MHZ = 1,		        //10MHZ  (01)b
	GPIO_Speed_2MHZ,				    //2MHZ   (10)b
	GPIO_Speed_50MHZ,				    // 50MHZ  (11)b
	
}GPIOSpeed_TypeDef;

这段代码定义了一个枚举类型 GPIOSpeed_TypeDef,它包含了三个枚举常量:GPIO_Speed_10MHZGPIO_Speed_2MHZGPIO_Speed_50MHZ

为什么只写一个1,后面的2和3不写呢?

枚举类型是一种用户自定义的数据类型,在这里用于定义一组相关的常量。每个枚举常量都有一个整数值,它们的值按照声明的顺序递增,从1开始。在这里,GPIO_Speed_10MHZ 的值为1,GPIO_Speed_2MHZ 的值为2,GPIO_Speed_50MHZ 的值为3。也就是说配置了第一个值后,它后面的值都会依此类推加一。

枚举类型通常用于定义一组有限的可能取值,例如在这里用于表示GPIO的不同速度配置选项。使用枚举类型可以增加代码的可读性和可维护性,因为它将相关的常量组织在一起,并可以通过枚举名称来引用它们,而不需要记住每个常量的具体数值。

以下是Mode工作模式的枚举定义结构体

/*工作模式设置 枚举*/
typedef enum{
	GPIO_Mode_AIN = 0x0,					//(0000 0000)b
	GPIO_Mode_IN_FLOATING = 0x04,		    //(0000 0100)b
	GPIO_Mode_IPD = 0x28,					//(0010 1000)b
	GPIO_Mode_IPU = 0x48,					//(0100 1000)b
	
	GPIO_Mode_Out_OD = 0x14,				//(0001 0100)b
	GPIO_Mode_Out_PP = 0x10,				//(0001 0000)b
	GPIO_Mode_AF_OD = 0x1C,					//(0001 1100)b
	GPIO_Mode_AF_PP = 0x18,					// (0001 1000)b
	
}GPIOMode_TypeDef;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值