定义完位操作函数后,控制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_10MHZ
,GPIO_Speed_2MHZ
和 GPIO_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;