RT-Thread论坛
直播中

李麒铭

8年用户 1498经验值
私信 关注
[问答]

使用ymodem_ota时如何更换串口?

现在使用串口1可以正常使用ymodem_ota进行固件升级,但是现在项目需要使用串口1来进行其他作用,求怎么把串口1更改为串口2进行ota升级?


回帖(1)

王玲

2025-10-10 17:36:07

要将 ymodem_ota 的串口从 UART1 切换到 UART2,需要修改代码中与串口相关的配置、初始化以及 ymodem_ota 的调用接口。以下是详细步骤:




步骤 1:修改串口配置


1.1 初始化 UART2


在代码中找到串口初始化部分(通常在 main.cuart.c),将 UART1 的配置复制并修改为 UART2:


// 原有 UART1 初始化(可能类似这样)
void MX_USART1_UART_Init(void) {
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  HAL_UART_Init(&huart1);
}

// 新增 UART2 初始化
UART_HandleTypeDef huart2; // 声明 UART2 句柄

void MX_USART2_UART_Init(void) {
  huart2.Instance = USART2;  // 关键:切换到 USART2 外设
  huart2.Init.BaudRate = 115200; // 波特率需与 OTA 要求一致
  // ... 其他参数与 UART1 相同 ...
  HAL_UART_Init(&huart2);
}

1.2 硬件引脚配置



  • stm32xxx_hal_msp.c 中修改引脚初始化,确保 UART2 的 TX/RX 引脚正确配置(例如 STM32F4 的 USART2 常用 PA2/PA3)。

  • 检查原理图并更新引脚复用:


void HAL_UART_MspInit(UART_HandleTypeDef* huart) {
  if (huart->Instance == USART2) { // 新增 UART2 的初始化
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_USART2_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART2; // 根据芯片型号调整
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  }
}



步骤 2:修改 ymodem_ota 调用接口


2.1 传入 UART2 句柄


在调用 OTA 升级函数的位置,将 huart1 替换为 huart2


// 原有调用(使用 UART1)
ymodem_ota(&huart1);

// 修改为使用 UART2
ymodem_ota(&huart2);

2.2 检查内部实现


确保 ymodem_ota() 函数内部未硬编码串口设备:


void ymodem_ota(UART_HandleTypeDef *huart) { // 必须传入句柄指针
  // 函数内部使用 huart->Instance 操作寄存器
  HAL_UART_Transmit(huart, data, len, timeout); // 正确使用传递的句柄
}

如果函数内部固定使用 huart1,需修改为动态传入参数。




步骤 3:处理中断(若使用中断)


3.1 更新中断向量



  • stm32xxx_it.c 中将 OTA 相关中断从 USART1_IRQHandler 改为 USART2_IRQHandler
    void USART2_IRQHandler(void) {
    HAL_UART_IRQHandler(&huart2); // 处理 UART2 中断
    }


3.2 启用 UART2 中断


在初始化中开启中断接收(如 HAL_UART_Receive_IT):


MX_USART2_UART_Init(); // 初始化 UART2
HAL_UART_Receive_IT(&huart2, rx_buf, len); // 启动接收中断



步骤 4:测试与验证



  1. 编译烧录:修改后重新编译代码并烧录到设备。

  2. 硬件连接:将 USB 转串口工具的 TX 接到 MCU 的 UART2_RXRX 接到 UART2_TX

  3. 启动 OTA:通过 UART2 发送 Ymodem 协议启动命令(通常发送 'C')。

  4. 传输固件:使用终端工具(如 Tera Term、SecureCRT)发送固件文件。




常见问题排查



  1. 无响应

    • 检查引脚连接是否正确(交叉连接 TX/RX)。

    • 测量波特率是否匹配(用示波器检查波形)。


  2. 收发乱码

    • 确认时钟源配置正确(如 HSI/PLL)。

    • 检查停止位、校验位是否与主机匹配。


  3. 中断未触发

    • HAL_NVIC_SetPriority() 中设置中断优先级。

    • 调用 HAL_NVIC_EnableIRQ(USART2_IRQn) 开启 IRQ。



通过以上步骤即可完成串口切换。如果涉及 RTOS 或多任务,确保 OTA 任务绑定到 UART2 的句柄,并关闭 UART1 相关的中断和 DMA 资源。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分