开发环境: 开发系统:Ubuntu 20.04
4.1串口简介串口是一个泛称,UART、TTL、RS232、RS485、RS422都可以说是串口。一般的MCU内部集成了UART接口,即通用异步收发器(UniversalAsynchronous 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 UARTport.
- *
- * @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 intLzUartInit(unsigned int id, const UartAttribute *param);//串口初始化
- unsigned intLzUartRead(unsigned int id, unsigned char *data, unsigned int dataLen);//读定长字符
- unsigned intLzUartWrite(unsigned int id, const unsigned char *data, unsigned int dataLen);//写定长字符
- unsigned intLzUartPutc(unsigned int id, char c);//读取当字符
- unsigned intLzUartDeinit(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:%sn",rxStr);
- LOS_Msleep(2000);
- }
-
- return;
- }
复制代码
接下来根据前面的文件编译,下载固件。 Debug串口信息如下:
UART0串口信息如下:
当我们使用UART0发送信息,UART0和UART1打印信息如下:
UART0将接收到的信息通过debug串口又打印出来。 好了,串口的使用就到这里了。
|