开发环境:
开发系统:Ubuntu 20.04
开发板:小凌派-RK2206开发板
OpenHarmony版本:3.0.0-LTS
4.1串口简介
串口是一个泛称,UART、TTL、RS232、RS485、RS422都可以说是串口。一般的MCU内部集成了UART接口,即通用异步收发器(Universal Asynchronous Receiver/Transmitter);MCU的串口一般为遵循TTL电平的TTL串口;RS232、RS485、RS485则通常作为设备的外设串口使用。当然啦,要想了解更多串口的信息,请自行查阅相关资料吧,RK2206开发板板载2路串口,UART1用做了debug接口,UART0可以供用户使用,其接口如下:
本文将使用UART0来讲解。
4.2串口驱动介绍
RK2206硬件相关的驱动写好了的,是通过静态库的方式给出的,在device/rockchip/hardware目录下,库的名字是libhardware.a。
串口相关函数的头文件是在device/rockchip/rk2206/adapter/include/lz_hardware/目录下的uart.h文件中。
串口的使用需要了解UartAttribute结构体,这个结构用于配置串口的各个参数。
/**
* @brief Defines basic attributes of a UART port.
*
* @since 2.2
* @version 2.2
*/
typedef struct {
/** Baud rate */
unsigned int baudRate; //波特率
/** Data bits */
UartIdxDataBit dataBits; //数据长度
/** Stop bit */
UartStopBit stopBits; //停止位
/** Parity */
UartParity parity; //校验位
/** Rx block state */
UartBlockState rxBlock;
/** Tx block state */
UartBlockState txBlock;
/** Padding bit */
unsigned char pad;
} UartAttribute;
主要有以下API:
unsigned int LzUartInit(unsigned int id, const UartAttribute *param);//串口初始化
unsigned int LzUartRead(unsigned int id, unsigned char *data, unsigned int dataLen);//读定长字符
unsigned int LzUartWrite(unsigned int id, const unsigned char *data, unsigned int dataLen);//写定长字符
unsigned int LzUartPutc(unsigned int id, char c);//读取当字符
unsigned int LzUartDeinit(unsigned int id);//释放串口
4.3串口实例
RK2206开发板的仓库中已经有串口的例子,简单配置下就可以使用了。
修改 vendor/lockzhiner/rk2206/samples 路径下 BUILD.gn 文件,指定 uart_example 参与编译。
"./b6_uart:uart_example",
修改 device/rockchip/rk2206/sdk_liteos路径下 Makefile 文件,添加 -luart_example 参与编译。
hardware_LIBS = -lhal_iothardware -lhardware -luart_example
值得注意的是,官方的文档有误,请根据实际情况修改信息。
然后就可以使用串口了。
官方的例子默认是使用的串口0,笔者这里稍微修改uart_example.c的uart_process()函数。
void uart_process(void)
{
unsigned int ret;
UartAttribute attr;
unsigned char txStr[] = "HelloWorld!\n";
unsigned char rxStr[10];
LzUartDeinit(UART_ID);
attr.baudRate = 115200;
attr.dataBits = UART_DATA_BIT_8;
attr.pad = FLOW_CTRL_NONE;
attr.parity = UART_PARITY_NONE;
attr.rxBlock = UART_BLOCK_STATE_NONE_BLOCK;
attr.stopBits = UART_STOP_BIT_1;
attr.txBlock = UART_BLOCK_STATE_NONE_BLOCK;
PinctrlSet(GPIO0_PB6, MUX_FUNC2, PULL_KEEP, DRIVE_LEVEL2);
PinctrlSet(GPIO0_PB7, MUX_FUNC2, PULL_KEEP, DRIVE_LEVEL2);
ret = LzUartInit(UART_ID, &attr);
if (ret != LZ_HARDWARE_SUCCESS)
{
printf("%s, %d: LzUartInit(%d) failed!\n", __FILE__, __LINE__, ret);
return;
}
memset(rxStr, 0, sizeof(rxStr));
while (1)
{
printf("write: %s \n",txStr);
ret = LzUartWrite(UART_ID, txStr, strlen(txStr));
if (ret != LZ_HARDWARE_SUCCESS)
{
printf("%s, %d: LzUartInit(%d) failed!\n", __FILE__, __LINE__, ret);
return;
}
ret = LzUartRead(UART_ID, rxStr, 10);
printf("Read: %s\n",rxStr);
LOS_Msleep(2000);
}
return;
}
接下来根据前面的文件编译,下载固件。
Debug串口信息如下:
UART0串口信息如下:
当我们使用UART0发送信息,UART0和UART1打印信息如下:
UART0将接收到的信息通过debug串口又打印出来。
好了,串口的使用就到这里了。
欢迎访问我的网站
BruceOu的哔哩哔哩
BruceOu的主页
BruceOu的博客
BruceOu的CSDN博客
BruceOu的简书
BruceOu的知乎
欢迎订阅我的微信公众号
1.关注公众号[嵌入式实验楼]获取更多资讯