这段代码在STM32CubeMX中的具体配置每一步用STM32CubeMX中的词
时间: 2025-07-08 21:35:10 浏览: 3
以下是 **STM32CubeMX** 中配置 **STM32F103C8T6** 支持 **L298N 驱动模块** 和 **MG513 编码器**(左轮:PB3/PA15,右轮:PA6/PB7)的 **详细步骤**,结合 **USART1 串口通信** 和 **VOFA+ FireWater** 实时显示速度数据的完整流程。
---
## **1. STM32CubeMX 配置步骤**
### **(1) 新建项目并选择芯片**
1. 打开 **STM32CubeMX**,点击 **File → New Project**。
2. 在 **Part Number Search** 中输入 **STM32F103C8T6**,选择该芯片并点击 **Start Project**。
---
### **(2) 配置时钟(RCC)**
1. 在 **Pinout & Configuration** 选项卡下,确保 **HSE** 和 **LSE** 设置为 **Crystal/Ceramic Resonator**(如果使用外部晶振)。
2. 在 **Clock Configuration** 选项卡下:
- 选择 **HSE** 作为时钟源(8MHz)。
- 设置 **PLL** 倍频至 **72MHz**(STM32F103C8T6 最大主频)。
- 确保 **SYSCLK** = **72MHz**,**HCLK** = **72MHz**。
---
### **(3) 配置 GPIO(L298N 控制引脚)**
1. 在 **Pinout & Configuration** 选项卡下,找到 **PA0**、**PA1**、**PA2**、**PA3**(对应 L298N 的 IN1-IN4)。
2. 右键点击这些引脚,选择 **GPIO_Output**。
3. 在 **Configuration → GPIO** 中:
- 设置 **GPIO output level** 为 **Low**(默认关闭电机)。
- 确保 **Mode** = **Output Push Pull**,**Speed** = **Low**(避免高频干扰)。
---
### **(4) 配置编码器接口(TIM2 和 TIM3)**
#### **左轮编码器(TIM2)**
1. 在 **Pinout & Configuration** 选项卡下,找到 **PB3**(TIM2_CH2)和 **PA15**(TIM2_CH1)。
2. 右键点击 **PB3** 和 **PA15**,选择 **TIM2_CH2** 和 **TIM2_CH1**。
3. 在 **Configuration → TIM2** 中:
- 选择 **Encoder Mode** = **Encoder Mode TI1 and TI2**。
- **Counter Mode** = **Up**。
- **Prescaler** = **0**(无分频)。
- **Counter Period** = **0xFFFF**(16 位计数器)。
- **Filter** = **0**(无滤波)。
#### **右轮编码器(TIM3)**
1. 在 **Pinout & Configuration** 选项卡下,找到 **PA6**(TIM3_CH1)和 **PB7**(TIM3_CH2)。
2. 右键点击 **PA6** 和 **PB7**,选择 **TIM3_CH1** 和 **TIM3_CH2**。
3. 在 **Configuration → TIM3** 中:
- 选择 **Encoder Mode** = **Encoder Mode TI1 and TI2**。
- **Counter Mode** = **Up**。
- **Prescaler** = **0**(无分频)。
- **Counter Period** = **0xFFFF**(16 位计数器)。
- **Filter** = **0**(无滤波)。
---
### **(5) 配置串口(USART1)**
1. 在 **Pinout & Configuration** 选项卡下,找到 **PA9**(USART1_TX)和 **PA10**(USART1_RX)。
2. 右键点击 **PA9** 和 **PA10**,选择 **USART1_TX** 和 **USART1_RX**。
3. 在 **Configuration → USART1** 中:
- **Mode** = **Asynchronous**。
- **Baud Rate** = **115200**(与 VOFA+ 匹配)。
- **Word Length** = **8 Bits**。
- **Parity** = **None**。
- **Stop Bits** = **1**。
- **Hardware Flow Control** = **None**。
---
### **(6) 配置 NVIC(中断)**
1. 在 **Configuration → NVIC** 中:
- 启用 **USART1 global interrupt**(用于接收上位机指令)。
- 可选:启用 **TIM2 global interrupt** 和 **TIM3 global interrupt**(如果需要定时读取编码器数据)。
---
### **(7) 生成代码**
1. 点击 **Project → Generate Code**(或按 **Alt+K**)。
2. 选择 **Toolchain/IDE**(如 **MDK-ARM** 或 **STM32CubeIDE**)。
3. 点击 **OK** 生成代码。
---
## **2. 修改 `main.c` 实现功能**
在生成的代码基础上,补充以下逻辑:
### **(1) 全局变量定义**
```c
TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim3;
UART_HandleTypeDef huart1;
int32_t left_count = 0;
int32_t right_count = 0;
float left_speed = 0.0f;
float right_speed = 0.0f;
uint8_t rx_data;
```
### **(2) 初始化编码器和串口**
在 `main()` 中:
```c
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
HAL_UART_Receive_IT(&huart1, &rx_data, 1); // 启用串口接收中断
```
### **(3) 速度计算(在 `while(1)` 循环中)**
```c
left_count = (int32_t)TIM2->CNT;
right_count = (int32_t)TIM3->CNT;
static int32_t last_left_count = 0;
static int32_t last_right_count = 0;
left_speed = (float)(left_count - last_left_count) / 0.1f; // 100ms 间隔
right_speed = (float)(right_count - last_right_count) / 0.1f;
last_left_count = left_count;
last_right_count = right_count;
// 发送数据到 VOFA+
char buffer[50];
sprintf(buffer, "L:%.2f,R:%.2f\r\n", left_speed, right_speed);
HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY);
```
### **(4) 串口接收回调函数**
在 `stm32f1xx_it.c` 中添加:
```c
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart == &huart1) {
// 根据指令控制电机
switch (rx_data) {
case 'F': // 前进
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
break;
case 'B': // 后退
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
break;
case 'L': // 左转
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
break;
case 'R': // 右转
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
break;
case 'S': // 停止
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
break;
}
// 重新启用接收中断
HAL_UART_Receive_IT(&huart1, &rx_data, 1);
}
}
```
---
## **3. VOFA+ 配置**
1. 打开 **VOFA+**,选择 **FireWater** 引擎。
2. 设置串口参数(波特率 **115200**,8N1)。
3. 添加两个 **浮点数** 变量 `L` 和 `R`,解析字符串 `L:%f,R:%f`。
---
## **4. 相关问题**
1. **如何调整编码器计数方向?**
2. **如何使用 DMA 优化串口通信?**
3. **如何实现 PID 控制电机速度?**
4. **如何扩展多个编码器输入?**
5. **如何优化定时器中断优先级?**
阅读全文
相关推荐

















