HI3861学习笔记(18)——UART串口使用

Posted Leung_ManWah

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HI3861学习笔记(18)——UART串口使用相关的知识,希望对你有一定的参考价值。

一、简介

1.1 UART

通用异步收发送器(UART)是一种硬件特性,它使用广泛适应的异步串行通信接口(如RS 232、RS 422、RS 485)来处理通信(即时序要求和数据帧)。UART提供了一种广泛采用和廉价的方法来实现不同设备之间的全双工或半双工数据交换。

1.2 GPIO复用功能

HI3861V100 芯片有 15 个 GPIO,引脚分布如下:


其中 UART 端口有 3 个,其中 UART0 用于调试,每个 GPIO 可复用成 UART 的端口如下:

Pin管脚名称复用信号
2GPIO_00UART1_TXD
3GPIO_01UART1_RXD
4GPIO_02UART1_RTS, UART1 的流控管脚,发送请求信号,输出
5GPIO_03复用信号 0:UART0_LOG_TXD,数据发送, Debug 和下载串口接口
复用信号 1:UART1_CTS, UART1 的流控管脚,清除发送信号,输入
6GPIO_04UART0_LOG_RXD 数据接收, Debug 和下载串口接口
17GPIO_05UART1_RXD,数据接收口
18GPIO_06UART1_TXD,数据发送口
19GPIO_07UART1_CTS,清除发送信号,通信串口
20GPIO_08UART1_RTS,发送请求信号,通信串口
27GPIO_09UART2_RTS,发送请求信号,通信串口,输出信号
28GPIO_10UART2_CTS,发送清除信号,通信串口,输入信号
29GPIO_11UART2_TXD
30GPIO_12UART2_RXD
31GPIO_13复用信号 1:UART2_RTS
复用信号 2:UART0_LOG_TXD
32GPIO_14复用信号 1:UART2_CTS
复用信号 2:UART0_LOG_RXD

二、API说明

以下 UART 接口位于 base\\iot_hardware\\interfaces\\kits\\wifiiot_lite\\wifiiot_uart.h

业务BUILD.gn中包含路径

include_dirs = [
        "//utils/native/lite/include",
        "//kernel/liteos_m/components/cmsis/2.0",
        "//base/iot_hardware/interfaces/kits/wifiiot_lite",
    ]

2.1 UartInit

功能配置一个UART设备
函数定义unsigned int UartInit(WifiIotUartIdx id, const WifiIotUartAttribute *param, const WifiIotUartExtraAttr *extraAttr)
参数id:UART端口号
param:表示基本UART属性
extraAttr:表示扩展UART属性
返回错误码

2.2 UartWrite

功能将数据写入UART设备
函数定义int UartWrite(WifiIotUartIdx id, const unsigned char *data, unsigned int dataLen)
参数id:UART端口号
data:表示指向要写入数据的起始地址的指针
dataLen:表示读取数据的长度
返回成功时返回写入的字节长度

2.3 UartRead

功能从UART设备读取数据
函数定义int UartRead(WifiIotUartIdx id, unsigned char *data, unsigned int dataLen)
参数id:UART端口号
data:表示指向要读取数据的起始地址的指针
dataLen:表示读取数据的长度
返回成功时返回读取的字节长度

2.4 UartSetFlowCtrl

功能设置UART硬件流控制
函数定义unsigned int UartSetFlowCtrl(WifiIotUartIdx id, WifiIotFlowCtrl flowCtrl)
参数id:UART端口号
flowCtrl:用于硬件流控制的参数
返回错误码

三、使用UART进行数据的收发

编译时在业务BUILD.gn中包含路径

include_dirs = [
        "//utils/native/lite/include",
        "//kernel/liteos_m/components/cmsis/2.0",
        "//base/iot_hardware/interfaces/kits/wifiiot_lite",
    ]

使用板载 E53 接口的 UART 作为测试,如原理图所示第 18 和 19 脚分别为 TXD 和 RXD ,连接了主控芯片的 GPIO_6 和 GPIO_5 ,所以在编写软件的时候需要将 GPIO_6 和 GPIO_5 分别复用为 TXD 和 RXD 。

#include <stdio.h>
#include <string.h>
#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_errno.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_adc.h"
#include "wifiiot_uart.h"

#define UART_TASK_STACK_SIZE 1024 * 8
#define UART_TASK_PRIO 25
#define UART_BUFF_SIZE 1000

static const char *data = "Hello, BearPi!\\r\\n";

static void UART_Task(void)

    uint8_t uart_buff[UART_BUFF_SIZE] = 0;
    uint8_t *uart_buff_ptr = uart_buff;
    uint32_t ret;

    // 这部分代码为UART初始化的代码,首先要在uart_attr结构体这配置波特率、数据位、停止位、奇偶检验位,然后通过UartInit()函数对串口1进行配置。
    WifiIotUartAttribute uart_attr = 
    
        //波特率: 115200
        .baudRate = 115200,

        //data_bits: 8bits
        .dataBits = 8,
        .stopBits = 1,
        .parity = 0,
    ;

    //Initialize uart driver
    ret = UartInit(WIFI_IOT_UART_IDX_1, &uart_attr, NULL);
    if (ret != WIFI_IOT_SUCCESS)
    
        printf("Failed to init uart! Err code = %d\\n", ret);
        return;
    
    printf("UART Test Start\\n");
    while (1)
    
        printf("=======================================\\r\\n");
        printf("*************UART_example**************\\r\\n");
        printf("=======================================\\r\\n");

        //通过串口1发送数据
        UartWrite(WIFI_IOT_UART_IDX_1, (unsigned char *)data, strlen(data));

        //通过串口1接收数据
        UartRead(WIFI_IOT_UART_IDX_1, uart_buff_ptr, UART_BUFF_SIZE);

        printf("Uart1 read data:%s", uart_buff_ptr);
        usleep(1000000);
    


static void UART_ExampleEntry(void)

    osThreadAttr_t attr;

    attr.name = "UART_Task";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = UART_TASK_STACK_SIZE;
    attr.priority = UART_TASK_PRIO;

    if (osThreadNew((osThreadFunc_t)UART_Task, NULL, &attr) == NULL)
    
        printf("[ADCExample] Falied to create UART_Task!\\n");
    


APP_FEATURE_INIT(UART_ExampleEntry);

查看打印:


• 由 Leung 写于 2021 年 11 月 29 日

• 参考:【鸿蒙2.0设备开发教程】小熊派HarmonyOS 鸿蒙·季 开发教程

以上是关于HI3861学习笔记(18)——UART串口使用的主要内容,如果未能解决你的问题,请参考以下文章

HI3861学习笔记——搭建环境编译烧写

HI3861学习笔记(11)——GPIO输出接口使用

HI3861学习笔记(12)——GPIO输入接口使用

HI3861学习笔记(19)——WiFi接口使用(STA和AP模式)

HI3861学习笔记(14)——ADC接口使用

HI3861学习笔记(13)——PWM接口使用