目录
一、数据类型
二、C语言宏定义
三、C语言typedef重命名
四、 #define与typedef的区别
五、结构体
六、枚举变量
补充学习一点STM32的必备基础知识
一、数据类型
二、C语言宏定义
关键字:#define
- 用途:用一个字符串代替一个数字,便于理解,防止出错;提取程序中经常出现的参数,便于快速修改
- 定义宏定义: #define ABC 12345
- 引用宏定义: int a = ABC; //等效于int a = 12345;
三、C语言typedef重命名
关键字:typedef
- 用途:将一个比较长的变量类型名换个名字,便于使用
- 定义typedef: typedef unsigned char uint8_t;
- 引用typedef: uint8_t a; //等效于unsigned char a;
四、 #define与typedef的区别
- typedef最后加分号,#define 不用加
- typedef新名字在右边,#define 新名字在左边
- 宏定义任何名字都可以换,typedef只能替换变量类型
- 宏定义无脑改名,范围更宽,typedef重命名变量类型更安全
- 重命名是增加了一个新名字,原来的名字仍然可以继续使用
unsigned char a; uint_t a; u8 a; 都可以
五、结构体
关键字:struct
- 用途:数据打包,不同类型变量的集合
- 定义结构体变量: struct{char x; int y; float z;} c;
- struct是声明结构体类型,花括号中间是要打包的变量类型,最后是结构体名,最后加分号
- 结构体的引用:
c.x = 'a'; //c.x调用这个结构体
c.y = 1;
c.z = 6.66;
- 因为结构体变量类型较长,所以通常用typedef更改变量类型名引用结构体成员
- typedef struct{char x;int y;float z;} StructName //把这个结构体重命名为 StructName
下次定义结构体: 比如StructName GPIO_Init; //结构体数据类型 结构体变量名称
GPIO_Init是声明结构体名称,用 点 引出元素
为了形式美观好看,常见结构体格式如下
typedef struct{
char x; //数据类型
int y;
float z;
} StructName; //最后是结构体数据类型
直接用结构体变量名 用 点 引出数据
引出结构体成员的第二种方式
pStructName -> x = 'A'; //用地址的方式引出结构体成员
举例说明:
typedef struct
{
uint16_t GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;
在结构体中声明所需要的变量类型以及变量,进行打包
然后重新起名字,调用
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Speed 和 GPIO_Mode又用到了枚举变量
六、枚举变量
关键字:enum
用于定义一个取值受限制的整型变量,用于限制变量的取值范围
定义枚举变量 举例 enum{MONDAY = 1,TUESDAY = 2;WEDNESDAY = 3} week;
中间用逗号,后边的week是变量,本变量取值范围在1-3(花括号内的值)
typedef改名:
typedef enum{
MONDAY = 1,
TUESDAY = 2,
WEDNESDAY = 3
}week_t; //week_t是变量类型名
再定义枚举变量 week_t week;
week = MONDAY ; //只能按照定义类型 来赋值
枚举值也可以赋值给别的变量
结构体中提到了 GPIO_Speed 和 GPIO_Mode,它们都是枚举变量
typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
typedef enum
{ GPIO_Mode_AIN = 0x0,
GPIO_Mode_IN_FLOATING = 0x04,
GPIO_Mode_IPD = 0x28,
GPIO_Mode_IPU = 0x48,
GPIO_Mode_Out_OD = 0x14,
GPIO_Mode_Out_PP = 0x10,
GPIO_Mode_AF_OD = 0x1C,
GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;