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);
校准流程:
- 检测
UART_BAUD_VALID_IRQ中断标志(波特率检测有效); - 读取偏差方向
uart_get_baud_dev_hl_state与偏差计数值uart_get_baud_dev_val; - 计算偏差百分比,若超出±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),下次上电可直接使用校准结果,无需重新扫描。