RT-Thread uart2串口dma idle接收不断帧

2023-10-27

硬件STM32F407,IDE使用RT-Thread Studio。

uart2串口使用这两个引脚:

功能 IO端口
UART2-TX PA2
UART2-RX PA3



UART2 - DMA接收配置

  • 先使能DMA接收,RX缓冲区可以稍微调大些。
    在这里插入图片描述

  • board.h 中添加宏,来使能 RX_DMA。
    在这里插入图片描述

  • 既然都打开了 board.h,再顺便把时钟源改为外部晶振。
    在这里插入图片描述

  • 编写 UART2 DMA 接收测试代码。

  • 发生接收事件后,会触发回调。回调内记录本次接收的消息长度,并发送信号量。线程内接收到信号量后开始执行后续的任务,调试输出接收到的长度和内容。
    main.c

#include <rtthread.h>

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

#include "drivers/serial.h"
rt_device_t u2_dev = RT_NULL;
struct serial_configure u2_cfg = RT_SERIAL_CONFIG_DEFAULT;
struct rt_semaphore u2_rx_sem;
rt_thread_t u2_recv_thread;

rt_size_t u2_rx_len = 0;
rt_err_t u2_rx_callback(rt_device_t dev, rt_size_t size)
{
    u2_rx_len = size; // 记录消息长度
    rt_sem_release(&u2_rx_sem);
    return RT_EOK;
}

void u2_recv_entry(void *parameter)
{
    char rx_buf[256];
    rt_size_t len = 0;
    while (1) {
        rt_sem_take(&u2_rx_sem, RT_WAITING_FOREVER); // 等待信号量
        len = rt_device_read(u2_dev, 0, rx_buf, u2_rx_len);
        rx_buf[len] = '\0';
        rt_kprintf("u2 recv: %d, %s\n", len, rx_buf);
    }
}

int main(void)
{
    rt_err_t err;

    u2_dev = rt_device_find("uart2");
    if (u2_dev == RT_NULL) {
        LOG_E("uart2 rt_device_find failed");
        return -EINVAL;
    }

    //rt_device_open(u2_dev, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
    err = rt_device_open(u2_dev, RT_DEVICE_FLAG_DMA_RX);
    if (err < 0) {
        LOG_E("uart2 rt_device_open failed");
        return err;
    }

    rt_device_control(u2_dev, RT_DEVICE_CTRL_CONFIG, (void *)&u2_cfg);

    rt_device_set_rx_indicate(u2_dev, u2_rx_callback); // 设置接收回调函数

    err = rt_sem_init(&u2_rx_sem, "u2_rx", 0, RT_IPC_FLAG_FIFO);
    if (err < 0) {
        LOG_E("uart2 rt_sem_init failed");
        return err;
    }

    u2_recv_thread = rt_thread_create("u2_recv", u2_recv_entry, NULL, 1024*2, 8, 5); // 优先级8,时间片长度5

    rt_thread_startup(u2_recv_thread);

    rt_device_write(u2_dev, 0, "hello", 5);

    return RT_EOK;
}



编译错误解决

  • 编译后会提示缺少文件等错误。按如下更改。

  • 改动RTT源码,添加缺少的头文件。
    在这里插入图片描述

  • 再配置交叉编译器include目录,增加如下:

"${workspace_loc:/${ProjName}/rt-thread/components/drivers/include/drivers}"
"${workspace_loc:/${ProjName}/rt-thread/components/drivers/include/ipc}"

在这里插入图片描述

  • 添加目录时请使用工作空间,使用的是相对工程文件的路径。(文件系统指的是磁盘的绝对路径,复制工程又要重新配置)
    在这里插入图片描述



运行测试RX DMA接收,解决断帧

  • 接收正常,但当接收的一帧字节数较长时,非常容易出现断帧。
    在这里插入图片描述

  • 断帧的解决方法我参考这个,实测好用:
    使用RT-Thread的串口空闲+DMA收发数据

  • 找打 drv_usart.c,注释掉这两句。
    在这里插入图片描述

  • 编译验证,确认经如上修改后就没有了断帧。

  • 但当接收的一帧字节数大于缓冲区容量时,以前的内容会被覆盖。所以在硬件允许时,uart rx缓冲区可设置的大一些。

  • 测试发送一帧270字节,当缓冲区容量为256字节时,仅提示收到14字节,前面的内容被覆盖。
    在这里插入图片描述
    在这里插入图片描述



关于RT-Thread的学习

  本来自己是没计划去学习 RT-Thread 的,但在MCU国产化替代进程中,发现大多数IC厂商提供的支持十分有限,可以说几乎都是在近几年内以STM32为蓝本进行的仿制,其中隐藏的雷坑单靠个人摸索去解决相当不推荐。再加之大多数原厂Demo是裸机的,很少有RTOS的。于是就想到了国产的 RT-Thread。

  试用了 RT-Thread Studio 感觉相当好用,MCU的外设驱动不用用户操心,又有比较多的扩展组件可用,开发者可在熟悉RT-Thread的基础上,专注于应用的开发。其对国产MCU的支持正在逐步完善,暂时有 AT32、APM32、CH32、ES32、GD32、MM32 等,虽然只支持部分型号,但个人目前只中意AT32F403A,好巧不巧正好有它的芯片支持包。希望国产MCU能抓住替换潮机会,抓紧完善生态,不然等价格回落又会有一大批人转回STM32。望疫情早些过去,想念前三年芯片的价格。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RT-Thread uart2串口dma idle接收不断帧 的相关文章

  • SpringCloudAlibaba之Sentinel 自定义限流逻辑处理

    SentinelResource 自定义限流逻辑处理 Sentinel 提供了 SentinelResource注解用于定义资源 并提供了AspectJ的扩展用于自定义资源 处理BlockException等 案例复习 之前我们用过这个注解
  • 简单理解与实验生成对抗网络GAN

    原文 https blog csdn net on2way article details 72773771 GAN网络是近两年深度学习领域的新秀 火的不行 本文旨在浅显理解传统GAN 分享学习心得 现有GAN网络大多数代码实现使用pyth

随机推荐

  • 【一分钟解决】Matplotlib 中英文混排多字体设置问题

    文章目录 中西混排示例 样图 代码 解决思路 扩展 查看可调用字体 参考链接 本文讨论基于 macOS 系统 部分示例代码可能需要根据操作系统微调 中西混排示例 样图 代码 import matplotlib pyplot as plt c
  • Vue Cli3.0 全局引入 less 变量

    我们开发过程中经常会使用很多 less 全局样式 但是 vue 文件中想使用 less 变量 就需要挨个引入 极其麻烦 现在我来揭秘 1 定义一个 themes less 文件 将你想用的全局变量装入其中 primary color 32b
  • [C#] WebSocket 客户端+服务端 轻松实现

    资料转自 http www cnblogs com zhuweisky p 3930780 html 技术原理 https www zhihu com question 20215561 Websocket库介绍 https www cnb
  • 积分电路与低通滤波器

    一种积分电路如图1所示 当函数发生器输出方波时 理论上一个理想的积分器应该输出三角波 然而 实际应用中 在积分电容两端常常并联一个大电阻 如图2所示 这是因为实际应用中的运放具有输入失调电压和偏置电流 如果在实际应用中按照图1所示搭建积分电
  • ready()事件与load()事件的区别

    页面加载时触发ready 事件 ready 事件类似于onLoad 事件 但前者只要页面的DOM结构加载后便触发 而后者必须在页面全部元素加载成功才触发 ready 可以写多个 按顺序执行 此外 下列写法是相等的 document read
  • 深入理解Java虚拟机jvm-栈溢出-对象引用过多java.lang.StackOverflowError

    对象引用过多 示例 结果 原因分析 示例 栈溢出 栈内存过小 对象引用过多 java lang StackOverflowError 输出 stack length 344 public class Demo3 private static
  • CTFshow sql注入 上篇(web171-220)

    目录 前言 题目 web 171 万能密码 web 172 回显内容过滤 base64或者hex编码绕过 web 173 回显内容过滤 base64或者hex编码绕过 web 174 布尔盲注丶trim盲注丶replace替换字符 web
  • Cmake 中 file、message和add_executable解析

    file 为cmake中文件操作时用的语句 比如文件的创建 读写 等操作都是通过file来操作的 GLOB file GLOB variable RELATIVE path FOLLOW SYMLINKS globbing expressi
  • DVWA靶场下的sql注入之文件读写

    DVWA的安装配置在我上一篇文章上写过了 不知道的可以去看看 这里直接讲sql注入如何获得文件读写权限 sql注入读写的根本条件 1 数据库用户得是高权限用户 root 2 数据库下的secure file priv不是null 如果是也可
  • 文档在线预览(三)使用js前端实现word、excel、pdf、ppt 在线预览

    关于实现文档在线预览的做法 之前文章提到了的两种实现方式 1 通过将文档转成图片 详见 文档在线预览 一 通过将txt word pdf转成图片实现在线预览功能 2 将文档转成html 详见 文档在线预览 二 word pdf文件转html
  • 运放自激振荡的补偿

    运放的相位补偿 为了让运放能够正常工作 电路中常在输入与输出之间加一相位补偿电容 1 关于补偿电容 理论计算有是有的 但是到了设计成熟阶段好象大部分人都是凭借以前的调试经验了 一般对于电容大小的取值要考虑到系统的频响 简单点说加的电容越大
  • 职场工作与生活

    序言 和很多在CSDN的博主一样 大家在工作之后就很少或者是不再回到CSDN 确实自己也一年多没上了 因为可能当初大家在这就是为了记录和分享当初自己学习技术的东西 而大家走出象牙塔开始工作后 发生了很大的转变 在国内大多数搞技术的工作要求保
  • Beam数据流水线——Pipeline

    目录 Beam简介 基本概念 数据流水线 Beam数据流水线的应用 Beam数据流水线的处理模型 Beam数据流水线的错误处理 单Transform错误处理 多步骤Transform错误处理 Beam简介 Apache Beam 是Goog
  • 工厂的进化

    本文从一个简单示例的需求不断衍化过程 来分析理解简单工厂 工厂方法 抽象工厂模式 首先看一下初始示例 public interface Car public void drive public class BenzCar implement
  • js 实现刷新页面 保留当前tab切换状态

    div class mes tab div class tab tit flexbetween span 报考指南 span span 考研院校 span span 考研专业 span span 备考资料 span span 复试调剂 sp
  • ImportError: No module named typing

    python版本 2 7 错误 使用pip时出现该错误 Traceback most recent call last File C Python27 Scripts pip script py line 9 in load entry p
  • iframe如何发送请求_Vue 中使用 Iframe 踩坑记

    背景 创业项目使用的 Vue 开发前端 最近在开发的一个需求涉及到了 Iframe 的使用 为了让父子页面能够正常通信 头都搞大了 不过最终是解决了问题 写篇文章记录下 利人利己 难点 之前没有在 Vue 中使用过 Iframe 网上的相关
  • 【环境搭建】Docker上搭建sqli-labs漏洞环境

    目录 1 sqli labs简介 2 Docker搭建sqli labs 3 总结 参考文献 1 sqli labs简介 sq Ii labs是一款学习SQL注入的开源平台 共有75种不同类型的注入 官方介绍如下 SQLI LABS is
  • 基于VMD-SSA-LSTM的多维时序光伏功率预测

    目录 1 主要内容 变分模态分解 VMD 麻雀搜索算法SSA 长短期记忆网络LSTM 2 部分代码 3 程序结果 4 下载链接 1 主要内容 之前分享了预测的程序基于LSTM的负荷和可再生能源出力预测 核心部分复现 该程序预测效果比较好 并
  • RT-Thread uart2串口dma idle接收不断帧

    硬件STM32F407 IDE使用RT Thread Studio uart2串口使用这两个引脚 功能 IO端口 UART2 TX PA2 UART2 RX PA3 UART2 DMA接收配置 先使能DMA接收 RX缓冲区可以稍微调大些 b