Receive Polling

该示例演示使用 UART 轮询方式与 PC 终端进行数据通信。

使用 PC 终端程序(如 PUTTY 或 UartAssist)发送数据,SoC 在主程序内循环检测接收数据,并将相同数据发回给 PC 终端,在 PC 终端程序中可观察到 SoC 回复的数据信息。

用户可以通过不同的宏配置改变示例中的引脚配置,是否开启硬件流控等功能,具体宏配置详见 配置选项

环境需求

该示例的环境需求,可参考 环境需求

此外,需要在 PC 终端安装 PuTTY 或 UartAssist 等串口助手工具。

配置选项

  1. 可配置如下宏选择是否开启硬件流控功能。

    #define UART_CONFIG_HW_FLOW_CTRL            1        /*< Set this macro to 1 to enable the hardware flow control. */
    
  2. 可配置如下宏修改引脚定义。

    #define UART_TX_PIN                         P3_0
    #define UART_RX_PIN                         P3_1
    #define UART_CTS_PIN                        P2_4
    #define UART_RTS_PIN                        P2_5
    

硬件连线

连接 P3_0(UART TX Pin)和 FT232 的 RX,P3_1(UART RX Pin) 和 FT232 的 TX。

UART_CONFIG_HW_FLOW_CTRL 配置为 1 ,则还需要连接 P2_4(UART CTS Pin)和 FT232 的 RTS,连接 P2_5(UART RTS Pin)和 FT232 的 CTS。

编译和下载

该示例的编译和下载流程,可参考 编译和下载

测试验证

准备阶段

  1. 启动 PuTTY 或 UartAssist 等 PC 终端,连接到使用的 COM 端口,并进行以下 UART 设置:

  • 波特率: 115200

  • 8 数据位

  • 1 停止位

  • 无校验

  • 无硬件流控

测试阶段

  1. 当 EVB 启动后,在 Debug Analyzer 工具内观察如下 log。

    Start uart rx polling test!
    
  2. Soc 开始发送 ### Uart demo polling read uart data ####\r\n,观察 PC 终端上出现的字符串。

  3. 在 PC 终端上输入字符串并向 SoC 发送,SoC 收到数据后会向 PC 端回复相同的数据。观察 PC 终端上是否出现相同的字符串。

代码介绍

该章节主要介绍示例中的初始化和相应功能实现的代码和流程说明。

源码路径

工程文件和源码路径如下:

  • 工程路径: sdk\samples\peripheral\uart\rx_polling\proj

  • 源码路径: sdk\samples\peripheral\uart\rx_polling\src

初始化

外设的初始化流程可参考 General Introduction 中的 初始化流程 部分。

  1. 调用 Pad_Config()Pinmux_Config(),配置对应引脚的 PAD 和 PINMUX。若 UART_CONFIG_HW_FLOW_CTRL 配置为 1,则仍需要对 CTS 和 RTS 引脚进行配置。

    void board_uart_init(void)
    {
        Pad_Config(UART_TX_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_HIGH);
        Pad_Config(UART_RX_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_HIGH);
    
        Pinmux_Config(UART_TX_PIN, UART3_TX);
        Pinmux_Config(UART_RX_PIN, UART3_RX);
    
    #if UART_CONFIG_HW_FLOW_CTRL
        Pad_Config(UART_CTS_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_HIGH);
        Pad_Config(UART_RTS_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_HIGH);
        Pinmux_Deinit(UART_CTS_PIN);
        Pinmux_Deinit(UART_RTS_PIN);
        Pinmux_Config(UART_CTS_PIN, UART3_CTS);
        Pinmux_Config(UART_RTS_PIN, UART3_RTS);
    #endif
    }
    
  2. 调用 RCC_PeriphClockCmd() ,开启 UART 时钟。

  3. 对 UART 外设进行初始化:

    1. 定义 UART_InitTypeDef 类型 UART_InitStruct ,调用 UART_StructInit()UART_InitStruct 预填默认值。

    2. 根据需求修改 UART_InitStruct 参数,UART 的初始化参数配置如下表。

    3. 调用 UART_Init(),初始化 UART 外设。

UART 初始化参数

UART Hardware Parameters

Setting in the UART_InitStruct

UART

UART Baudrate Parameter - div

UART_InitTypeDef::UART_Div

BaudRate_Table[BAUD_RATE_115200].div

UART Baudrate Parameter - ovsr

UART_InitTypeDef::UART_Ovsr

BaudRate_Table[BAUD_RATE_115200].ovsr

UART Baudrate Parameter - ovsr_adj

UART_InitTypeDef::UART_OvsrAdj

BaudRate_Table[BAUD_RATE_115200].ovsr_adj

Hardware Flow Control

UART_InitTypeDef::UART_HardwareFlowControl

ENABLE (Only config UART_CONFIG_HW_FLOW_CTRL to 1)

功能实现

  1. 执行 uart_senddata_continuous ,发送 ### Uart demo polling read uart data ###\r\n 到 PC 终端。在函数 uart_senddata_continuous 内,等待 UART TX FIFO 为空时,分批将数据填入 FIFO 中。

    void uart_senddata_continuous(UART_TypeDef *UARTx, const uint8_t *pSend_Buf, uint16_t vCount)
    {
        uint8_t count;
        while (vCount / UART_TX_FIFO_SIZE > 0)
        {
            while (UART_GetFlagStatus(UARTx, UART_FLAG_TX_FIFO_EMPTY) == 0);
            for (count = UART_TX_FIFO_SIZE; count > 0; count--)
            {
                UARTx->UART_RBR_THR = *pSend_Buf++;
            }
            vCount -= UART_TX_FIFO_SIZE;
        }
    
        while (UART_GetFlagStatus(UARTx, UART_FLAG_TX_FIFO_EMPTY) == 0);
        while (vCount--)
        {
            UARTx->UART_RBR_THR = *pSend_Buf++;
        }
    }
    
  2. PC 终端发送字符串后,SoC 检测接收到数据且 UART_FLAG_RX_DATA_RDY 状态为 SET 时,调用 UART_ReceiveByte() 接收数据,调用 UART_SendByte() 把数据发回到 PC 终端。

    uart_senddata_continuous(UART_DEMO, String_Buf, demoStrLen);
    while (1)
    {
        if (UART_GetFlagStatus(UART_DEMO, UART_FLAG_RX_DATA_AVA) == SET)
        {
            rx_byte = UART_ReceiveByte(UART_DEMO);
            UART_SendByte(UART_DEMO, rx_byte);
        }
    }