Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
UART
nuc980
NK-980IOT测评之UART测试
发布于 2022-03-10 22:47:05 浏览:1143
订阅该版
[tocm] ## 基本特征 - 10路全双工UART - 支持硬件流控 - 10类中断 - 支持IrDA SIR模式,支持 3/16 bit duration(IrDA的脉冲宽度) - 支持LIN主从模式,仅 UART1 /UART2 - 支持RS-485模式,9位模式,支持硬件或者软件控制nRTS控制传输方向 - 自动波特率测量和补偿 - 收发缓冲区各16字节,可配置接收缓冲区触发等级 - 各通道波特率独立配置 - 支持接收缓冲区到达阈值时产生nCTS信号 - 支持RS-485模式时地址匹配唤醒 - 支持8-bit接收缓冲区超时检测 - 可配置字节间隔(上一字节的停止位和下一字节的开始位间隔) - 选择LXT时钟源时波特率配置 9600 - 支持BREAK ERR( 拉低超过开始位+8位数据位时长,因为最长的持续低时间就是发送0x00时,9个bit的低,超过该时长就是异常了),帧错误,校验错误,缓冲区溢出检测 - 支持数据位5,6,7,8位 - 可配置奇偶校验和无校验,校验位产生和检测 - 可配置停止位1,1.5,2位 - 支持发送时产生break;接收时检测break - 支持PDMA (外设直接存储访问) 如下表: ![image.png](https://oss-club.rt-thread.org/uploads/20220310/a9e868cc45a189c20901f7bb57b8dac2.png.webp) ## 时钟 注意UARTx_CLK不能大于30*HCLK。 先通过UARTx_S选择时钟源是UPLL_FOUT,APLL_FOUT,32.768kHzLXT,4~24 MHz HXT四者之一,如果切换时钟源需要保证切换之前的和之后的时钟源都使能且稳定才能切换。 通过UARTx_N设置分频系数 通过设置UARTxCKEN使能时钟UARTx_CLK。 ![image.png](https://oss-club.rt-thread.org/uploads/20220310/b04b4945dd8d209b0f21cb166191d7bb.png.webp) ![image.png](https://oss-club.rt-thread.org/uploads/20220310/88eb70e97b112424bd1b72beed345a1d.png.webp) ## 功能框图 ![image.png](https://oss-club.rt-thread.org/uploads/20220310/1c1bd190a9756830a4acc8767ed82a03.png.webp) - TX_FIFO 支持16字节缓冲区,以减少中断次数 - RX_FIFO 支持16字节缓冲区,外加3bit错误标志BIF(BEAK中断标志),FEF(帧错误标志),PEF(校验错误标志),,以减少中断次数 - TX Shift Register 发送并转串移位寄存器 - RX Shift Register 接收串转并移位寄存器 - Modem Control and Status Register 调试解调和状态寄存器 - Baud Rate Generator 波特率产生,根据时钟源分频得到指定的波特率 - IrDA Encode 红外编码 - IrDA Decode 红外解码 - FIFO & Line Control and Status Register FIFO控制和状态寄存器 - Auto-Baud Rate Measurement 自动波特率检测 - Interrupt Control and Status Register 中断控制和状态 10类中断如下 ![image.png](https://oss-club.rt-thread.org/uploads/20220310/9010d2f8052025dba5caf9410ede62e7.png.webp) ## 配置 时钟配置 前置条件是需要的时钟源已经使能且稳定 - 选择时钟源UART0_S - 设置分频值 UART0_N - 使能外设时钟 UART0CKEN 复位外设 - UART0RST 引脚配置 - UARTx_RXD 0,1,2,3,4,5,6,7,8,9 - UARTx_TXD 0,1,2,3,4,5,6,7,8,9 - UARTx_nCTS 1,2,3,4,5,6,7,8,9 - UARTx_nRTS 1,2,3,4,5,6,7,8,9 ![image.png](https://oss-club.rt-thread.org/uploads/20220310/8b6525728685fbea0483d7414c329ba3.png.webp) ## 功能 支持四种功能UART, IrDA, LIN , RS-485通过UART_FUNCSEL选择。 ### 波特率产生模式 ![image.png](https://oss-club.rt-thread.org/uploads/20220310/118a41830711c1eb5af4fd0a86c10956.png.webp) IrDA 模式波特率生成器必须配置成模式 0。 ### 波特率补偿 实际就是增加了小数部分提高精度 UART_DAT[7:0]是整数部分 BRCOMP[7:0]是小数部分 BRCOMP[8]是BRCOMP[7:0]的校验位 BRCOMPDEC用于表示小数部分的正负(0负,1正) ### 自动波特率检测 测量完自动设置BRD (UART_BAUD[15:0]),且 BAUDM1, BAUDM0置位 检测原理是检测开始位到第一个上升沿为2 ABRDBITS时间,由ABRDBITS (UART_ALTCTL[20:19])设置该时间的实际长度,设置ABRDEN (UART_ALTCTL[18])开始自动检测。 过程如下 ![image.png](https://oss-club.rt-thread.org/uploads/20220310/7f80a24cff4affb24561364790dc2aa0.png.webp) 1. 设置 ABRDBITS (UART_ALTCTL[20:19]) 确定 UART RX 开始位下降沿到第一个上升沿 2 ABRDBITS 时长 2.设置ABRIEN (UART_INTEN[18]) 使能中断 3. 设置 ABRDEN (UART_ALTCTL[18]) 使能检测 4. 如果ABRDIF (UART_FIFOSTS[1])置位表示检测完成 5. 正常操作收发 6. 如果 ABRDTOIF (UART_FIFOSTS[2])设置则超时未检测到拉高 7. 跳到第3步骤重新检测. ### 配置帧间隔 DLY (UART_TOUT [15:8]) ![image.png](https://oss-club.rt-thread.org/uploads/20220310/15c8def61596c6afd29ad4bdb31d6de8.png.webp) ### FIFO控制和状态 ### 唤醒 nCTS引脚唤醒,接收缓冲区达到阈值唤醒,RS-485地址匹配唤醒,接收缓冲区超时唤醒 ![image.png](https://oss-club.rt-thread.org/uploads/20220310/74f23e0e4e1a534693cb75578a14ea5e.png.webp) ![image.png](https://oss-club.rt-thread.org/uploads/20220310/1d7c17c885a740b4ad64fb2cc41f5a23.png.webp) ![image.png](https://oss-club.rt-thread.org/uploads/20220310/2dbc77df6ebe6990ece79e20f494265e.png.webp) ![image.png](https://oss-club.rt-thread.org/uploads/20220310/95dc0c0fab4bef393b5ff724707977ac.png.webp) ### 中断 ![image.png](https://oss-club.rt-thread.org/uploads/20220310/3911e8555a94a0bc318264e9e9b904f1.png.webp) ![image.png](https://oss-club.rt-thread.org/uploads/20220310/32f7130ccf453de85065ada268a1d74a.png.webp) ### UART模式 ### IrDA SIR模式 ### LIN模式 ### 485模式 ### PDMA传输 ## 速率测试 使用UART1进行测试 查看原理图可看到UART1引脚如下 ![image.png](https://oss-club.rt-thread.org/uploads/20220310/9d02af535745be4a35a246c82b6b6da9.png.webp) 使用驱动API编写测试代码,驱动代码位于`\bsp\nuvoton\libraries\nuc980\rtt_port\drv_uart.c` `\bsp\nuvoton\nk-980iot\rtconfig.h`中定义`#define BSP_USING_UART1` `drv_uart.c`中`static struct nu_uart nu_uart_arr`可以看到串口的信息。 可以看到UART驱动的名字就是”uart1” 驱动相关的接口如下 ``` static const struct rt_uart_ops nu_uart_ops = { .configure = nu_uart_configure, .control = nu_uart_control, .putc = nu_uart_send, .getc = nu_uart_receive, #if defined(RT_SERIAL_USING_DMA) .dma_transmit = nu_uart_dma_transmit #else .dma_transmit = RT_NULL #endif }; ``` 关键代码如下: 参见`https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/uart` ``` static rt_device_t serial; rt_err_t rx_ind(rt_device_t dev,rt_size_t size) { /* 收到数据则原样返回 */ uint8_t buffer; while(rt_device_read(dev, 0, &buffer, 1)) { rt_device_write(dev, 0, &buffer, 1); } } void uart_api_init(void) { /* 串口设备句柄 */ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 初始化配置参数 */ /* step1:查找串口设备 */ serial = rt_device_find("uart1"); /* step2:修改串口配置参数 */ config.baud_rate = 921600; //修改波特率为 1000000 config.data_bits = DATA_BITS_8; //数据位 8 config.stop_bits = STOP_BITS_1; //停止位 1 config.bufsz = 128; //修改缓冲区 buff size 为 128 config.parity = PARITY_NONE; //无奇偶校验位 /* step3:控制串口设备。通过控制接口传入命令控制字,与控制参数 */ rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config); /* step4:打开串口设备。以中断接收及轮询发送模式打开串口设备 */ rt_device_open(serial, RT_DEVICE_FLAG_INT_RX); /* step5:设置接收回调函数 */ rt_device_set_rx_indicate(serial, rx_ind); } ``` 使用PL2303A的USB转串口线,CRT终端测试。 ![image.png](https://oss-club.rt-thread.org/uploads/20220310/64be4440c9788555b752bd3c268f3e62.jpg.webp) 修改波特率测试结果如下: 波特率 结果 说明 1000000 NG USB转串口线输出不准 921600 OK 收发正常 循环发送0xAA uint8_t ch=0xAA; rt_device_write(serial, 0, &ch, 1); 逻辑分析仪查看非常准确 ![image.png](https://oss-club.rt-thread.org/uploads/20220310/317ed7d8e257ee7eece8b0e0ae3d5cbd.png.webp) 测试USB转串口线发出的0x30用逻辑分析仪查看内容不对, ![image.png](https://oss-club.rt-thread.org/uploads/20220310/2c5fc63e71ab3d4b843aa28d2dacf9db.png.webp) 用仿真器查看接收的数据也不对 ![image.png](https://oss-club.rt-thread.org/uploads/20220310/0754b394e03e127c00573a8ff8f31a8a.png.webp) ## 代码 https://gitee.com/qinyunti/nk-980-iot-test.git ## 总结 串口输出可以达到1Mbps,输出波特率非常准确。由于手头的USB转串口线输出1Mbps时本身就不准,所以没法测串口的1Mbps输入。 串口驱动API的使用非常方便,实现值得参考。
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
qinyunti
这家伙很懒,什么也没写!
文章
30
回答
1
被采纳
0
关注TA
发私信
相关文章
1
rt thread 2.0.2 usart 接收缓存问题
2
关于STM32串口通信的问题
3
STM32F1+RTT串口接收终端数据丢失问题
4
UART TX丢数据?
5
RTT打开串口的时候如何自定义波特率呢?
6
STM32F4的USART数据接收问题
7
串口1234使用问题
8
串口接收回调函数
9
LPC18xx UART问题讨论
10
x1000串口配置的失败问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部