【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.mzph.cn/news/892184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

万界星空科技质量管理QMS系统具体功能介绍

一、什么是QMS系统,有什么价值? 1、QMS 系统即质量管理系统(Quality Management System)。 它是一套用于管理和控制企业产品或服务质量的集成化体系。 2、QMS 系统的价值主要体现在以下几个方面: 确保产品质量一致性…

【C++】B2099 矩阵交换行

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述题目描述输入格式输出格式输入输出样例输入 #1输出 #1 💯题目分析💯不同解法分析我的做法实现步骤:优点:不足&#…

Tableau数据可视化与仪表盘搭建-数据连接

目录 连接本地文件 课程操作 连接方式(实时/数据提取) 保存工作簿 筛选器 数据处理 连接数据有三种类型 第一种,连接到本地文件,例如Excel,csv,JSON等 第二种,连接到数据库,例…

Linux(Centos 7.6)命令详解:cd

1.命令作用 改变当前工作目录(change directory) 2.命令语法 Usage: cd [-L|[-P [-e]]] [dir] 3.参数详解 -L‌,当目标路径是符号链接时,强制使用符号链接,这是一个默认选项。-P‌,使用物理路径代替符号链接。-e‌&#xff0…

创建型模式-生成器模式

生成器模式是创建型模式的一种,生成器模式主要是解决在大类创建对象初始化的复杂的问题。将一个复杂类的创建拆分成几个部分,再根据具体需求创建初始对象,而不必每次都创建所有的部分。在需要创建包含有不同内容的对象的时候,可以…

系统日志优化---自定义springboot-starter日志组件供各个服务使用

在优化项目时发现各个微服务都有各自的接口调用日志逻辑,比如每个服务都定义一个aop类拦截,十分冗余,其实是可以做成starter被各个服务引用使用,前提要先了解一下springboot自动装配原理 创建springboot工程,如果是jdk…

Android V QCOM GPS | APN for LocationService

问题 在高通平台上验证 GPS 功能流程时候,block 在 APN 数据库的查询。经查,发现高通有内部实现的 LocationService(aosp源码和mtk都没有的类) 包含查询 TelephonyProvider 数据库的逻辑,直接原因是查询到 APN Protocol 不符合预期,直接fail。 关于 Android APN 数据列的…

计算机网络之---有线网络的传输介质

1. 双绞线(Twisted Pair Cable) 定义:双绞线是一种由两根绝缘铜线按一定螺旋方式绞合在一起的传输介质。常见的类型包括非屏蔽双绞线(UTP)和屏蔽双绞线(STP)。特点: UTP&#xff1a…

字玩FontPlayer开发笔记9 Tauri2打包应用

字玩FontPlayer开发笔记9 Tauri2打包应用 字玩FontPlayer是笔者开源的一款字体设计工具,使用Vue3 ElementUI开发,源代码:github | gitee 笔记 字玩目前是用Electron进行桌面端应用打包,但是性能体验不太好,一直想替…

spring mvc源码学习笔记之十

前面的文章介绍了用 WebApplicationInitializer 或者 AbstractAnnotationConfigDispatcherServletInitializer 来代替 web.xml 。 我们学 java web 的时候就知道,servlet 容器会自动加载 web.xml。 那么,疑问就来了,WebApplicationInitialize…

基于 Apache Commons Pool 实现的 gRPC 连接池管理类 GrpcChannelPool 性能分析与优化

基于 Apache Commons Pool 实现的 gRPC 连接池管理类 GrpcChannelPool 性能分析与优化 1. 输出关键信息的代码示例 日志记录方法 使用以下代码记录连接池的关键信息,帮助分析连接池的状态和性能瓶颈: import org.apache.commons.pool2.impl.GenericO…

小程序开发-页面事件之上拉触底实战案例

🎥 作者简介: CSDN\阿里云\腾讯云\华为云开发社区优质创作者,专注分享大数据、Python、数据库、人工智能等领域的优质内容 🌸个人主页: 长风清留杨的博客 🍃形式准则: 无论成就大小,…

STM32-笔记38-I2C-oled实验

一、什么是I2C? I2C总线,全称Inter-Integrated Circuit(互连集成电路),是一种由Philips(现NXP半导体)公司在1980年代初开发的同步 串行 半双工通信总线。 二、有了串口通信为什么要使用I2C&…

《C++11》右值引用深度解析:性能优化的秘密武器

C11引入了一个新的概念——右值引用,这是一个相当深奥且重要的概念。为了理解右值引用,我们需要先理解左值和右值的概念,然后再理解左值引用和右值引用。本文将详细解析这些概念,并通过实例进行说明,以揭示右值引用如何…

libevent定时器的性能测试(与rte_timer对比)

前言 接着上篇文章,rte_timer的性能测试https://blog.csdn.net/jacicson1987/article/details/144997298 进行常用的libevent的定时器测试,看看有什么区别,测试方法还是一样,代码放在下面。 测试方法 100万个定时器&#xff0…

ios越狱脚本巨魔商店安装教程

使用爱思助手安装 安装爱思助手:在电脑上安装 iTunes 和爱思助手,并使用 Apple ID 登录2。 IPA 签名:打开爱思助手,选择工具箱中的 IPA 签名。点击添加 IPA 文件,选择下载的 TrollInstallerX.ipa 文件。选择使用 Apple…

MySQL Windows 11 的 MySQL 配置文件 (my.ini) 路径查找指南

✅ Windows 11 的 MySQL 配置文件 (my.ini) 路径查找指南 在 Windows 11 上,MySQL 的 ini 配置文件(通常是 my.ini 或 my.cnf)的位置取决于 MySQL 的安装方式。下面是一些常见的路径和方法来找到这个配置文件。 🔍 方法 1&#…

C# 事件

目录 1、事件模型的5个组成部分2、使用内置委托类型声明事件2.1 EventHandler2.1.1 &#xff1f;2.1.2 this2.1.3 使用匿名函数和lamda表达式2.1.3.1 匿名函数2.1.3.2 lamda表达式 2.1.4 异常处理 2.2 EventHandler<TEventArgs> 3、使用自定义委托类型声明事件3.1 事件的…

英伟达 RTX 5090 显卡赋能医疗大模型:变革、挑战与展望

一、英伟达 RTX 5090 与 RTX 4090 技术参数对比 1.1 核心架构与制程工艺 在探讨英伟达 RTX 4090 与 RTX 5090 的差异时&#xff0c;核心架构与制程工艺无疑是最为关键的基础要素&#xff0c;它们从根本上决定了两款显卡的性能上限与应用潜力。 1.1.1 核心架构差异 RTX 4090…

【LevelDB 和 Sqlite】

关于 LevelDB的小总结&#xff1a; LevelDB 和 SQLite 是两种不同类型的数据库: 1. LevelDB: 特点:NoSQL 数据库键值(Key-Value)存储由 Google 开发数据按键排序存储支持批量操作简单的 Get/Put/Delete 接口 示例操作: key1 -> value1 key2 -> value2 2. SQLite: 特点…