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

STM32 寄存器配置笔记——USART DMA接收

一、简介

        本文主要介绍STM32如何配合USART的IDLE中断实现USART DMA接收不定长的数据。其中使用的接收缓存还是延用前面博客写的乒乓缓存。使用DMA USART接收来替代中断方式或轮询方式的接收主要是为了提高代码的运行效率,中断方式的接收,每接收一个字节便会产生一个中断,当串口有大量数据需要接收时,会造成CPU不停的被中断打断,频繁的出入栈造成整个系统不稳定的情况且也会影响到主任务里其它流程的执行时序,造成主任务里的流程滞后现象,影响其它事情的实时性。引进DMA的接收正是为了解决该问题。

二、设计思路

        USART 使用DMA方式接收需要考虑到从USART传输进来的数据可能会出现不定长等现象,在通信协议上该问题属于正常现象。但DMA的传输又需要指定特定长度因此在配置DMA时,我们很难得知要配置多少接收长度,接收长度配置多了,DMA不会产生传输完成标志,配置少了又可能造成频繁触发DMA现象导致数据不好处理,出现要拼包等现象。因此这里使用STM32的特性空闲中断来判断一次DMA的传输完成。空闲是指在串口接收到一帧数据后,没有再接收到数据此时会产生一个空闲帧此时会置位IDLE位,如若配置置IDLEIE位则会进入中断。注:首次配置USART初始化开启TE位的时候也会产生空闲帧需要滤掉。

二、配置流程

        1) USART 使能IDLEIE位

         使能USART1的空闲中断

USART1->CR1 |= 1 << 4;                                // enable IDLE interrupt

        2) USART 配置DMA接收初始化

DMA_USART1_Receive_Config(DMA1_Channel5, (u32)&USART1->DR);void DMA_USART1_Receive_Config(DMA_Channel_TypeDef* DMA_CHx, u32 cpar)
{DMA_CHx->CPAR = cpar;                    //cfg periph addr DMA_CHx->CCR |= 3 << 12;                 //cfg channel prio 3DMA_CHx->CCR &= ~(1 << 4);               //cfg periph to memDMA_CHx->CCR &= ~(1 << 5);               //cfg dma single transferDMA_CHx->CCR |= 1 << 7;                  //cfg mem transfer addr inc
}

        3)使能USART DMA接收

DMA_UART1_RECEIVE_ENABLE(DMA1_Channel5, (u32)p_cur_Usart1_Handle, 256);void DMA_UART1_RECEIVE_ENABLE(DMA_Channel_TypeDef* DMA_CHx, u32 cmar, u16 cndtr)
{USART1->CR3 |= 1 << 6;                    //enable uart dma rxDMA_CHx->CCR &= ~(1 << 0);               //dma channel disableDMA_CHx->CMAR = (u32)cmar;               //cfg mem addrDMA_CHx->CNDTR = cndtr;                  //cfg transfer lendma_cfg_recieve_cnt = DMA_CHx->CNDTR;DMA_CHx->CCR |= 1;                       //dma channel en
}

        4)USART IDLE中断处理

        在void USART1_IRQHandler(void)中断函数里通过获取DR寄存器清IDLE位。并置位recieve_idle 通知处理数据帧。

	if (USART1->SR & (1 << 4)){u8 temp;temp = USART1->DR;recieve_idle = 1;}

        5)IDLE 的处理

        主循环轮询产生IDLE的话表示当前收到一帧完整数据帧,则需要处理,处理流程:关DMA USART接收->获取DMA 传输数据量->切换接收缓存即取发送缓存->使能DMA USART接收。

void idle_process(void)
{if (recieve_idle){recieve_idle = 0;DMA_UART1_RECEIVE_DISABLE(DMA1_Channel5);p_cur_Usart1_Handle->len = GET_DMA_TRANSFER_CNT(DMA1_Channel5);change_curFifo();DMA_UART1_RECEIVE_ENABLE(DMA1_Channel5, (u32)p_cur_Usart1_Handle, 256);}
}

        6)USART DMA发送

        该内容参考上一篇博客STM32 寄存器配置笔记——USART DMA发送

具体代码如下:

 

 

相关文章:

STM32 寄存器配置笔记——USART DMA接收

一、简介 本文主要介绍STM32如何配合USART的IDLE中断实现USART DMA接收不定长的数据。其中使用的接收缓存还是延用前面博客写的乒乓缓存。使用DMA USART接收来替代中断方式或轮询方式的接收主要是为了提高代码的运行效率&#xff0c;中断方式的接收&#xff0c;每接收一个字节便…...

(基础篇)通过node增删改查连接mysql数据库

一定要会最基础的sql建表一定要会最基础的sql建表一定要会最基础的sql建表 首先说一下准备工作 一、准备工具 1.mysql数据库Navicat可视化工具&#xff08;数据库表单已经建好&#xff09; 我这里用的小皮工具直接开启的本地mysql 2.vscode (不用说基本上都有) 3.node.js …...

做为一个产品经理带你详细了解--动态面板的使用

&#x1f4da;&#x1f4da; &#x1f3c5;我是bing人&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Axure》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一…...

严世芸龟法养生经

文章目录 严世芸理念荤素搭配&#xff0c;不偏嗜动静结合心平气和 龟息法 严世芸 严世芸&#xff0c;出生于1940年&#xff0c;现任上海中医药大学的主任医师&#xff0c;教授。他父亲是近代上海有名的中医&#xff0c;他又是著名医家张伯臾的亲传弟子。 从小就在父亲诊室里长…...

基于OHTPPS实现网站HTTPS访问

前言 笔者近期为网站配置HTTPS的域名&#xff0c;查找了大量方案&#xff0c;最近寻得一个不错的解决方式&#xff0c;通过OHTTPS获取免费的证书并部署到阿里云服务器上。 步骤 到OHTTPS官网注册账号 官方地址如下&#xff0c;读者可以先行到官网注册一下账号&#xff0c;笔…...

python|获取接口请求耗时

你想知道我们请求一个url的时候&#xff0c;握手和请求资源分别占用多长时间么&#xff1f;今天我们使用python写个小案例来看看吧。 项目展示 打开项目&#xff0c;修改hosts、port、methods以及url的变量&#xff0c;即可运行python程序便可获得该页面的详细信息的时间&…...

[PyTorch][chapter 7][李宏毅深度学习][深度学习简介]

前言&#xff1a; 深度学习常用的开发平台 TensorFlow torch theano caffe DSSTNE mxnet libdnn CNTK 目录&#xff1a; 1&#xff1a; 深度学习发展历史 2&#xff1a; DeepLearning 工程简介 3&#xff1a; DNN 简介 一 发展历史 二 DeepLearning 工程简介 深度学习三…...

【go语言实践一】go语言基础篇一

go语言基础 一些go语言学习辅助地址go代码运行方法go run xxx.gogo build xxx.go go语言编码规范go语言的{}的写法强制 go语言注释 go语言变量定义多个全局变量的声明 go语言数据类型基本数据类型基本数据类型的转换&#xff08;其他)基本数据类型转string1、使用fmt.Sprintf(…...

深度学习 Day12——P1实现mnist手写数字识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文章目录 前言1 我的环境2 代码实现与执行结果2.1 前期准备2.1.1 引入库2.1.2 设置GPU&#xff08;如果设备上支持GPU就使用GPU,否则使用C…...

【Docker实战】基于Dockerfile搭建LNMP+wordpress

一、项目背景和要求 公司在实际的生产环境中&#xff0c;需要使用Docker 技术在一台主机上创建LNMP服务并运行Wordpress网站平台。 然后对此服务进行相关的性能调优和管理工作 二、架构&#xff1a; nginx172.111.0.10docker-nginxmysql172.111.0.20docker-mysqlPHP172.111…...

【桌面应用开发】Tauri是什么?基于Rust的桌面应用

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…...

PHP的协程是什么?

PHP 的协程是一种轻量级的线程&#xff08;或任务&#xff09;实现&#xff0c;允许在一个进程中同时执行多个协程&#xff0c;但在任意时刻只有一个协程处于执行状态。协程可以看作是一种用户空间线程&#xff0c;由程序员显式地管理&#xff0c;而不是由操作系统内核进行调度…...

three.js 入门三:buffergeometry贴图属性(position、index和uvs)

环境&#xff1a; three.js 0.159.0 一、基础知识 geometry&#xff1a;决定物体的几何形状、轮廓&#xff1b;material&#xff1a;决定物体呈现的色彩、光影特性、贴图皮肤&#xff1b;mesh&#xff1a;场景中的物体&#xff0c;由geometry和materia组成&#xff1b;textu…...

Initial用法-FPGA入门3

Initial是什么 FPGA Initial是一种在FPGA中进行初始化的方法。在FPGA设备上&#xff0c;初始值决定了逻辑门的状态和寄存器的初始值。FPGA Initial可以通过设置初始值来控制电路在上电后的初始状态。 Initial的作用 2.1&#xff0c;控制电路启动时的初始状态 通过设置FPGA Ini…...

perl脚本中使用eval函数执行可能有异常的操作

perl脚本中有时候执行的操作可能会引发异常&#xff0c;为了直观的说明&#xff0c;这里举一个json反序列化的例子&#xff0c;脚本如下&#xff1a; #! /usr/bin/perl use v5.14; use JSON; use Data::Dumper;# 读取json字符串数据 my $json_str join(, <DATA>); # 反…...

『Redis』在Docker中快速部署Redis并进行数据持久化挂载

&#x1f4e3;读完这篇文章里你能收获到 在Docke中快速部署Redis如何将Redis的数据进行持久化 文章目录 一、拉取镜像二、创建挂载目录1 宿主机与容器挂载映射2 挂载命令执行 三、创建容器—运行Redis四、查看运行情况 一、拉取镜像 版本号根据需要自己选择&#xff0c;这里以…...

ubuntu创建apt-mirror本地仓库

首先创建apt-mirror的服务端&#xff0c;也就是存储所有apt-get下载的文件和依赖。大约需要300G&#xff0c;预留400G左右空间就可以开始了。 安装ubuntu省略&#xff0c;用的是ubuntu202204 ubuntu挂载硬盘&#xff08;不需要的可以跳过&#xff09;: #下载挂载工具 sudo apt…...

计算机网络 internet应用 (水

ARPA net ---Internet 前身 发展史: ARPA net 第一个主干网..美国军方NSFnet 美国国家科学基金会NSFANSnet 美国全国 (internet 叫法开始出现) 第二代互联网(现在() IP地址 IP地址 最高管理机构 - InterNIC IPV4 32位 IPV6 128位 域名 起名 解析 domain name sys…...

【ChatGLM3】第三代大语言模型多GPU部署指南

关于ChatGLM3 ChatGLM3是智谱AI与清华大学KEG实验室联合发布的新一代对话预训练模型。在第二代ChatGLM的基础之上&#xff0c; 更强大的基础模型&#xff1a; ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。在语义、…...

云原生Kubernetes系列 | Docker/Kubernetes的卷管理

云原生Kubernetes系列 | Docker/Kubernetes的卷管理 1. Docker卷管理2. Kubernetes卷管理2.1. 本地存储2.1.1. emptyDir2.1.2. hostPath2.2. 网络存储2.2.1. 使用NFS2.2.2. 使用ISCSI2.3. 持久化存储2.3.1. PV和PVC2.3.2. 访问模式2.3.3. 回收策略1. Docker卷管理...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...