一、驱动分层架构
串口驱动分为底层寄存器驱动 ry_uart0_drv 与上层HAL封装驱动 uart0_hal_drv,HAL层封装批量收发、软件环形接收缓冲区,简化业务层调用,规避中断单字节接收丢帧问题。
二、UART0 HAL初始化函数
1 | void uart0_hal_init(void); |
| 参数名称 | 单位 | 参数说明 | 含义说明 |
|---|---|---|---|
| 无 | - | 无入参 | 开启 UART0 外设时钟、配置引脚复用、初始化波特率 / 数据位 / 校验位、使能收发硬件中断 |
| 返回值 | - | 无返回值 | 无 |
波特率、串口帧格式固定在底层驱动头文件,如需修改串口参数需要编辑
ry_uart0_drv.h。
三、批量阻塞发送数据
1 | void uart0_hal_send_data(uint32 buff_ptr, uint32 size); |
| 参数名称 | 单位 | 参数说明 | 含义说明 |
|---|---|---|---|
| buff_ptr | 地址值 | 发送缓冲区起始地址 | 必须强制转换为uint32_t类型传入,不可直接传递指针 |
| size | Byte | 待发送字节总数 | 单次发送长度仅受内存大小限制,无硬件上限 |
| 返回值 | - | 无返回值 | 函数内部阻塞等待整包数据发送完毕后退出 |
四、接收环形缓冲区初始化(接收前必须调用)
1 | int32 uart0_hal_recv_ring_buff_init(uint8* buffer, uint32 size); |
| 参数名称 | 单位 | 参数说明 | 含义说明 |
|---|---|---|---|
| buffer | 指针 | 上层自定义数组首地址 | 驱动不申请堆内存,内存完全由用户程序提供 |
| size | Byte | 环形缓冲区总字节长度 | 推荐取值 16~256,根据通信帧长度按需设置 |
| 返回值 | int32_t | 初始化结果 | ≥0:初始化成功 <0:入参空指针,初始化失败 |
五、清空接收环形缓冲区
1 | void uart0_hal_recv_ring_reset(void); |
| 参数名称 | 单位 | 参数说明 | 含义说明 |
|---|---|---|---|
| 无 | - | 无入参 | 重置环形缓冲区读写指针,丢弃所有未读取的接收数据 |
| 返回值 | - | 无返回值 | 无 |
六、同步硬件接收数据至软件环形缓存
1 | int32 uart0_hal_update_recv_buff(void); |
| 参数名称 | 单位 | 参数说明 | 含义说明 |
|---|---|---|---|
| 无 | - | 无入参 | 读取 UART 硬件接收寄存器内缓存字节,存入软件 FIFO 队列 |
| 返回值 | int32_t | 本次搬运数据长度 | ≥0:成功搬运字节数 <0:缓存异常或无新接收数据 |
注意:硬件中断仅锁存单字节,不会自动存入软件缓冲区,必须主动调用该接口同步数据,否则无法读取串口接收内容。
七、从环形缓冲区读取接收数据
1 | int32 uart0_hal_read_recv_buff(uint8* read_buff, uint32 size); |
| 参数名称 | 单位 | 参数说明 | 含义说明 |
|---|---|---|---|
| read_buff | 指针 | 数据读出存储数组 | 用于存放从 FIFO 中取出的串口数据 |
| size | Byte | 期望读取最大字节数 | 实际读取数量不会超过该参数 |
| 返回值 | int32_t | 实际读取字节数量 | ≥0:成功读取字节长度 <0:缓冲区无有效数据或参数非法 |
补充使用规范与已知注意事项
初始化强制顺序
必须先执行system_clk_init()完成系统时钟配置,再调用uart0_hal_init();时钟未就绪初始化串口会导致外设工作异常,程序上电卡死复位入口。printf 输出兼容
工程定义宏PRINT_UART0后,标准库printf会自动重定向至 UART0 发送通道,不可与uart0_hal_send_data同时混用造成数据冲突。调用场景限制
uart0_hal_update_recv_buff与读取接口禁止在中断服务函数内调用,避免环形缓冲区读写指针并发错乱,建议在主循环轮询执行。溢出丢包说明
环形缓冲区存满后新接收字节会直接丢弃,业务层需要定时读取缓冲区,防止数据溢出丢失。
最简可直接运行示例代码
1 | // 1. 全局定义接收缓存 |