APP UART驱动
宏定义
TX_ONCE_MAX_SIZE
| 描述 | 值 |
|---|---|
| 定义一次传输的最大字节数 |
128 说明:
|
结构体
app_uart_pin_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| app_io_type_t type |
设置IO类型 |
参考app_io_evt_t中描述 |
| app_io_mux_t mux |
IO映射功能配置 |
参考app_io_init_t结构体,具体映射模式参考芯片Datasheet中的Pin Mux |
| uint32_t pin |
选择IO引脚 |
参考app_io_init_t结构体,具体根据芯片Datasheet中UART资源进行选择 |
| app_io_pull_t pull |
设置IO上拉/下拉/浮空 |
参考app_io_init_t结构体 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_uart.h。
app_uart_pin_cfg_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| app_uart_pin_t tx |
UART_TX引脚配置 |
参考app_uart_pin_t结构体 |
| app_uart_pin_t rx |
UART_RX引脚配置 |
参考app_uart_pin_t结构体 |
| app_uart_pin_t cts |
UART_CTS引脚配置 |
参考app_uart_pin_t结构体 |
| app_uart_pin_t rts |
UART_RTS引脚配置 |
参考app_uart_pin_t结构体 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_uart.h。
app_uart_dma_cfg_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| dma_reg_t *tx_dma_instance |
UART_TX指定DMA模块配置 |
该参数的取值可以是下列值中的任意一个:
具体选择参考app_dma_params_t章节中,DMA支持的外设。 |
| dma_reg_t *rx_dma_instance |
UART_RX指定DMA模块配置 |
该参数的取值可以是下列值中的任意一个:
具体选择参考app_dma_params_t章节中,DMA支持的外设。 |
| dma_channel_t tx_dma_channel |
UART_TX的DMA通道选择 |
参考app_dma_params_t中通道描述 |
| dma_channel_t rx_dma_channel |
UART_RX的DMA通道选择 |
参考app_dma_params_t中通道描述 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_uart.h。
app_uart_params_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| app_uart_id_t id |
设置使用的UART模块ID |
|
| app_uart_pin_cfg_t pin_cfg |
UART引脚功能设置 |
参考app_uart_pin_cfg_t结构体 |
| app_uart_dma_cfg_t dma_cfg |
UART DMA传输参数配置 |
参考app_uart_dma_cfg_t结构体 |
| uart_init_t init |
UART初始化参数配置 |
参考uart_init_t结构体 |
| uart_env_t uart_dev |
保存相关数据和句柄,不需要用户配置 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_uart.h。
uart_init_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| uint32_t baud_rate |
波特率 |
0~4000000(默认115200),最大支持波特率请参考对应芯片Datasheet手册。 |
| uint32_t data_bits |
数据位 |
该参数的取值可以是下列值中的任意一个 :
|
| uint32_t stop_bits |
停止位 |
该参数的取值可以是下列值中的任意一个 :
|
| uint32_t parity |
奇偶校验位 |
该参数的取值可以是下列值中的任意一个 :
|
| uint32_t hw_flow_ctrl |
硬件流控使能位 |
该参数的取值可以是下列值中的任意一个 :
|
| uint32_t rx_timeout_mode |
接收超时使能位 |
该参数的取值可以是下列值中的任意一个 :
|
- GR551x/GR5526/GR5x25:SDK_Folder\drivers\inc\hal\gr55xx_hal_uart.h
- GR533x:SDK_Folder\drivers\inc\hal\gr533x_hal_uart.h
- GR5405:SDK_Folder\hal_drv\include\hal_uart.h
app_uart_evt_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| app_uart_evt_type_t type |
串口事件类型 |
该参数的取值可以是下列值中的任意一个:
|
| union { uint32_t error_code; unt16_t size; }data; |
说明: 若事件类型为传输错误,此处返回错误串口引脚;若事件类型为接收/发送完成,此处显示已接收/发送的数据长度 |
串口错误号:
|
详细信息请参考文件:SDK_Folder\drivers\inc\app_uart.h。
app_uart_tx_buf_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| uint8_t* tx_buf |
串口发送缓存 |
串口发送缓存的地址 |
| uint32_t tx_buf_size |
串口发送缓存大小 |
发送缓存的大小 |
在串口的异步发送中,为了方便用户可以连续调用异步接口,使用环形缓存区缓存数据。上一次发送完成后自动从环形缓冲区取出数据,存放在tx_send_buf中。TX_ONCE_MAX_SIZE为tx_send_buf大小。
详细信息请参考文件:SDK_Folder\drivers\inc\app_uart.h。
枚举
app_uart_id_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
| APP_UART_ID_0 = 0 |
UART模块0 |
| APP_UART_ID_1 = 1 |
UART模块1 |
| APP_UART_ID_2 = 2 |
UART模块2,仅适用于GR5526、GR5x25 |
| APP_UART_ID_3 = 3 |
UART模块3,仅适用于GR5526、GR5x25 |
| APP_UART_ID_4 = 4 |
UART模块4,仅适用于GR5526 |
| APP_UART_ID_5 = 5 |
UART模块5,仅适用于GR5526 |
| APP_UART_ID_MAX = 6 |
UART模块总个数,用作参数检测 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_uart.h。
app_uart_evt_type_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
| APP_UART_EVT_ERROR |
UART传输错误事件 |
| APP_UART_EVT_TX_CPLT |
UART发送完成事件 |
| APP_UART_EVT_RX_DATA |
UART接收完成事件 |
| APP_UART_EVT_ABORT_TX |
UART发送中止事件 |
| APP_UART_EVT_ABORT_RX |
UART接收中止事件 |
| APP_UART_EVT_ABORT_TXRX | UART发送和接收中止事件 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_uart.h。
app_uart_dma_state_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
| APP_UART_DMA_INVALID = 0 | UART DMA不可用 |
| APP_UART_DMA_ACTIVITY | UART DMA激活 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_uart.h。
app_uart_state_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
| APP_UART_INVALID = 0 |
UART不可用 |
| APP_UART_ACTIVITY |
UART激活 |
| APP_UART_SLEEP |
UART睡眠 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_uart.h。
接口函数
| API | 芯片 | ||||
|---|---|---|---|---|---|
| GR551x | GR5526 | GR5x25 | GR533x | GR5405 | |
| app_uart_init |
Y |
Y |
Y |
Y |
Y |
| app_uart_deinit |
Y |
Y |
Y |
Y |
Y |
| app_uart_transmit_async |
Y |
Y |
Y |
Y |
Y |
| app_uart_transmit_sync |
Y |
Y |
Y |
Y |
Y |
| app_uart_receive_async |
Y |
Y |
Y |
Y |
Y |
| app_uart_receive_sync |
Y |
Y |
Y |
Y |
Y |
| app_uart_flush |
Y |
Y |
Y |
Y |
Y |
| app_uart_abort |
Y |
Y |
Y |
Y |
Y |
| app_uart_abort_transmit |
Y |
Y |
Y |
Y |
Y |
| app_uart_abort_receive |
Y |
Y |
Y |
Y |
Y |
| app_uart_get_handle |
Y |
Y |
Y |
Y |
Y |
app_uart_init
| 函数原型 | uint16_t app_uart_init(app_uart_params_t *p_params, app_uart_evt_handler_t evt_handler, app_uart_tx_buf_t *tx_buffer) |
|---|---|
| 功能说明 | 初始化UART |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 回调函数形式参照typedef void (*app_uart_evt_handler_t)(app_uart_evt_t *p_evt); 注意轮询运行模式下可以不指定中断回调函数(即evt_handler的入参可为NULL);且一次发送的数据量不应超过app_uart_tx_buf_t中定义的缓存大小; HAL层已经实现中断标志位的清理,用户不用关心中断标志的清理,回调函数根据返回事件类型进行相应的处理即可。 |
app_uart_deinit
| 函数原型 | uint16_t app_uart_deinit(app_uart_id_t id) |
|---|---|
| 功能说明 | 反初始化UART |
| 输入参数 | id:UART模块ID(见app_uart_id_t描述) |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_uart_transmit_async
| 函数原型 | uint16_t app_uart_transmit_async(app_uart_id_t id, uint8_t *p_data, uint16_t size) |
|---|---|
| 功能说明 | 串口中断方式(异步)发送数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_uart_transmit_sync
| 函数原型 | uint16_t app_uart_transmit_sync(app_uart_id_t id, uint8_t *p_data, uint16_t size, uint32_t timeout) |
|---|---|
| 功能说明 | 串口轮询方式(同步)发送数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_uart_receive_async
| 函数原型 | uint16_t app_uart_receive_async(app_uart_id_t id, uint8_t *p_data, uint16_t size) |
|---|---|
| 功能说明 | 串口中断方式(异步)接收数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_uart_receive_sync
| 函数原型 | uint16_t app_uart_receive_sync(app_uart_id_t id, uint8_t *p_data, uint16_t size, uint32_t timeout) |
|---|---|
| 功能说明 | 串口轮询方式(同步)接收数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_uart_flush
| 函数原型 | void app_uart_flush(app_uart_id_t id) |
|---|---|
| 功能说明 | 立即发送TX FIFO中的数据。 该功能通常用于系统进入睡眠模式之前。当数据未全部发送完成时,需立即将TX FIFO中的数据发送出去。 |
| 输入参数 | id:UART模块ID(见app_uart_id_t描述) |
| 返回值 | 无 |
| 备注 |
app_uart_abort
| 函数原型 | uint16_t app_uart_abort(app_uart_id_t id) |
|---|---|
| 功能说明 | 中止串口的数据发送和接收,会产生abort中断,调用注册的回调函数,事件类型为APP_UART_EVT_ABORT_TXRX |
| 输入参数 | id:UART模块ID(见app_uart_id_t描述) |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_uart_abort_transmit
| 函数原型 | uint16_t app_uart_abort_transmit(app_uart_id_t id) |
|---|---|
| 功能说明 | 中止串口的数据发送,会产生abort中断,调用注册的回调函数,事件类型为APP_UART_EVT_ABORT_TX |
| 输入参数 | id:UART模块ID(见app_uart_id_t描述) |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_uart_abort_receive
| 函数原型 | uint16_t app_uart_abort_receive(app_uart_id_t id) |
|---|---|
| 功能说明 | 中止串口的数据接收,会产生abort中断,调用注册的回调函数,事件类型为APP_UART_EVT_ABORT_RX |
| 输入参数 | id:UART模块ID(见app_uart_id_t描述) |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_uart_get_handle
| 函数原型 | uart_handle_t *app_uart_get_handle(app_uart_id_t id) |
|---|---|
| 功能说明 | 获取串口句柄 |
| 输入参数 | id:UART模块ID(见app_uart_id_t描述) |
| 返回值 | 串口句柄指针 |
| 备注 |
DMA接口函数
| API | 芯片 | ||||
|---|---|---|---|---|---|
| GR551x | GR5526 | GR5x25 | GR533x | GR5405 | |
| app_uart_dma_init |
Y |
Y |
Y |
Y |
Y |
| app_uart_dma_deinit |
Y |
Y |
Y |
Y |
Y |
| app_uart_dma_transmit_async |
Y |
Y |
Y |
Y |
Y |
| app_uart_dma_receive_async |
Y |
Y |
Y |
Y |
Y |
| app_uart_transmit_dma_sg_llp |
N |
Y |
Y |
N |
N |
| app_uart_receive_dma_sg_llp |
N |
Y |
Y |
N |
N |
app_uart_dma_init
| 函数原型 | uint16_t app_uart_dma_init(app_uart_params_t *p_params) |
|---|---|
| 功能说明 | 初始化UART DMA传输 |
| 输入参数 | p_params:初始化参数的结构体指针 |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_uart_dma_deinit
| 函数原型 | uint16_t app_uart_dma_deinit(app_uart_id_t id) |
|---|---|
| 功能说明 | 反初始化UART DMA传输 |
| 输入参数 | id:UART模块ID(见app_uart_id_t描述) |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_uart_dma_transmit_async
| 函数原型 | uint16_t app_uart_dma_transmit_async(app_uart_id_t id, uint8_t *p_data, uint16_t size) |
|---|---|
| 功能说明 | 串口DMA方式(异步)发送数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_uart_dma_receive_async
| 函数原型 | uint16_t app_uart_dma_receive_async(app_uart_id_t id, uint8_t *p_data, uint16_t size) |
|---|---|
| 功能说明 | 串口DMA方式(异步)接收数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_uart_transmit_dma_sg_llp
| 函数原型 | uint16_t app_uart_transmit_dma_sg_llp(app_uart_id_t id, uint8_t *p_data, uint16_t size, dma_sg_llp_config_t *sg_llp_config) |
|---|---|
| 功能说明 | 串口以DMA方式发送数据,支持scatter(分散)、gather(聚合)和llp(链表)特性,用于不连续内存之间的数据传输,以及使用链表传输提高单次传输的字节数 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_uart_receive_dma_sg_llp
| 函数原型 | uint16_t app_uart_receive_dma_sg_llp(app_uart_id_t id, uint8_t *p_data, uint16_t size, dma_sg_llp_config_t *sg_llp_config) |
|---|---|
| 功能说明 | 串口以DMA方式接收数据,支持scatter(分散)、gather(聚合)和llp(链表)特性,用于不连续内存之间的数据传输,以及使用链表传输提高单次传输的字节数 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
示例工程
UART Interrupt
示例工程实现UART以中断方式收发数据,工程路径:SDK_Folder\projects\peripheral\uart\app_uart。
流程图
串口调试助手和开发板通过UART进行通信。开发板向串口发送提示数据,告知用户需要传输数据,开发板处于接收数据等待状态;当用户通过串口调试助手发送数据时,开发板接收发送的数据,并将其发送到串口进行显示。
初始化参数
初始化参数如下:
app_uart_params_t uart_params = {
.id = UART_ID,
.pin_cfg = {
.tx = {
.type = APP_UART_TX_IO_TYPE,
.mux = APP_UART_TX_PINMUX,
.pin = APP_UART_TX_PIN,
.pull = APP_IO_PULLUP,
},
.rx = {
.type = APP_UART_RX_IO_TYPE,
.mux = APP_UART_RX_PINMUX,
.pin = APP_UART_RX_PIN,
.pull = APP_IO_PULLUP,
},
},
.init = {
.baud_rate = 115200,
.data_bits = UART_DATABITS_8,
.stop_bits = UART_STOPBITS_1,
.parity = UART_PARITY_NONE,
.hw_flow_ctrl = UART_HWCONTROL_NONE,
.rx_timeout_mode = UART_RECEIVER_TIMEOUT_ENABLE,
},
};
- id:定义串口ID
APP_UART_ID可以为APP_UART_ID_0、APP_UART_ID_1、APP_UART_ID_2、APP_UART_ID_3、APP_UART_ID_4、APP_UART_ID_5,具体选择请参考board_SK.h,例如GR5526中APP_UART_ID为APP_UART_ID_3。
#define APP_UART_ID APP_UART_ID_3 -
pin_cfg:配置串口读写引脚
主要配置IO类型、复用MUX模式、使用的引脚和上下拉模式,具体参数定义请参考board_SK.h,以GR5526为例,定义如下,串口读写引脚分别为GPIO5和GPIO4,上拉模式。
/*******UART DRIVER IO CONFIG*******************/ #define APP_UART_TX_IO_TYPE APP_IO_TYPE_GPIOA #define APP_UART_RX_IO_TYPE APP_IO_TYPE_GPIOA #define APP_UART_TX_PIN APP_IO_PIN_4 #define APP_UART_RX_PIN APP_IO_PIN_5 #define APP_UART_TX_PINMUX APP_IO_MUX_3 #define APP_UART_RX_PINMUX APP_IO_MUX_3 #define APP_UART_TX_PULL APP_IO_PULLUP #define APP_UART_RX_PULL APP_IO_PULLUP - init:串口传输参数
- init.baud_rate:波特率115200
- init.data_bits:数据位UART_DATABITS_8(8 bits)
- init.stop_bits:停止位UART_STOPBITS_1(1位)
- init.parity:奇偶校验位UART_PARITY_NONE(无奇偶校验位)
- init.hw_flow_ctrl:硬件流控使能位UART_HWCONTROL_NONE(无硬件流控)
- init.rx_timeout_mode:接收超时使能位UART_RECEIVER_TIMEOUT_ENABLE(使能接收超时)
重要函数
- 初始化UART
ret = app_uart_init(&uart_params, app_uart_callback, &uart_buffer)- uart_params:初始化参数结构体。
- app_uart_callback:用户自定义回调函数。
- uart_buffer:发送缓存。发送数据长度不能超过缓存大小,默认使用中断方式传输。
- 串口同步发送
app_uart_transmit_sync(UART_ID, g_message_0, sizeof(g_message_0), 5000)串口中断方式同步发送数据。
- UART_ID:串口ID。
- g_message_0:待发送的数据。
- sizeof(g_message_0):待发送数据的长度。
- 5000 ms:超时时间。
- 串口异步发送
串口中断方式异步发送数据。app_uart_transmit_async(UART_ID, g_tx_buffer, rlen)- UART_ID:串口ID。
- g_tx_buffer:待发送数据的buffer。
- rlen:待发送数据的长度。
- 串口异步接收
串口中断方式异步接收数据。app_uart_receive_async(UART_ID, g_rx_buffer, sizeof(g_rx_buffer))- UART_ID:串口ID。
- g_rx_buffer:待接收数据的buffer。
- sizeof(g_rx_buffer):待接收数据的长度。
测试验证
- 连接开发板到PC端,打开串口助手,连接串口。
- 芯片上电串口日志打印提示信息,要求串口发送小于126字节的数据。
- 当通过串口调试助手发送input data,开发板端串口接收到数据并将input data发送到串口,串口调试助手收到后进行显示。
Please input characters(<126) and end with newline.
Input:
input data
input data
UART DMA
示例工程实现UART以DMA方式收发数据,工程路径:SDK_Folder\projects\peripheral\uart\app_uart_dma。
流程图
串口调试助手和开发板通过UART进行通信。开发板向串口发送提示数据,告知用户需要传输数据,开发板处于接收数据等待状态;当用户通过串口调试助手发送数据时,开发板接收发送的数据,并将其发送到串口进行显示。
初始化参数
初始化参数如下:
app_uart_params_t uart_params = {
.id = UART_ID,
.pin_cfg = {
.tx = {
.type = APP_UART_TX_IO_TYPE,
.mux = APP_UART_TX_PINMUX,
.pin = APP_UART_TX_PIN,
.pull = APP_IO_PULLUP,
},
.rx = {
.type = APP_UART_RX_IO_TYPE,
.mux = APP_UART_RX_PINMUX,
.pin = APP_UART_RX_PIN,
.pull = APP_IO_PULLUP,
},
},
.dma_cfg = {
.tx_dma_instance = DMA0,
.rx_dma_instance = DMA0,
.tx_dma_channel = DMA_Channel0,
.rx_dma_channel = DMA_Channel1 ,
},
.init = {
.baud_rate = 115200,
.data_bits = UART_DATABITS_8,
.stop_bits = UART_STOPBITS_1,
.parity = UART_PARITY_NONE,
.hw_flow_ctrl = UART_HWCONTROL_NONE,
.rx_timeout_mode = UART_RECEIVER_TIMEOUT_ENABLE,
},
};
- id:定义串口ID
#define UART_ID APP_UART_IDAPP_UART_ID可以为APP_UART_ID_0、APP_UART_ID_1、APP_UART_ID_2、APP_UART_ID_3、APP_UART_ID_4、APP_UART_ID_5,具体选择请参考board_SK.h,例如GR5526中APP_UART_ID为APP_UART_ID_3。
#define APP_UART_ID APP_UART_ID_3 -
pin_cfg:配置串口读写引脚
主要配置IO类型、复用MUX模式、使用的引脚和上下拉模式,具体参数定义请参考board_SK.h,以GR5526为例,定义如下,串口读写引脚分别为GPIO5和GPIO4,上拉模式。
/*******UART DRIVER IO CONFIG*******************/ #define APP_UART_TX_IO_TYPE APP_IO_TYPE_GPIOA #define APP_UART_RX_IO_TYPE APP_IO_TYPE_GPIOA #define APP_UART_TX_PIN APP_IO_PIN_4 #define APP_UART_RX_PIN APP_IO_PIN_5 #define APP_UART_TX_PINMUX APP_IO_MUX_3 #define APP_UART_RX_PINMUX APP_IO_MUX_3 #define APP_UART_TX_PULL APP_IO_PULLUP #define APP_UART_RX_PULL APP_IO_PULLUP - init:串口传输参数
- init.baud_rate:波特率115200
- init.data_bits:数据位UART_DATABITS_8(8 bits)
- init.stop_bits:停止位UART_STOPBITS_1(1位)
- init.parity:奇偶校验位UART_PARITY_NONE(无奇偶校验位)
- init.hw_flow_ctrl:硬件流控使能位UART_HWCONTROL_NONE(无硬件流控)
- init.rx_timeout_mode:接收超时使能位UART_RECEIVER_TIMEOUT_ENABLE(使能接收超时)
-
dma_cfg:DMA参数配置
- dma_cfg.tx_dma_instance:串口发送使用的DMA实例,DMA0
- dma_cfg.rx_dma_instance:串口接收使用的DMA实例,DMA0
- dma_cfg.tx_dma_channel:串口发送使用的DMA通道,选用DMA_Channel0,即通道0
- dma_cfg.rx_dma_channel:串口接收使用的DMA通道,选用DMA_Channel1,即通道1
重要函数
- 初始化UART
ret = app_uart_init(&uart_params, app_uart_callback, &uart_buffer)- uart_params:初始化参数结构体
- app_uart_callback:用户自定义回调函数
- uart_buffer:发送缓存,发送数据不超过缓存大小,默认中断方式传输。
- 配置串口DMA传输模式
ret = app_uart_dma_init(&uart_params); - 串口同步发送
串口中断方式同步发送数据。app_uart_transmit_sync(UART_ID, g_message_0, sizeof(g_message_0), 5000)- UART_ID:串口ID
- g_message_0:待发送的数据
- sizeof(g_message_0):发送数据的长度
- 5000 ms:超时时间
- 串口异步发送
串口DMA方式异步发送数据。app_uart_dma_transmit_async(UART_ID, g_tx_buffer, rlen)- UART_ID:串口ID
- g_tx_buffer:需要发送数据的buffer
- rlen:需要发送的数据长度
- 串口异步接收
串口DMA方式异步接收数据。app_uart_dma_receive_async(UART_ID, g_rx_buffer, sizeof(g_rx_buffer))- UART_ID:串口ID
- g_rx_buffer:需要接收数据的buffer
- sizeof(g_rx_buffer):需要接收数据的长度
测试验证
同测试验证。
UART DMA(分散聚合特性)
示例工程实现带分散聚合特性的UART DMA方式收发数据,工程路径:SDK_Folder\projects\peripheral\uart\app_uart_dma_sg_llp。
该示例仅适用于GR5526和GR5x25。
流程图
对比示例UART Interrupt,需要配置DMA分散聚合结构体,用于带分散聚合特性的UART DMA方式收发数据。
初始化参数
初始化参数如下:
app_uart_params_t uart_params = {
.id = UART_ID,
.pin_cfg = {
.tx = {
.type = APP_UART1_TX_IO_TYPE,
.mux = APP_UART1_TX_PINMUX,
.pin = APP_UART1_TX_PIN,
.pull = APP_IO_PULLUP,
},
.rx = {
.type = APP_UART1_RX_IO_TYPE,
.mux = APP_UART1_RX_PINMUX,
.pin = APP_UART1_RX_PIN,
.pull = APP_IO_PULLUP,
},
},
.dma_cfg = {
.tx_dma_instance = DMA0,
.rx_dma_instance = DMA0,
.tx_dma_channel = DMA_Channel0,
.rx_dma_channel = DMA_Channel1 ,
},
.init = {
.baud_rate = 115200,
.data_bits = UART_DATABITS_8,
.stop_bits = UART_STOPBITS_1,
.parity = UART_PARITY_NONE,
.hw_flow_ctrl = UART_HWCONTROL_NONE,
.rx_timeout_mode = UART_RECEIVER_TIMEOUT_DISABLE,
},
};
- id:定义串口ID
具体选择请参考board_SK.h,例如GR5526中APP_UART_ID为APP_UART_ID_1。
#define APP_UART1_ID APP_UART_ID_1 -
pin_cfg:配置串口读写引脚
主要配置IO类型、复用MUX模式、使用的引脚和上下拉模式,具体参数定义请参考board_SK.h,以GR5526为例,定义如下,串口读写引脚分别为GPIO32和GPIO33,上拉模式,复用模式4。
#define APP_UART1_TX_IO_TYPE APP_IO_TYPE_GPIOC #define APP_UART1_RX_IO_TYPE APP_IO_TYPE_GPIOC #define APP_UART1_TX_PIN APP_IO_PIN_0 #define APP_UART1_RX_PIN APP_IO_PIN_1 #define APP_UART1_TX_PINMUX APP_IO_MUX_4 #define APP_UART1_RX_PINMUX APP_IO_MUX_4 - init:串口传输参数
- init.baud_rate:波特率115200
- init.data_bits:数据位UART_DATABITS_8(8 bits)
- init.stop_bits:停止位UART_STOPBITS_1(1位)
- init.parity:奇偶校验位UART_PARITY_NONE(无奇偶校验位)
- init.hw_flow_ctrl:硬件流控使能位UART_HWCONTROL_NONE(无硬件流控)
- init.rx_timeout_mode:接收超时使能位UART_RECEIVER_TIMEOUT_ENABLE(使能接收超时)
-
dma_cfg:DMA参数配置
- dma_cfg.tx_dma_instance:串口发送使用的DMA实例,DMA0
- dma_cfg.rx_dma_instance:串口接收使用的DMA实例,DMA0
- dma_cfg.tx_dma_channel:串口发送使用的DMA实例通道,选用DMA_Channel0,即通道0
- dma_cfg.rx_dma_channel:串口接收使用的DMA实例通道,选用DMA_Channel1,即通道1
分散聚合结构体配置
dma_block_config_t block1 = {
.src_address = (uint32_t)&src_data1,
.dst_address = (uint32_t)0,
.p_lli = NULL,
.CTL_L = DMA_CTLL_INI_EN | DMA_DST_NO_CHANGE | DMA_SRC_INCREMENT |
DMA_SDATAALIGN_BYTE | DMA_DDATAALIGN_BYTE |\
DMA_SRC_GATHER_ENABLE | DMA_DST_SCATTER_DISABLE |\
DMA_LLP_SRC_ENABLE | DMA_LLP_DST_DISABLE | DMA_MEMORY_TO_PERIPH,
.CTL_H = (uint32_t)UART_DATA_LEN/2,
.src_status = 0x0,
.dst_status = 0x0,
};
dma_block_config_t block0 = {
.src_address = (uint32_t)&src_data0,
.dst_address = (uint32_t)0,
.p_lli = &block1,
.CTL_L = DMA_CTLL_INI_EN | DMA_DST_NO_CHANGE | DMA_SRC_INCREMENT |
DMA_SDATAALIGN_BYTE | DMA_DDATAALIGN_BYTE |\
DMA_SRC_GATHER_ENABLE | DMA_DST_SCATTER_DISABLE |\
DMA_LLP_SRC_ENABLE | DMA_LLP_DST_DISABLE | DMA_MEMORY_TO_PERIPH,
.CTL_H = (uint32_t)UART_DATA_LEN/2,
.src_status = 0x0,
.dst_status = 0x0,
};
dma_sg_llp_config_t sg_llp_config;
sg_llp_config.scatter_config.dst_scatter_en = DMA_DST_SCATTER_DISABLE;
sg_llp_config.scatter_config.dst_dsi = (uint32_t)0;
sg_llp_config.scatter_config.dst_dsc = (uint32_t)0;
sg_llp_config.gather_config.src_gather_en = DMA_SRC_GATHER_ENABLE;
sg_llp_config.gather_config.src_sgi = (uint32_t)1;
sg_llp_config.gather_config.src_sgc = (uint32_t)1;
sg_llp_config.llp_config.llp_src_en = DMA_LLP_SRC_ENABLE;
sg_llp_config.llp_config.llp_src_writeback = 0xa;
sg_llp_config.llp_config.llp_dst_en = DMA_LLP_DST_DISABLE;
sg_llp_config.llp_config.head_lli = &block0;
- scatter_config.dst_scatter_en:选择DMA_DST_SCATTER_DISABLE,即目的端分散禁用
- scatter_config.dst_dsi:目的端分散间隔,以数据传输位宽为单位
- scatter_config.dst_dsc:目的端分散计数,代表连续的数据个数
- gather_config.src_gather_en:源端聚合使能
- gather_config.src_sgi:源端聚合间隔1个数据传输位宽
- gather_config.src_sgc:源端聚合计数1,代表连续的数据个数,数据单位和传输位宽有关。
- llp_config.llp_src_en:源端传输链表使能
- llp_config.llp_src_writeback:源端回写状态值
- llp_config.llp_dst_en:目的端传输链表使能
- llp_config.head_lli:传输链表头,指向block0
- src_address:源数据地址
- dst_address:目的数据地址
- p_lli:传输链表下一个节点地址
- CTL_L:控制寄存器低32位配置
- CTL_H:控制寄存器高32位配置
- src_status:回写源端传输状态
- dst_address:回写目的端传输状态
- DMA_CTLL_INI_EN:使能DMA中断
- DMA_DST_NO_CHANGE:目的端地址不变
- DMA_SRC_INCREMENT:源端地址递增
- DMA_SDATAALIGN_BYTE:源端数据传输位宽8 bits
- DMA_DDATAALIGN_BYTE:目的端数据传输位宽8 bits
- DMA_SRC_GATHER_ENABLE:源端聚合使能
- DMA_DST_SCATTER_DISABLE:目的端分散不使能
- DMA_LLP_SRC_ENABLE:源端传输链表使能
- DMA_LLP_DST_DISABLE:目的端传输链表不使能
- DMA_MEMORY_TO_PERIPH:数据传输方向为内存到外设
重要函数
-
串口以DMA分散聚合的方式接收数据
app_uart_receive_dma_sg_llp(APP_UART_ID_1, dst_data0, UART_DATA_LEN/2,&sg_llp_config) -
串口以DMA分散聚合的方式发送数据
app_uart_transmit_dma_sg_llp(UART_ID, src_data0, UART_DATA_LEN/2,&sg_llp_config)
测试验证
- 根据示例工程代码连接引脚。
- 引脚连接后,连接开发板到PC端,打开串口调试助手,连接串口,查看日志对比接收数据和发送数据是否一致,回写状态是否正确。
[13:48:43.810] uart_transmit_dma_sg_llp transmit success uart_transmit_dma_sg_llp data correct uart_transmit_dma_sg_llp write back success app_uart_receive_dma_sg_llp_test receive success app_uart_receive_dma_sg_llp_test data0 is correct app_uart_receive_dma_sg_llp_test data1 is correct app_uart_receive_dma_sg_llp_test write back success UART APP DMA SG & LLP example done!