CN / EN
文档反馈
感谢关注汇顶文档,期待您的宝贵建议!
感谢您的反馈,祝您愉快!

APP UART驱动

宏定义

TX_ONCE_MAX_SIZE

表 56 TX_ONCE_MAX_SIZE宏定义
描述

定义一次传输的最大字节数

128

说明:

  • 该值表示单次发送缓冲区的最大长度。
  • 异步发送时,数据会先放入环形缓冲区,再从环形缓冲区拷贝到单次发送缓冲区。
  • 在DMA模式下,TX_ONCE_MAX_SIZE值将影响触发DMA中断的频率。

结构体

app_uart_pin_t

结构体定义如下:

表 57 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

结构体定义如下:

表 58 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

结构体定义如下:

表 59 app_uart_dma_cfg_t结构体成员
成员 描述 取值

dma_reg_t *tx_dma_instance

UART_TX指定DMA模块配置

该参数的取值可以是下列值中的任意一个:

  • DMA0
  • DMA1

具体选择参考app_dma_params_t章节中,DMA支持的外设。

dma_reg_t *rx_dma_instance

UART_RX指定DMA模块配置

该参数的取值可以是下列值中的任意一个:

  • DMA0
  • DMA1

具体选择参考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

结构体定义如下:

表 60 app_uart_params_t结构体成员
成员 描述 取值

app_uart_id_t id

设置使用的UART模块ID

  • APP_UART_ID_0(UART0)
  • APP_UART_ID_1(UART1)
  • APP_UART_ID_2(UART2)
  • APP_UART_ID_3(UART3)
  • APP_UART_ID_4(UART4)
  • APP_UART_ID_5(UART5)

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

结构体定义如下:

表 61 uart_init_t结构体成员
成员 描述 取值

uint32_t baud_rate

波特率

0~4000000(默认115200),最大支持波特率请参考对应芯片Datasheet手册。

uint32_t data_bits

数据位

该参数的取值可以是下列值中的任意一个 :

  • UART_DATABITS_5(5 bits)
  • UART_DATABITS_6(6 bits)
  • UART_DATABITS_7(7 bits)
  • UART_DATABITS_8(8 bits)

uint32_t stop_bits

停止位

该参数的取值可以是下列值中的任意一个 :

  • UART_STOPBITS_1(1 bit)
  • UART_STOPBITS_1_5(1.5 bits)
  • UART_STOPBITS_2(2 bits)

uint32_t parity

奇偶校验位

该参数的取值可以是下列值中的任意一个 :

  • UART_PARITY_NONE(无校验位)
  • UART_PARITY_ODD(奇校验)
  • UART_PARITY_EVEN(偶校验)
  • UART_PARITY_SP0(0校验)
  • UART_PARITY_SP1(1校验)

uint32_t hw_flow_ctrl

硬件流控使能位

该参数的取值可以是下列值中的任意一个 :

  • UART_HWCONTROL_NONE(无硬件流控)
  • UART_HWCONTROL_RTS_CTS(硬件流控使能)

uint32_t rx_timeout_mode

接收超时使能位

该参数的取值可以是下列值中的任意一个 :

  • UART_RECEIVER_TIMEOUT_ENABLE(使能)
  • UART_RECEIVER_TIMEOUT_DISABLE(禁用)
详细信息请参考文件:
  • 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

结构体定义如下:

表 62 app_uart_evt_t结构体成员
成员 描述 取值

app_uart_evt_type_t type

串口事件类型

该参数的取值可以是下列值中的任意一个:

  • 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中断发送和接收)

union

{

uint32_t error_code;

unt16_t size;

}data;

  • uint32_t error_code:串口事件返回的错误号

  • uint16_t size:串口已接收/发送的数据长度

说明:

若事件类型为传输错误,此处返回错误串口引脚;若事件类型为接收/发送完成,此处显示已接收/发送的数据长度

串口错误号:

  • HAL_UART_ERROR_NONE(无错误)
  • HAL_UART_ERROR_PE(奇偶校验错误)
  • HAL_UART_ERROR_FE (帧错误,一般发生在接收方检测到无效的停止位)

  • HAL_UART_ERROR_OE(接收溢出错误)

  • HAL_UART_ERROR_BI (中断错误,一般发生在RX被拉低超过1帧数据时)

  • HAL_UART_ERROR_DMA(DMA传输错误)

  • HAL_UART_ERROR_BUSY(当前串口正在传输)

  • HAL_UART_ERROR_INVALID_PARAM(无效参数)

详细信息请参考文件:SDK_Folder\drivers\inc\app_uart.h

app_uart_tx_buf_t

结构体定义如下:

表 63 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

枚举定义如下:

表 64 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

枚举定义如下:

表 65 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

枚举定义如下:

表 66 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

枚举定义如下:

表 67 app_uart_state_t枚举成员
成员 描述

APP_UART_INVALID = 0

UART不可用

APP_UART_ACTIVITY

UART激活

APP_UART_SLEEP

UART睡眠

详细信息请参考文件:SDK_Folder\drivers\inc\app_uart.h

接口函数

表 68 UART驱动接口函数
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

表 69 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

输入参数
  • p_params:初始化参数的结构体指针

  • evt_handler:用户自己实现的中断回调函数

  • tx_buffer:发送缓存

返回值

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

表 70 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

表 71 app_uart_transmit_async接口
函数原型

uint16_t app_uart_transmit_async(app_uart_id_t id, uint8_t *p_data, uint16_t size)

功能说明

串口中断方式(异步)发送数据

输入参数
  • id:UART模块ID(见app_uart_id_t描述)

  • p_data:待发送数据指针

  • size:待发送数据长度,单位:Byte。此长度不应大于初始化的tx_buffer长度

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_uart_transmit_sync

表 72 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)

功能说明

串口轮询方式(同步)发送数据

输入参数
  • id:UART模块ID(见app_uart_id_t描述)

  • p_data:待发送数据指针

  • size:待发送数据长度,单位:Byte。此长度不应大于初始化的tx_buffer长度

  • timeout:超时时间(单位:ms)

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_uart_receive_async

表 73 app_uart_receive_async接口
函数原型

uint16_t app_uart_receive_async(app_uart_id_t id, uint8_t *p_data, uint16_t size)

功能说明

串口中断方式(异步)接收数据

输入参数
  • id:UART模块ID(见app_uart_id_t描述)

  • p_data:接收数据的指针

  • size:接收数据长度,单位:Byte

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_uart_receive_sync

表 74 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)

功能说明

串口轮询方式(同步)接收数据

输入参数
  • id:UART模块ID(见app_uart_id_t描述)

  • p_data:接收数据的指针

  • size:接收数据长度,单位:Byte

  • timeout:超时时间(单位:ms)

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_uart_flush

表 75 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

表 76 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

表 77 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

表 78 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

表 79 app_uart_get_handle接口
函数原型

uart_handle_t *app_uart_get_handle(app_uart_id_t id)

功能说明

获取串口句柄

输入参数

id:UART模块ID(见app_uart_id_t描述)

返回值

串口句柄指针

备注

DMA接口函数

表 80 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

表 81 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

表 82 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

表 83 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方式(异步)发送数据

输入参数
  • id:UART模块ID(见app_uart_id_t描述)

  • p_data:需要发送的数据,以Byte为单位

  • size:需要发送的数据长度,此长度不应大于初始化的tx_buffer长度

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_uart_dma_receive_async

表 84 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方式(异步)接收数据

输入参数
  • id:UART模块ID(见app_uart_id_t描述)

  • p_data:存放接收到的数据,以Byte为单位

  • size:设置需要接收的数据个数

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_uart_transmit_dma_sg_llp

表 85 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(链表)特性,用于不连续内存之间的数据传输,以及使用链表传输提高单次传输的字节数

输入参数
  • id:UART模块ID(见app_uart_id_t描述)

  • p_data:需要发送的数据

  • size:需要发送的数据长度,以Byte为单位,此长度不应大于初始化的tx_buffer长度

  • sg_llp_config:DMA分散聚合配置,详见APP DMA驱动

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_uart_receive_dma_sg_llp

表 86 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(链表)特性,用于不连续内存之间的数据传输,以及使用链表传输提高单次传输的字节数

输入参数
  • id:UART模块ID(见app_uart_id_t描述)

  • p_data:存放接收到的数据

  • size:设置需要接收的数据个数,以Byte为单位

  • sg_llp_config:DMA分散聚合配置,详见APP DMA驱动

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

示例工程

UART Interrupt

示例工程实现UART以中断方式收发数据,工程路径:SDK_Folder\projects\peripheral\uart\app_uart

流程图

图 8 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):待接收数据的长度。

测试验证

  1. 连接开发板到PC端,打开串口助手,连接串口。
  2. 芯片上电串口日志打印提示信息,要求串口发送小于126字节的数据。
  3. 当通过串口调试助手发送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

流程图

图 9 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_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(使能接收超时)
  • 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:超时时间
  • 串口异步发送
    app_uart_dma_transmit_async(UART_ID, g_tx_buffer, rlen)
    串口DMA方式异步发送数据。
    • UART_ID:串口ID
    • g_tx_buffer:需要发送数据的buffer
    • rlen:需要发送的数据长度
  • 串口异步接收
    app_uart_dma_receive_async(UART_ID, g_rx_buffer, sizeof(g_rx_buffer))
    串口DMA方式异步接收数据。
    • 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方式收发数据。

图 10 UART带分散聚合函数收发数据流程

初始化参数

初始化参数如下:

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)

测试验证

  1. 根据示例工程代码连接引脚。
  2. 引脚连接后,连接开发板到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!
    

扫描关注

打开微信,使用“扫一扫”即可关注。