当前位置: 首页 > news >正文

【W800】UART 的使用与问题

1.开发环境

  • OS: Windows 11
  • 开发板:海凌科 HLK-W800-KIT-PRO
  • SDK: W80X_SDK_v1.00.10
  • IDE: CSKY Development Kit

2.UART 使用

在 SDK 中创建文件 uart_test.huart_test.c,然后在 CDK 项目中添加这两个文件,CDK 会自动 include 头文件。
在这里插入图片描述
uart_test.h

#ifndef UART_TEST_H
#define UART_TEST_H#include "wm_include.h"void uart_echo_test(void);#endif // UART_TEST_H

uart_test.c

#include "uart_test.h"
#include "wm_gpio_afsel.h"u8 rx_buf[1024];
u16 rx_buf_len;void uart_test_rx_callback(u16 len, void *priv_data)
{printf("%d\n", len);rx_buf_len += len;
}void uart_echo_test(void)
{wm_uart1_tx_config(WM_IO_PB_06);wm_uart1_rx_config(WM_IO_PB_07);tls_uart_options_t uart_opt;uart_opt.baudrate = TLS_UART_BAUDRATE_115200;uart_opt.charlength = TLS_UART_CHSIZE_8BIT;uart_opt.paritytype = TLS_UART_PMODE_DISABLED;uart_opt.flow_ctrl = TLS_UART_FLOW_CTRL_NONE;uart_opt.stopbits = TLS_UART_ONE_STOPBITS;tls_uart_port_init(TLS_UART_1, &uart_opt, 0);tls_uart_rx_callback_register(TLS_UART_1, (s16(*)(u16, void *))uart_test_rx_callback, NULL);while (1){if (rx_buf_len > 0){u8 rx_cb_len = tls_uart_read(TLS_UART_1, rx_buf, rx_buf_len);tls_uart_write(TLS_UART_1, rx_buf, rx_cb_len);rx_buf_len -= rx_cb_len;}}
}

最后在 UserMain() 中调用 uart_test() 就行了,记得 include。

3. 解释

W800 的 UART 流程图(RX)
在这里插入图片描述
uart fifo 接收不固定,比如一次性接收的数据超过 16 bytes,就会被分成多个,例如 28 bytes 就会被分成 16,8,4 bytes(奇怪的特性)。
如果想要获取接收的数据,就必须通过 tls_uart_read() 从 receive buffer 中读取,它会返回 uart fifo 接收的数据长度。

遇到的问题

SDK 给的 UART API 很奇怪,中断会去调用 callback function,所以你需要先注册。根据源码

// wm_uart.c
......rxlen = rx_fifocnt;while (rx_fifocnt-- > 0){ch = (u8)port->regs->UR_RXW;recv->buf[recv->head] = ch;recv->head = (recv->head + 1) & (TLS_UART_RX_BUF_SIZE - 1);if (port->rx_callback != NULL && rx_byte_cb_flag){port->rx_callback(1, port->priv_data);}}
......

可以看到是 fifo_cnt 递减然后装进 recv->buf 里,但是这里是不会调用 port->rx_callback 的,因为 rx_byte_cb_flag 一直是 0,最后调 callback 的其实是这个

        if (rxlen && port->rx_callback != NULL && !rx_byte_cb_flag){port->rx_callback(rxlen, port->priv_data);}

如果是超过 16 byte,那么每次 callback 的 rxlen 就会出现这种情况
在这里插入图片描述


http://www.mrgr.cn/news/83134.html

相关文章:

  • 【Linux】29.Linux 多线程(3)
  • 学习率调整策略 | PyTorch 深度学习实战
  • unity学习28:灯光light相关 类型type,模式mode等
  • Synchronized和ReentrantLock面试详解
  • 通过Python编写的中国象棋小游戏
  • 数据结构 图
  • 电脑硬盘系统迁移及问题处理
  • C# 特性
  • Qt 5.14.2 学习记录 —— 팔 QWidget 常用控件(3)
  • 个人博客搭建(二)—Typora+PicGo+OSS
  • 学习记录:C++基类构造函数的调用:理解和实践
  • selenium+pyqt5自动化工具总结
  • 夯实前端基础之HTML篇
  • 算法 -归并排序
  • 华为OD E卷(100分)50-预订酒店
  • 示波器Oscilloscope的使用方法
  • (长期更新)《零基础入门 ArcGIS(ArcScene) 》实验七----城市三维建模与分析(超超超详细!!!)
  • 学习记录:C++ 中 const 引用的使用及其好处
  • Spring AMQP-保证消费者消息的可靠性
  • 通俗易懂之线性回归时序预测PyTorch实践
  • 在 Ubuntu 22.04 上部署 AppArmor 应用安全教程
  • 现场展示deepseek VS openAI o1模型大对比
  • 论文笔记:FDTI: Fine-grained Deep Traffic Inference with Roadnet-enriched Graph
  • STM32供电参考设计
  • Windows下安装最新版的OpenSSL,并解决OpenSSL不是当前版本的问题,或者安装不正确的问题
  • 如何在 Ubuntu 22.04 上配置 Logrotate 高级教程