跳转至

SDK波特率校准功能说明


1. 概述

波特率校准功能用于解决CI14LP芯片使用内部RC作为时钟源时,因RC时钟精度(约±1%)不足导致UART通讯波特率偏差、主控与语音模块通讯异常的问题。开启该功能后,语音模块会自动测量主控发送数据的实际波特率,并动态调整UART波特率配置,保证通讯稳定。

源代码位于 system\baudrate_calibrate.c/.h。


2. 使能方式

波特率校准功能默认关闭,可通过 user_config.h 中的宏开启:

#define UART_BAUDRATE_CALIBRATE         1   //是否使能波特率校准功能

注意

  • 当板级配置使用内部RC(USE_EXT_OSC4M_PLL_SRC = 0)时,board.h会自动将 UART_BAUDRATE_CALIBRATE 强制置1;
  • 开启后,主控连续发包间隔必须大于1ms,否则可能丢包;
  • 波特率校准支持两种方式:硬件校准(baudrate_calibrate)与软件扫描校准(BAUDRATE_SCAN_EN)。

3. 硬件波特率校准

硬件方式利用UART外设自带的波特率检测功能(UART_BAUD_DTCT),在串口中断中调用 baudrate_calibrate 完成校准。

/* 执行一次波特率校准(在串口接收中断中调用) */
void baudrate_calibrate(UART_TypeDef *UARTx);

校准流程:

  1. 检测 UART_BAUD_VALID_IRQ 中断标志(波特率检测有效);
  2. 读取偏差方向 uart_get_baud_dev_hl_state 与偏差计数值 uart_get_baud_dev_val;
  3. 计算偏差百分比,若超出±1%(percent > 1.01f || percent < 0.99f)则计算新的波特率并调用 uart_interrupt_config(UARTx, new_bd) 重新配置。

4. 软件扫描校准(BAUDRATE_SCAN_EN)

软件扫描方式由语音模块主动向主控发送同步请求,主控回ACK后,模块按预设的波特率系数表(0.90 ~ 1.10,共11档)逐档尝试,找到通讯成功的最优档位。相关接口如下:

/* 波特率校准模块初始化函数 */
void baudrate_calibrate_init(UART_TypeDef *UARTx, uint32_t baudrate, send_sync_req_func_t send_sync_req_func);

/* 启动一次波特率校准 */
void baudrate_calibrate_start(void);

/* 如果正在进行波特率校准,停止这次波特率校准,下一次自动恢复 */
void baudrate_calibrate_stop(void);

/* 如果正在进行波特率校准,等到校准结束再返回 */
void baudrate_calibrate_wait_finish(void);

/* 语音协议模块收到同步ACK的时候,通过调用此接口告知已收到ACK */
void baudrate_calibrate_set_ack(void);

/* 设置波特率校准任务结束的标志 */
void set_baudrate_cali_close_flag(void);

/* 获取波特率校准任务是否结束的标志 */
uint8_t get_baudrate_cali_close_flag(void);

相关配置宏:

宏 说明
BAUDRATE_SCAN_EN 使能软件扫描校准(默认1)
BAUD_CALIBRATE_MAX_WAIT_TIME 单档等待ACK最大时间(默认60ms)
factors[] 波特率系数表:0.90、0.92、0.94、0.96、0.98、1.0、1.02、1.04、1.06、1.08、1.10

软件扫描校准状态机:BC_IDLE → BC_START → BC_SEND_REQ → BC_WAIT_ACK → BC_CHANGE_BAUDRATE → BC_CALC。


5. 使用示例

以2代串口协议(voice_module_uart_protocol_g2.c)为例,波特率校准与协议模块的联动:

/* 1. 协议模块初始化时注册同步请求发送函数 */
baudrate_calibrate_init(UART1, 9600, send_sync_req);

/* 2. 协议模块收到同步ACK后通知校准模块 */
void deal_sync_ack(void)
{
    baudrate_calibrate_set_ack();
}

/* 3. 串口接收中断中执行硬件校准 */
void uart1_irq_handler(void)
{
    baudrate_calibrate(UART1);
}

提示

  • 硬件校准与软件扫描校准可同时使能:软件扫描校准结束后(get_baudrate_cali_close_flag 为1),硬件校准才会生效;
  • 校准完成后,模块会将校准后的波特率写入NVDATA(write_ota_mcu_status),下次上电可直接使用校准结果,无需重新扫描。