)
一、结构体️ 1. 什么是结构体现实类比假设你要在淘宝上下单买一个手机。你需要告诉卖家哪些信息颜色白色内存256G型号iPhone 15你会发现“手机信息”包含了多个不同类型的数据颜色是字符串内存是数字。在C语言中如果你想用一个变量来表示“手机信息”普通的int或char都做不到因为太单一了。结构体struct就是为此诞生的——它允许你把多个不同类型的数据打包在一起形成一个新的自定义数据类型。 2. 结构体的“骨骼”定义在STM32的库文件如stm32f10x_gpio.h里早就定义好了一个叫GPIO_InitTypeDef的结构体“模板”。它的内部大概是这样的typedef struct { uint16_t GPIO_Pin; // 你要用哪个引脚比如 Pin_0 GPIOSpeed_TypeDef GPIO_Speed; // 速度要多少比如 50MHz GPIOMode_TypeDef GPIO_Mode; // 模式是什么比如 推挽输出 } GPIO_InitTypeDef;小白理解这就好比淘宝后台定义了一个“手机信息模板”规定了必须填“颜色”、“内存”、“型号”这三项。 3. 你在代码中怎么用它填写清单当你写下GPIO_InitTypeDef GPIO_InitStructure; // 第1步领一张空白表格这句代码的意思就是用GPIO_InitTypeDef这个模板创建一张名为GPIO_InitStructure的实体表格。有了这张空白表格接下来你就要往里面填内容了。怎么填用英文句号.成员运算符GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; // 在“引脚”一栏填上 Pin_0 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; // 在“速度”一栏填上 50MHz GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; // 在“模式”一栏填上 推挽输出小白注意填写时等号右边的值如GPIO_Pin_0是芯片厂家在库中提前定义好的“选项”你不能自己随便写数字只能从给定的选项里选。 4. 把填好的表交给谁函数调用填好表之后如果不拿去用这张表就是废纸。所以你需要把它交给执行部门也就是GPIO_Init函数GPIO_Init(GPIOA, GPIO_InitStructure);这里需要特别解释一下取地址符函数要求传入的是GPIO_InitStructure表格所在的门牌号/地址而不是把整张表格复印一份交过去。执行部门GPIO_Init拿着这个门牌号直接去内存里找到你填好的那张表看一眼然后就把硬件GPIO引脚按照表上的要求配置好了。 5. 为什么STM32要用结构体两个核心好处参数少代码清爽如果没有结构体配置一个GPIO可能需要写成GPIO_Init(GPIOA, Pin_0, 50MHz, Out_PP);4个参数。如果以后要配置更复杂的串口需要七八个参数参数列表会变得极其臃肿且容易搞错顺序。用结构体打包后无论里面有多少项函数永远只要传2个参数哪个GPIO以及结构体的地址。可读性强见名知意看到GPIO_Mode GPIO_Mode_Out_PP哪怕不懂C语言也能猜到这是在设置“输出推挽模式”。如果你传裸数字Mode 0x10外人根本看不懂后期维护会疯掉。 6. 一眼看穿其他常见结构体在你的代码中Delay.h可能不是结构体但当你学串口USART时你会看到USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate 115200; USART_InitStructure.USART_WordLength USART_WordLength_8b; // ... 等等套路完全一样定义变量 - 点出成员赋值 - 取地址传给初始化函数。 总结记忆口诀结构体是个大礼包里面啥都能装点号.进去填选项取址交给库函数搞。