【产品应用】AWorksLP 样例详解(MR6450)——UART

aworkslp 对外设进行了高度抽象化,为同一类外设提供了相同的接口,应用程序可以轻松跨平台。本文以mr6450 平台为例,介绍aworkslp uart 外设基本用法。
简介
uart(universal asynchronous receiver/transmitter)是一种通用异步收发传输器,其使用串行的方式在双机之间进行数据交换,实现全双工通信。数据引脚仅包含用于接收数据的rxd和用于发送数据的txd。数据在数据线上一位一位的串行传输,要正确解析这些数据,必须遵循uart协议,以下简述几个关键的概念:
波特率波特率决定了数据传输速率,其表示每秒传送数据的位数,值越大,数据通信的速率越高,数据传输得越快。常见的波特率有4800、9600、14400、19200、38400、115200等等,若波特率为115200,则表示每秒钟可以传输115200位(注意:是bit,不是byte)数据。
空闲位数据线上没有数据传输时,数据线处于空闲状态。空闲状态的电平逻辑为“1”。
起始位起始位表示一帧数据传输的开始,起始位的电平逻辑是“0”。数据位
紧接起始位后,即为实际通信传输的数据,数据的位数可以是5、6、7、8等,数据传输时,从最低位开始依次传输。奇偶校验位
奇偶校验位用于接收方对数据进行校验,及时发现由于通信故障等问题造成的错误数据。奇偶校验位是可选的,可以不使用奇偶校验位。奇偶校验有奇校验和偶校验两种形式,该位的逻辑电平与校验方法和所有数据位中逻辑“1”的个数相关。1. 奇校验:通过设置该位的值(“1”或“0”),使该位和数据位中逻辑“1”的总个数为奇数。例如,数据位为8位,值为:10011001,“1”的个数为4个(偶数),则奇校验时,为了使“1”的个数为奇数,就要设置奇偶校验位的值为“1”,使“1”的总个数为5个(奇数)。
2. 偶校验:通过设置该位的值(“1”或“0”),使该位和数据位中逻辑“1”的总个数为偶数。例如,数据位为8位,值为:10011001,“1”的个数为4个(偶数),则偶校验时,为了使“1”的个数为偶数,就要设置奇偶校验位的值为0,使“1”的个数保持不变,为4(偶数)。
通信双方使用的校验方法应该一致,接收方通过判断“1”的个数是否为奇数(奇校验)或偶数(偶校验)来判定数据在通信过程中是否出错。
停止位
停止位表示一帧数据的结束,其电平逻辑为“1”,其宽度可以是1位、1.5位、2位。即其持续的时间为位数乘以传输一位的时间(由波特率决定),例如,波特率为115200,则传输一位的时间为1/115200秒,约为8.68us。若停止位的宽度为1.5位,则表示停止位持续的时间为:1.5 × 8.68us ≈ 13us。常见的帧格式为:1位起始位,8位数据位,无校验,1位停止位。由于起始位的宽度恒为1位,不会变化,而数据位,校验位和停止位都是可变的,因此,往往在描述串口通信协议时,都只是描述其波特率、数据位,校验位和停止位,不再单独说明起始位。
注意:
通信双方必须使用完全相同的配置,包括波特率、起始位、数据位、停止位等。如果配置不一致,则通信数据会错乱,不能正常通信。在通信中,若出现乱码的情况,应该首先检查通信双方所使用的配置是否一致。
接口介绍
表1 函数列表
函数原型
简要描述
aw_err_t  aw_serial_flush_read (int fd);
串口刷新读取
aw_err_t  aw_serial_dcb_set (int fd, const struct  aw_serial_dcb *p_dcb);
配置串口设备参数
aw_err_t  aw_serial_dcb_get (int fd, struct  aw_serial_dcb *p_dcb);
获取串口设备配置参数
aw_err_t aw_serial_timeout_set  (int fd, struct aw_serial_timeout *p_cfg);
配置超时参数
aw_err_t aw_serial_timeout_get  (int fd, struct aw_serial_timeout *p_cfg);
获取超时参数
下表为uart接口相关结构体类型。表2 结构体类型表
类型
简要描述
struct aw_serial_dcb
串口配置结构描述
struct aw_serial_timeout
串口超时设置
uart 配置信息说明:
1. aw_serial_dcb:
                    struct aw_serial_dcb {    uint32_t    baud_rate;    uint32_t    byte_size:4;    uint32_t    f_parity:1;    uint32_t    parity:1;    uint32_t    stop_bits:2;    uint32_t    f_ctsflow:1;    uint32_t    f_rtsctrl:2;    uint32_t    f_dsrsensitivity:1;    uint32_t    f_dsrflow:1;    uint32_t    f_dtrctrl:2;    uint32_t    f_outx:1;    uint32_t    f_inx:1;    uint32_t    f_fast_respond_recv:1;    uint32_t    f_dummy:14;    uint16_t    xon_lim;    uint16_t    xoff_lim;    char     xon_char;    char    xoff_char;};
成员详解:
baud_rate:波特率;
byte_size:数据位宽度,范围:[5:8];
f_parity:奇偶校验,1:使能 0:禁能;
parity:校验方法;
表3 串口校验方法取值表
宏定义
含义
aw_serial_evenparity
偶效验
aw_serial_oddparity
奇效验
stop_bits:停止位数;表4 串口停止位数取值表
宏定义
含义
aw_serial_onestopbit
1 位停止位
aw_serial_one5stopts
1.5  位停止位
aw_serial_twostopbits
2 位停止位
aw_serial_stop_invalid
0 表示无效停止位
f_ctsflow:监控cts(clear-to-send)信号作输出流控,1:cts无效时数据发送被挂起,0:禁能;f_rtsctrl:设置rts(request-to-send)流控;表5 串口设备rts(request-to-send)流控取值表
宏定义
含义
aw_serial_rts_handshake
硬件流控
aw_serial_rts_disable
软件控制rts无效
aw_serial_rts_enable
软件控制rts有效
aw_serial_rts_invalid
无效rts
f_dsrsensitivity:设置dsr_sensitivity,1:对dsr信号敏感,除非dsr信号有效,否则将忽略所有接收的字节;f_dsrflow:是否监控dsr(data-set-ready信号来做输出流控),1:若dsr无效时数据发送被挂起,直至dsr有效;f_dtrctrl:设置dtr(data-termial-ready)流控;表6 串口设备dtr(data-terminal-ready)流控取值表
宏定义
含义
aw_serial_dtr_handshake
硬件流控
aw_serial_dtr_disable
软件控制dtr无效
aw_serial_dtr_enable
软件控制dtr有效
aw_serial_dtr_invalid
无效dtr
f_outx:xon/xoff流量控制在发送时是否可用。1:当xoff值被收到时,发送停止;当xon值被收到时,发送继续;f_inx:xon/xoff流量控制在接收时是否可用。1:当接收缓冲区中空余容量小于xoff_lim字节时,发送xoff字符;当接收缓冲区中已有xon_lim字节的空余容量时,发送xon字符,占1位;f_fast_respond_recv:快速响应接收 1:使能 0:禁能;注解:
1.该配置项适用于接收时间敏感型应用,例如modbus;
2.该配置项实现通用的手段是将串口接收fifo设置为1,当接收到一个数据后就产生接收中断。对于没有fifo的串口来说,这个设置也许会被忽略。
f_dummy:保留位;
xon_lim:在xon字符发送前接收缓冲区内空余容量的最小字节数;xoff_lim:在xoff字符发送前接收缓冲区内空余容量的最大字节数;xon_char:指定xon字符;xoff_char:指定xoff字符。2. aw_serial_timeout:
    struct aw_serial_timeout { uint32_t rd_timeout; uint32_t rd_interval_timeout;}
成员详解:
rd_timeout:读超时时间;
rd_interval_timeout:码间超时。
使用样例
aworkslp sdk相关使用请参考《aworkslp sdk快速入门(mr6450)——开箱体验》一文,本文不在赘述。
‍1. uart0收发功能
{sdk}\demos\peripheral\ serial路径下为通用uart例程,例程具体代码如下:
                                                                                                        #include aworks.h#include aw_task.h#include aw_delay.h#include aw_serial.h#include aw_ioctl.h#include aw_fcntl.h#include aw_application_autoconf.h#include aw_unistd.h#include aw_vdebug.h#include rtk_autoconf.h/** * \brief 串口 demo * \return 无 */aw_local void* __task_handle (void *parg){ char buf[32]; int len = 0; struct aw_serial_dcb dcb; aw_err_t ret; struct aw_serial_timeout timeout; int fd;
fd = aw_open(config_demo_serial_device_name,aw_o_rdwr,0); if(fd 0) { aw_write(fd, buf, len); aw_kprintf(%s\r\n,buf); } }
aw_close(fd); return 0;}
aw_task_decl(serial_tsk, 4096);/******************************************************************************/void demo_serial_int_entry (void){ aw_task_id_t tsk;
tsk = aw_task_init( serial_tsk, serial int demo, 12, 4096, __task_handle, (void *)null); if (tsk == null) { aw_kprintf(serial int demo task create failed\r\n); return; }
if (aw_task_startup(tsk) != aw_ok) { aw_task_terminate(serial_tsk); }}
例程默认使用/dev/uart0对应开发板duart丝印串口,其引脚位置如图1所示:
图1 uart0排针
上述代码中创建了一个任务,在任务中实现uart收发功能。使用aw_serial_dcb_get接口获取串口当前的配置信息,修改波特率为115200,8个数据位,1位停止位,无奇偶校验。使用aw_serial_dcb_set接口设置串口。使用aw_serial_timeout_get获取串口时间相关配置信息,修改读总超时为1s,码间超时为50ms,使用aw_serial_timeout_set设置串口。
在aw_forever 循环中使用aw_read接口读取接收到的串口数据,若读取到数据则使用aw_write接口把读取到数据通过该串口发送回去,以此来实现回显功能。
但由于/dev/uart0默认为shell所使用的串口,在shell组件中已开启回显,故此时实验现象如图2所示,会将接收到的数据输出两次,若需实现单次回显,可修改shell组件所引用串口,或修改例程使用的uart设备,具体操作参考下节内容。
图2 串口打印结果
2. uart5收发功能
串口例程中默认使用的是/dev/uart0,为与例程现象描述一致,故将其修改为/dev/uart5。在开发板丝印urx1与utx1对应设备/dev/uart5,urx2与utx2对应设备为/dev/uart10,如图3、图4、图5所示。
图3 排针处串口
图4 排针原理图
图5 uart1对应uart5
2.1 打开config 配置脚本,选择例程使用串口为/dev/uart5, 如图6所示,保存后重新build 工程。
图6 uart1对应uart5
2.2 将usb 转串口接到开发板排针丝印utx1与urx1 的位置,重新编译下载运行固件,会发现发送数据后不会再重复回复两条相同的数据如图7所示。
图7 串口打印信息
至此,uart设备的收发功能介绍完毕,更多外设的使用介绍请关注后续推文。

一名程序员年前的抉择
基于单片机的智能型客车超载监控系统设计
苹果自动驾驶新专利曝光 涉及一种新型车辆警报系统
华为nova8Pro将携手王者荣耀联合首发其90FPS超高帧率版本,iQOO隔空喊话KPL
拿森成功入选2021年新能源智能汽车创新企业榜单
【产品应用】AWorksLP 样例详解(MR6450)——UART
中国是人工智能专利布局最多的国家
智能家居有什么新机遇
大气污染物监测设备是干什么用的
综述:功率电感器和变压器
开发运营最佳实践
MWC聚焦5G 5G拓展智能安防应用
教你识别背照式和堆栈式摄像头元件的区别
让节能灯具面向未来:意法半导体推出低失真高压LED驱动器
台积电3nm芯片有望今年量产 用于MacBook机型
台积电斩获华为第二款5G芯片麒麟820大单,采用台积电7nm制程工艺
2023中国无人配送产业发展高峰论坛
TI内部围绕电力电子领域打造出矩阵式的团队体系
浅谈孤岛效应的检测和防治
易观智库对于智能硬件用户画像解析