GPIO_InitTypeDef GPIO_InitStructure;与GPIO_InitTypeDef GPIO_InitStruct = {0};的区别
时间: 2024-03-07 13:51:29 浏览: 136
这两个语句的区别在于对GPIO_InitTypeDef结构体的初始化方式不同。
第一个语句:GPIO_InitTypeDef GPIO_InitStructure; 只是定义了一个GPIO_InitTypeDef类型的结构体变量GPIO_InitStructure,并没有对其进行初始化,即结构体中的各个成员变量的值是不确定的,需要在后续代码中对其进行赋值和初始化。
第二个语句:GPIO_InitTypeDef GPIO_InitStruct = {0}; 定义了一个GPIO_InitTypeDef类型的结构体变量GPIO_InitStruct,并将结构体中的所有成员变量的值都初始化为0。这种方式可以避免在后续代码中对结构体成员变量的值进行赋值,省去了一些代码。
因此,第二种方式更加方便和快捷,尤其是在初始化比较复杂的结构体时,可以直接使用该方式进行初始化。
相关问题
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_Init(GPIOB, &GPIO_InitStructure);的hal库写法
以下是使用HAL库的代码示例,用于初始化GPIOB的引脚8和引脚9为开漏输出模式,并设置引脚速度为50MHz:
```c
/* 使能GPIOB的时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/* 定义GPIO初始化结构体 */
GPIO_InitTypeDef GPIO_InitStructure;
/* 配置引脚8 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
/* 配置引脚9 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
```
在上述示例中,首先使用`RCC_APB2PeriphClockCmd`函数使能GPIOB的时钟。然后,定义一个`GPIO_InitTypeDef`结构体`GPIO_InitStructure`来配置GPIO引脚的初始化参数。接下来,设置引脚8和引脚9的初始化参数,并使用`HAL_GPIO_Init`函数初始化这两个引脚。
注意,上述代码假设你已经包含了相关的头文件,并且已经正确配置了系统时钟。
void Serial_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 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; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_Init(USART1, &USART_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NVIC_InitStructure); USART_Cmd(USART1, ENABLE); }
这段代码是用来初始化串口通信的,使用的是STM32微控制器的相关代码。下面是对代码的逐行解读:
1. `RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);` 和 `RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);`:这两行代码用于使能USART1和GPIOA的时钟,以便后续使用。
2. `GPIO_InitTypeDef GPIO_InitStructure;`:定义一个GPIO初始化结构体变量。
3. `GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;` 和 `GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;`:这两行代码分别设置GPIO引脚的工作模式为复用推挽输出(Alternate Function Push-Pull)和带上拉输入(Input Pull-Up)。
4. `GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;` 和 `GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;`:这两行代码分别设置GPIO引脚的编号,用于指定串口通信的引脚连接。
5. `GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;`:设置GPIO引脚的速度为50MHz。
6. `GPIO_Init(GPIOA, &GPIO_InitStructure);`:根据上述配置初始化GPIOA引脚。
7. `USART_InitTypeDef USART_InitStructure;`:定义一个串口初始化结构体变量。
8. `USART_InitStructure.USART_BaudRate = 9600;`:设置串口通信的波特率为9600。
9. `USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;`:设置串口硬件流控制为无。
10. `USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;`:设置串口通信的模式为同时支持发送和接收。
11. `USART_InitStructure.USART_Parity = USART_Parity_No;`:设置串口通信的奇偶校验位为无。
12. `USART_InitStructure.USART_StopBits = USART_StopBits_1;`:设置串口通信的停止位为1位。
13. `USART_InitStructure.USART_WordLength = USART_WordLength_8b;`:设置串口通信的数据位长度为8位。
14. `USART_Init(USART1, &USART_InitStructure);`:根据上述配置初始化USART1串口。
15. `USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);`:使能USART1的接收中断。
16. `NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);`:设置NVIC(Nested Vectored Interrupt Controller)的优先级分组。
17. `NVIC_InitTypeDef NVIC_InitStructure;`:定义一个NVIC初始化结构体变量。
18. `NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;`:设置中断通道为USART1。
19. `NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;`:使能中断通道。
20. `NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;` 和 `NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;`:这两行代码分别设置中断优先级组和子优先级。
21. `NVIC_Init(&NVIC_InitStructure);`:根据上述配置初始化NVIC。
22. `USART_Cmd(USART1, ENABLE);`:使能USART1串口。
综上所述,这段代码是用来初始化USART1串口通信,并配置相关的引脚、中断和参数设置。具体的实现细节可能需要参考相关的STM32芯片手册或外设库文档。如果你有更多关于这段代码的问题,请提问!
阅读全文