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接收来替代中断方式或轮询方式的接收主要是为了提高代码的运行效率,中断方式的接收,每接收一个字节便…...
(基础篇)通过node增删改查连接mysql数据库
一定要会最基础的sql建表一定要会最基础的sql建表一定要会最基础的sql建表 首先说一下准备工作 一、准备工具 1.mysql数据库Navicat可视化工具(数据库表单已经建好) 我这里用的小皮工具直接开启的本地mysql 2.vscode (不用说基本上都有) 3.node.js …...
做为一个产品经理带你详细了解--动态面板的使用
📚📚 🏅我是bing人,一个在CSDN分享笔记的博主。📚📚 🌟在这里,我要推荐给大家我的专栏《Axure》。🎯🎯 🚀无论你是编程小白,还是有一…...
严世芸龟法养生经
文章目录 严世芸理念荤素搭配,不偏嗜动静结合心平气和 龟息法 严世芸 严世芸,出生于1940年,现任上海中医药大学的主任医师,教授。他父亲是近代上海有名的中医,他又是著名医家张伯臾的亲传弟子。 从小就在父亲诊室里长…...
基于OHTPPS实现网站HTTPS访问
前言 笔者近期为网站配置HTTPS的域名,查找了大量方案,最近寻得一个不错的解决方式,通过OHTTPS获取免费的证书并部署到阿里云服务器上。 步骤 到OHTTPS官网注册账号 官方地址如下,读者可以先行到官网注册一下账号,笔…...
python|获取接口请求耗时
你想知道我们请求一个url的时候,握手和请求资源分别占用多长时间么?今天我们使用python写个小案例来看看吧。 项目展示 打开项目,修改hosts、port、methods以及url的变量,即可运行python程序便可获得该页面的详细信息的时间&…...
[PyTorch][chapter 7][李宏毅深度学习][深度学习简介]
前言: 深度学习常用的开发平台 TensorFlow torch theano caffe DSSTNE mxnet libdnn CNTK 目录: 1: 深度学习发展历史 2: DeepLearning 工程简介 3: DNN 简介 一 发展历史 二 DeepLearning 工程简介 深度学习三…...
【go语言实践一】go语言基础篇一
go语言基础 一些go语言学习辅助地址go代码运行方法go run xxx.gogo build xxx.go go语言编码规范go语言的{}的写法强制 go语言注释 go语言变量定义多个全局变量的声明 go语言数据类型基本数据类型基本数据类型的转换(其他)基本数据类型转string1、使用fmt.Sprintf(…...
深度学习 Day12——P1实现mnist手写数字识别
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 文章目录 前言1 我的环境2 代码实现与执行结果2.1 前期准备2.1.1 引入库2.1.2 设置GPU(如果设备上支持GPU就使用GPU,否则使用C…...
【Docker实战】基于Dockerfile搭建LNMP+wordpress
一、项目背景和要求 公司在实际的生产环境中,需要使用Docker 技术在一台主机上创建LNMP服务并运行Wordpress网站平台。 然后对此服务进行相关的性能调优和管理工作 二、架构: nginx172.111.0.10docker-nginxmysql172.111.0.20docker-mysqlPHP172.111…...
【桌面应用开发】Tauri是什么?基于Rust的桌面应用
自我介绍 做一个简单介绍,酒架年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【…...
PHP的协程是什么?
PHP 的协程是一种轻量级的线程(或任务)实现,允许在一个进程中同时执行多个协程,但在任意时刻只有一个协程处于执行状态。协程可以看作是一种用户空间线程,由程序员显式地管理,而不是由操作系统内核进行调度…...
three.js 入门三:buffergeometry贴图属性(position、index和uvs)
环境: three.js 0.159.0 一、基础知识 geometry:决定物体的几何形状、轮廓;material:决定物体呈现的色彩、光影特性、贴图皮肤;mesh:场景中的物体,由geometry和materia组成;textu…...
Initial用法-FPGA入门3
Initial是什么 FPGA Initial是一种在FPGA中进行初始化的方法。在FPGA设备上,初始值决定了逻辑门的状态和寄存器的初始值。FPGA Initial可以通过设置初始值来控制电路在上电后的初始状态。 Initial的作用 2.1,控制电路启动时的初始状态 通过设置FPGA Ini…...
perl脚本中使用eval函数执行可能有异常的操作
perl脚本中有时候执行的操作可能会引发异常,为了直观的说明,这里举一个json反序列化的例子,脚本如下: #! /usr/bin/perl use v5.14; use JSON; use Data::Dumper;# 读取json字符串数据 my $json_str join(, <DATA>); # 反…...
『Redis』在Docker中快速部署Redis并进行数据持久化挂载
📣读完这篇文章里你能收获到 在Docke中快速部署Redis如何将Redis的数据进行持久化 文章目录 一、拉取镜像二、创建挂载目录1 宿主机与容器挂载映射2 挂载命令执行 三、创建容器—运行Redis四、查看运行情况 一、拉取镜像 版本号根据需要自己选择,这里以…...
ubuntu创建apt-mirror本地仓库
首先创建apt-mirror的服务端,也就是存储所有apt-get下载的文件和依赖。大约需要300G,预留400G左右空间就可以开始了。 安装ubuntu省略,用的是ubuntu202204 ubuntu挂载硬盘(不需要的可以跳过): #下载挂载工具 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的基础之上, 更强大的基础模型: 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卷管理...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...
