void GPIO_int(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* USER CODE BEGIN MX_GPIO_Init_1 */ /* USER CODE END MX_GPIO_Init_1 */ /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET); /*Configure GPIO pin : PA2 */ GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO CAN pin : PB8、PB9 */ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Pin = CAN1_RX|CAN1_TX; GPIO_InitStruct.Alternate=GPIO_AF9_CAN1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO PWM pin : PA8、PA9、PA10 */ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Pin = TIM_CH1|TIM_CH2|TIM_CH3; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO PWM pin : PB13、PB14、PB15 */ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Pin = TIM_CH1N|TIM_CH2N|TIM_CH3N; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO ADC pin : PC0、PC1、PC2、PC5 */ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pin = ADC_PhU|ADC_PhV|ADC_PhW|ADC_DCBus; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /*Configure GPIO ADC pin : PB0、PB1 */ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pin = ADC_Temp_MOS|ADC_Temp_MOTOR; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO AS5048A pin : PB3、PB5 */ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Pin = SCK3|MOSI3; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = SPI3_Alternate; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO AS5048A pin : PB4 */ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pin = MISO3; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = SPI3_Alternate; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO AS5048A pin : PA15 */ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Pin = NSS3; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); AS5048A_CS_HIGH; /*Configure GPIO TLE5012B pin : PA5、PA7 */ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Pin = SCK1|MOSI1; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = SPI1_Alternate; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO TLE5012B pin : PA6 */ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pin = MISO1; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = SPI1_Alternate; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO TLE5012B pin : PA4 */ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Pin = NSS1; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); TLE5012B_CS_HIGH; /*Configure GPIO TLE5012B pin : PA4 */ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Pin = RS485_DIR; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); }
时间: 2025-07-01 20:04:04 浏览: 13
你提供的代码是一个典型的 **STM32 HAL 库中的 GPIO 初始化函数**,用于配置多个引脚为不同的功能(如输出、模拟输入、复用推挽等)。下面我们将逐段分析其作用,并解释为什么这样写。
---
## ✅ 问题回答:
这段代码 `void GPIO_int(void)` 的主要目的是初始化多个 GPIO 引脚,以便它们可以用于不同的外设和功能,例如 PWM 输出、ADC 输入、SPI 接口、CAN 总线等。这是嵌入式开发中非常常见的做法,尤其是在使用 STM32 系列微控制器时。
---
## 🔍 代码详解:
### 1. 定义 GPIO 初始化结构体
```c
GPIO_InitTypeDef GPIO_InitStruct = {0};
```
- 初始化一个 `GPIO_InitTypeDef` 类型的结构体变量 `GPIO_InitStruct`,用于存储当前要配置的 GPIO 引脚参数。
- `{0}` 表示清空结构体所有字段,防止未初始化的数据影响配置。
---
### 2. 启动各 GPIO 端口的时钟
```c
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
```
- 这些宏定义启用各个 GPIO 端口的时钟,否则无法对相应端口进行操作。
- 在 STM32 中,每个外设都需要先开启对应的时钟才能使用。
---
### 3. 设置初始输出电平
```c
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
...
```
- 设置某些 GPIO 引脚的初始状态为低电平(RESET)或高电平(SET),确保上电后处于安全状态。
- 常用于控制 LED、使能信号、方向控制等。
---
### 4. 配置单个 GPIO 引脚(PA2)
```c
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
```
- PA2 被设置为 **推挽输出模式**,带内部上拉电阻,速度为最高频率。
- 适用于需要快速切换的数字输出场景。
---
### 5. 配置 CAN 引脚(PB8, PB9)
```c
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Alternate=GPIO_AF9_CAN1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
```
- 设置为 **复用推挽模式(Alternate Function Push-Pull)**。
- 使用 `GPIO_AF9_CAN1` 表示该引脚连接到 CAN1 外设。
- 用于 CAN 总线通信。
---
### 6. 配置 PWM 输出引脚(PA8~PA10,PB13~PB15)
```c
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pin = TIM_CH1|TIM_CH2|TIM_CH3;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
```
- 设置为推挽输出模式,用于输出 PWM 波形。
- 通常这些引脚连接到定时器通道(TIMx_CHy)来产生 PWM 信号。
---
### 7. 配置 ADC 模拟输入引脚(PC0, PC1, PC2, PC5;PB0, PB1)
```c
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
```
- 设置为模拟输入模式,用于采集电压信号。
- 不使用上下拉电阻,以避免干扰模拟信号。
---
### 8. 配置 SPI3 引脚(PB3, PB4, PB5)
```c
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Alternate = SPI3_Alternate;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
```
- 使用复用推挽模式,连接到 SPI3 外设。
- SCK、MOSI、MISO 分别对应 SPI 的时钟、主出从入、主入从出信号。
---
### 9. 配置 AS5048A 和 TLE5012B 编码器的 CS 引脚(PA15, PA4)
```c
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
```
- CS(片选)引脚通常为低电平有效,这里默认设置为高电平(非选中状态)。
- `AS5048A_CS_HIGH;` 是一个宏定义,表示将 CS 引脚置高。
---
### 10. 配置 RS485 方向控制引脚(PA4)
```c
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Pin = RS485_DIR;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
```
- 控制 RS485 收发方向,通常通过高低电平切换发送/接收模式。
---
## 📌 总结
这段代码完成了以下任务:
- 开启各个 GPIO 端口的时钟;
- 设置多个 GPIO 引脚为不同工作模式(输出、模拟、复用推挽);
- 配置了 CAN、PWM、ADC、SPI 等外设相关的引脚;
- 对部分引脚设置了初始电平,确保系统启动稳定。
---
##
阅读全文
相关推荐



















