RT-Thread STM32F407 DMA

news2024/11/18 17:33:39

这里以串口的DMA方式接收为例,串口1进行调试,串口2进行DMA接收

  • 第一步,进入RT-Thread Settings配置DMA
    在这里插入图片描述

  • 第二步,进入board.h,定义串口及DMA宏
    在这里插入图片描述

  • 第三步,回到main.c,配置串口及DMA模式
    在这里插入图片描述

  • 第四步,定义消息队列,用于数据读取
    在这里插入图片描述

  • 第五步,在串口接收回调函数中,将“消息”入队
    在这里插入图片描述

  • 第六步,在主线程中,读取队列中的串口数据
    在这里插入图片描述

综上,main.c

#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>

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

#define SAMPLE_UART_NAME       "uart2"      /* 串口设备名称 */

/* 串口接收消息结构*/
struct rx_msg
{
    rt_device_t dev;
    rt_size_t size;
};
/* 串口设备句柄 */
static rt_device_t serial;

/* 初始化配置参数 */
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;

/* 消息队列控制块 */
static struct rt_messagequeue rx_mq;

/* 接收数据回调函数 */
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
    struct rx_msg msg;
    rt_err_t result;
    msg.dev = dev;
    msg.size = size;

    result = rt_mq_send(&rx_mq, &msg, sizeof(msg));
    if ( result == -RT_EFULL)
    {
        /* 消息队列满 */
        rt_kprintf("message queue full!\n");
    }
    return result;
}

static void serial_thread_entry(void *parameter)
{
    struct rx_msg msg;
    rt_err_t result;
    rt_uint32_t rx_length;
    static char rx_buffer[RT_SERIAL_RB_BUFSZ + 1];

    while (1)
    {
        rt_memset(&msg, 0, sizeof(msg));
        /* 从消息队列中读取消息*/
        rt_thread_mdelay(5);
        result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER);
        //rt_thread_mdelay(50);
        if (result == RT_EOK)
        {
            /* 从串口读取数据*/
            rx_length = rt_device_read(msg.dev, 0, rx_buffer, msg.size);
            rx_buffer[rx_length] = '\0';
            /* 通过串口设备 serial 输出读取到的消息 */
            //rt_device_write(serial, 0, rx_buffer, rx_length);
            /* 打印数据 */
            rt_kprintf("%s\n",rx_buffer);
        }
    }
}

static int uart_dma_sample()
{
    rt_err_t ret = RT_EOK;
    char uart_name[RT_NAME_MAX];
    static char msg_pool[256];
    char str[] = "hello RT-Thread!\r\n";

    /* 查找串口设备 */
    serial = rt_device_find(SAMPLE_UART_NAME);
    if (!serial)
    {
        rt_kprintf("find %s failed!\n", uart_name);
        return RT_ERROR;
    }

    /* 初始化消息队列 */
    rt_mq_init(&rx_mq, "rx_mq",
               msg_pool,                 /* 存放消息的缓冲区 */
               sizeof(struct rx_msg),    /* 一条消息的最大长度 */
               sizeof(msg_pool),         /* 存放消息的缓冲区大小 */
               RT_IPC_FLAG_FIFO);        /* 如果有多个线程等待,按照先来先得到的方法分配消息 */

    /* 修改串口配置参数 */
    config.baud_rate = BAUD_RATE_115200;        //修改波特率为 9600
    config.data_bits = DATA_BITS_8;           //数据位 8
    config.stop_bits = STOP_BITS_1;           //停止位 1
    config.bufsz     = 128;                   //修改缓冲区 buff size 为 128
    config.parity    = PARITY_NONE;           //无奇偶校验位

    /*控制串口设备。通过控制接口传入命令控制字,与控制参数 */
    rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config);

    /* 以 DMA 接收及轮询发送方式打开串口设备 */
    rt_device_open(serial, RT_DEVICE_FLAG_DMA_RX);
    /* 设置接收回调函数 */
    rt_device_set_rx_indicate(serial, uart_input);
    /* 发送字符串 */
    rt_device_write(serial, 0, str, (sizeof(str) - 1));

    /* 创建 serial 线程 */
    rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);
    /* 创建成功则启动线程 */
    if (thread != RT_NULL)
    {
        rt_thread_startup(thread);
    }
    else
    {
        ret = RT_ERROR;
    }
    return ret;
}

int main(void)
{
    uart_dma_sample();
   return RT_EOK;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1210864.html

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

相关文章

c# 字符串转化成语音合成,System.Speech

C# 语音合成可以使用 System.Speech.Synthesis 命名空间中的 SpeechSynthesizer 类来实现。SpeechSynthesizer 类提供了一系列方法和属性&#xff0c;可以用来控制语音合成的过程&#xff0c;包括设置语音、音调、语速等。 下面是一个简单的示例&#xff0c;用来演示如何使用 …

专业的SRM系统全流程管理服务

一、什么是SRM系统 SRM系统&#xff0c;即供应商关系管理&#xff0c;是供应链管理中的重要组成部分&#xff0c;帮助企业与供应商建立、维护和改善业务关系&#xff0c;以实现双方共赢。本文将从供应商寻源到合同签订、订单履行、到付款及供应商评价等环节&#xff0c;阐述SR…

基于SSM的宠物综合服务平台的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

NineData慢查询分析:数据库性能优化的专家

在日常的数据库运维中&#xff0c;慢查询是一个常见的问题&#xff0c;它可能由复杂的查询语句、不充分的索引设计、大量数据的处理、硬件资源不足等多种因素引起。这些慢查询会消耗大量的数据库服务器资源&#xff0c;甚至可能导致数据库死机&#xff0c;无法响应业务请求。因…

infercnv

文章目录 brief安装使用体验输入文件制作运行试试吧结果部分others brief InferCNV is used to explore tumor single cell RNA-Seq data to identify evidence for somatic large-scale chromosomal copy number alterations, such as gains or deletions of entire chromoso…

程序员的护城河:技术深度与软实力的并重

程序员的护城河&#xff1a;技术深度与软实力的并重 作为一名资深的IT行业从业者&#xff0c;我一直在思考一个问题&#xff1a;在我们这个以数据驱动和技术创新为核心的时代&#xff0c;程序员的价值究竟体现在哪里&#xff1f;毫无疑问&#xff0c;程序员在维护系统安全、数…

易基因:综合全基因组DNA甲基化和转录组学分析鉴定调控骨骼肌发育潜在基因 | 研究进展

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 DNA甲基化是骨骼肌发育中关键的表观遗传调控机制。但胚胎鸭骨骼肌发育中负责DNA甲基化的调控因子仍然未知。 2023年10月23日&#xff0c;南京农业大学动物科技学院于敏莉副教授团队在《…

PP-YOLOv2: A Practical Object Detector(2021.4)

文章目录 Abstract1. Introduction2. Revisit PP-YOLOPre-ProcessingBaseline ModelTraining Schedule 3. Selection of RefinementsPath Aggregation Network Mish Activation FunctionLarger Input SizeIoU Aware Branch 4. Experiments6. Conclusions 原文地址 源代码 Abstr…

Flink(五)【DataStream 转换算子(上)】

前言 这节注定是一个大的章节&#xff0c;我预估一下得两三天&#xff0c;涉及到的一些东西不懂就重新学&#xff0c;比如 Lambda 表达式&#xff0c;我只知道 Scala 中很方便&#xff0c;但在 Java 中有点发怵了&#xff1b;一个接口能不能 new 来构造对象? 答案是可以的&…

解决 requests 库下载文件问题的技术解析

在一个使用requests库的conda食谱构建过程中&#xff0c;我们注意到存在一个文件下载问题。该文件是从https://dakota.sandia.gov/sites/default/files/distributions/public/dakota-6.5-public.src.tar.gz下载的。使用curl和urllib2库可以正确下载文件&#xff0c;但使用reque…

Find My平衡车|苹果Find My技术与平衡车结合,智能防丢,全球定位

随着人们环保意识的加强&#xff0c;电动车的数量与日俱增。与此同时&#xff0c;科学家经过潜心的研究&#xff0c;终于开发出新款两轮电动平衡车。两轮电动平衡车是一种新型的交通工具&#xff0c;它与电动自行车和摩托车车轮前后排列方式不同&#xff0c;而是采用两轮并排固…

「Verilog学习笔记」优先编码器Ⅰ

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 分析编码器的功能表&#xff1a; 当使能El1时&#xff0c;编码器工作&#xff1a;而当E10时&#xff0c;禁止编码器工作&#xff0c;此时不论8个输入端为何种状态&…

锐捷网络NBR700G 信息泄露漏洞复现 [附POC]

文章目录 锐捷网络NBR700G 信息泄露漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 锐捷网络NBR700G 信息泄露漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非…

CNVD-2021-27648:锐捷RG-UAC统一上网行为管理与审计系统信息泄露漏洞复现

文章目录 锐捷RG-UAC统一上网行为管理与审计系统信息泄露&#xff08;CNVD-2021-27648&#xff09;漏洞复现0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.复现 0x06 修复建议 锐捷RG-UAC统一上网行为管理与审计系统信息泄露&#xff08;CNVD…

在Ubuntu系统上部署Inis博客,并使用内网穿透将博客网站发布到公共互联网上

文章目录 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总…

vue实现类似c#一样,鼠标指到方法或者变量上,能显示自己备注的信息

之前从c#转vue的时候&#xff0c;就问同事&#xff0c;为啥我给刚写的方法备注&#xff0c;在其他地方调用的时候看不到备注信息&#xff0c;同事说不知道怎么才能做到。今天无意间看前端知识的时候发现了还有如下的方法&#xff1a; 如下&#xff0c;在变量之前增加多一个星号…

AMEYA360分析:蔡司工业CT中的自动缺陷检测

蔡司自动缺陷检测&#xff1a;适用于您的应用领域的AI软件 蔡司自动化缺陷检测机器学习软件将人工智能应用于3D CT和2D X射线系统&#xff0c;树立了新的标杆&#xff0c;可对缺陷或异常(不规则)进行检测、定位与分类&#xff0c;同时通过读取CT扫描和X射线结果对其进行详细分析…

2023美亚杯个人赛复盘(一)火眼+取证大师

第一次参加美亚杯&#xff0c;手忙脚乱&#xff0c;不过也学到了很多东西&#xff0c;接下来会分篇介绍writeup&#xff0c;感兴趣的小伙伴可以持续关注。 案件基本情况&#xff1a; &#xff08;一&#xff09;案情 2023月8月的一天&#xff0c;香港警方在调查一起网络诈骗案…

爆款元服务!教你如何设计高使用率卡片

元服务的概念相信大家已经在 HDC 2023 上有了很详细的了解&#xff0c;更轻便的开发方式&#xff0c;让开发者跃跃欲试。目前也已经有很多开发者开发出了一些爆款元服务&#xff0c;那么如何让你的元服务拥有更高的传播范围、更高的用户使用率和更多的用户触点呢&#xff1f;设…