RT-Thread STM32F407 DMA


这里以串口的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;        //修改波特率为 9600config.data_bits = DATA_BITS_8;           //数据位 8config.stop_bits = STOP_BITS_1;           //停止位 1config.bufsz     = 128;                   //修改缓冲区 buff size 为 128config.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.hqwc.cn/news/176863.html

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

相关文章

css:文本对齐属性vertical-align实现化学元素上标下标的显示

文档 https://developer.mozilla.org/zh-CN/docs/Web/CSS/vertical-align 语法 vertical-align: <value>;可选值&#xff1a; sub&#xff1a;使元素的基线与父元素的下标基线对齐。 super&#xff1a;使元素的基线与父元素的上标基线对齐。 text-top&#xff1a;使…

将ECharts图表插入到Word文档中

文章目录 在后端调用JS代码准备ECharts库生成Word文档项目地址库封装本文示例 EChartsGen_DocTemplateTool_Sample 如何通过ECharts在后台生成图片&#xff0c;然后插入到Word文档中&#xff1f; 首先要解决一个问题&#xff1a;总所周知&#xff0c;ECharts是前端的一个图表库…

全彩LED显示屏的质量怎样判断

判断全彩LED显示屏的质量需要考虑多个方面&#xff0c;包括平整度、白平衡、可视角度、分辨率、亮度、可靠性和稳定性等。以下是一些建议&#xff0c;供你参考&#xff1a; 平整度&#xff1a;LED显示屏的表面平整度应在1mm以内&#xff0c;以保证显示图像不发生扭曲。局部凸起…

008.分隔符、循环、比较

1、字段分隔符与迭代器 内部字段分隔符&#xff08;Internal Field Separator&#xff0c;IFS&#xff09;是shell脚本编程中的一个重要概念。在处理文本数据时&#xff0c;它的作用可不小。 作为分隔符&#xff0c;IFS有其特殊用途。它是一个环境变量&#xff0c;其中保存了…

【学习笔记】Understanding LSTM Networks

Understanding LSTM Networks 前言Recurrent Neural NetworksThe Problem of Long-Term DependenciesLSTM Networks The Core Idea Behind LSTMsStep-by-Step LSTM Walk ThroughForget Gate LayerInput Gate LayerOutput Gate Layer Variants on Long Short Term MemoryConclus…

2.3.5 交换机的VRRP技术

实验2.3.5 交换机的VRRP技术 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.交换机的基本配置 六、任务验收七、任务小结 一、任务描述 某公司的网络核心层原来采用一台三层交换机&#xff0c;随着网络应用的日益增多&#xff0c;对网络的可靠性也提出了越来…

SpringBoot写接口小记 以及 几个层的功能总结(自用 勿喷)

目录 Entity层&#xff1a;实体层 数据库在项目中的类 Mapper层&#xff1a; 持久层 主要与数据库进行交互 Service层&#xff1a;业务层 控制业务 Controller层&#xff1a;控制层 控制业务逻辑 Entity层&#xff1a;实体层 数据库在项目中的类 Entity层是实体层&#xff…

软路由R4S+iStoreOS实现公网远程桌面局域网内电脑

软路由R4SiStoreOS实现公网远程桌面局域网内电脑 文章目录 软路由R4SiStoreOS实现公网远程桌面局域网内电脑简介 一、配置远程桌面公网地址配置隧道 二、家中使用永久固定地址 访问公司电脑具体操作方法是&#xff1a;2.1 登录页面2.2 再次配置隧道2.3 查看访问效果 简介 上篇…

线性代数本质系列(一)向量,线性组合,线性相关,矩阵

本系列文章将从下面不同角度解析线性代数的本质&#xff0c;本文是本系列第一篇 向量究竟是什么&#xff1f; 向量的线性组合&#xff0c;基与线性相关 矩阵与线性相关 矩阵乘法与线性变换 三维空间中的线性变换 行列式 逆矩阵&#xff0c;列空间&#xff0c;秩与零空间 克莱姆…

Sectigo SSL

Sectigo&#xff08;前身为ComodoCA&#xff09;是全球在线安全解决方案提供商和全球最大的证书颁发机构。为了强调其在SSL产品之外的扩张&#xff0c;Comodo在2018年更名为Sectigo。新名称减少了市场混乱&#xff0c;标志着公司向创新的全方位网络安全解决方案提供商过渡。 S…

软件工程——名词解释

适用多种类型的软件工程教材&#xff0c;有关名词释义的总结较为齐全~ 目录 1. 软件 2. 软件危机 3. 软件工程 4. 软件生存周期 5. 软件复用 6. 质量 7. 质量策划 8. 质量改进 9. 质量控制 10. 质量保证 11. 软件质量 12. 正式技术复审 13. ISO 14. ISO9000 15.…

Python开源项目DifFace——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践

无论是自己、家人或是朋友、客户的照片&#xff0c;免不了有些是黑白的、被污损的、模糊的&#xff0c;总想着修复一下。作为一个程序员 或者 程序员的家属&#xff0c;当然都有责任满足他们的需求、实现他们的想法。除了这个&#xff0c;学习了本文的成果&#xff0c;或许你还…