示例代码
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_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:超时时间
- 串口异步发送
同步串口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。
示例工程流程图
对比示例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)
测试验证
- 引脚连接
表 84 引脚连接方式 芯片 连接方式 GR551x
短接GPIO26和GPIO30
GR5526
短接GPIO32和GPIO33
- 引脚连接后,连接开发板到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!