CN / EN
文档反馈
感谢关注汇顶文档,期待您的宝贵建议!
感谢您的反馈,祝您愉快!
无匹配项 共计114个匹配页面

示例代码

UART Interrupt

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

示例工程流程图

图 9 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

示例工程流程图

图 10 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。

示例工程流程图

对比示例UART Interrupt,需要配置DMA分散聚合结构体,用于带分散聚合特性的UART DMA方式收发数据。

图 11 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. 引脚连接
    表 84 引脚连接方式
    芯片 连接方式

    GR551x

    短接GPIO26和GPIO30

    GR5526

    短接GPIO32和GPIO33

  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!
    

扫描关注

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