Skip to content

服务器托管,北京服务器托管,服务器租用-价格及机房咨询

Menu
  • 首页
  • 关于我们
  • 新闻资讯
  • 数据中心
  • 服务器托管
  • 服务器租用
  • 机房租用
  • 支持中心
  • 解决方案
  • 联系我们
Menu

衔尾法解决当无法使用空闲中断以及DMA中断时配置DMA接收串口不定长数据

Posted on 2023年9月20日 by hackdl

[Ooonly新人贴]记录工作中遇到的问题,话不多说先上干货

问题:类似K线与蓝牙接收部门模块,要求由原来的接收串口中断改为DMA接收。据说要用到空闲中断与DMA中断,但是经仿真发现DMA每完成传输一个数据(比如1BYTE)就会进入空闲中断(k线发现这种情况),考虑到这样进入中断的频率和以前串口接收中断的频率差不多,所以放弃此方案,听说有的DMA具有超时中断机制(具体有没有我也没考证),但是我手上的板子经过研读芯片手册发现只有传输一半中断,传输完成中断,传输越界错误中断,所以也没法用此方案。

网上有很多理解DMA接收机制的帖子,这里我就不在赘述,我个人认为其中最要紧的就是判断接收数据长度的问题因为配置DMA的传输数据量大多都是接收缓存区的最大值,对于不定长数据无法预测什么时间传输结束。

话不多说先上干货(拙见)


一、配置DMA接收函数

这里具体根据对应的芯片手册写出需要的DMA接收函数,并在K线或者蓝牙初始化模块时调用此函数

(注意点: 在函数内使能DMA中断,但是不要使能对应串口DMA接收通道。使能对应串口DMA接收通道可以在对应串口初始化时自行按需调用)

二、初始化串口函数

在此处取消使能串口接收中断(视具体情况而定,蓝牙可以在开始接收时再取消),并在此调用DMA接收函数进行初始化配置,并使能DMA通道(视具体情况而定)。

三、定时器检查串口函数

此处为实时操作系统中定时器中断里的一个检查串口状态的函数,在此处加入衔尾法。

uint8_t now, last, before;

	//+++//  10个字节的数据逐个赋值循环检查DMA通道余量
	if(num >= 10)
	{
		num = 0;
	}
	RecRem[num++]=Get_Transfer_Number_Remain (); 
	if(num >= 3)
	{
		now = num - 1;
		last =  num - 2;
		before = num - 3;
	}
	else if(num == 2)
	{
		now = 1;
		last =  0;
		before = 9;
	}
	else if(num == 1)
	{
		now = 0;		
                last = 9;
		before = 8;
	}
	else if(num == 0)
	{
		now = 9;
		last = 8;
		before = 7;
	}

	if((RecRem[now] == RecRem[last]) && (RecRem[now] != MAXBUFFSIZE) )//这样下来处理时就像每次盯着循环数组什么时候露出一个尾巴处理一样,一旦数组中连着两个余量相等了就表示DMA传输结束(也可以三个数据一样,这就是before的作用,这里我只用了两个),可以开始处理数据了
	{
		Channel_Enable();	//DMA通道FALSE
		Reclen = MAXBUFFSIZE - Get_Transfer_Number_Remain ();//获取本次DMA传输帧长
		Address_Config ();//重新配置传输地址(还是原来的地址,这里需要把通道余量充满)
		Transfer_Number_Config (MAXBUFFSIZE);//配置传输数量
		Channel_Enable();	//DMA通道TRUE
		USARTBusy = 0;//所有原接收中断里需要处理的串口状态位都要在这里变更
	}

总结

此方法的大概思路就是在串口开始接收数据之前开启DMA传输并关闭接收中断,并在串口检查函数里加入检查通道余量的内容,如果通道余量两次(或者三次)相等并且不等于最大值,那么就判断接收结束,此时关闭DMA通道获取此次传输帧长,重新配置DMA传输地址和通道余量,再打开DMA通道(一般如果不重新使能DMA通道,只配置是没有效果的,这个要看具体的芯片),处理串口状态位。

这就是全部内容啦,在遇到问题时我除了请教前辈之外还在网上查询了相关的资料,虽然关于如何DMA接收发送的方法有很多但是都很笼统,具体实现比较困难,这里是我自己想出的不用中断的方法(像k线可以直接取消接收中断,蓝牙串口也可以用但是蓝牙一般需要保留接收中断用以初始化配对,除此之外可以把关于具体指令内容的传输全改为DMA),可能网上也有只是我没有找到,也可能我这样方法是有一些问题的,希望各位大佬可以指导一下。

需要转载请告诉我一下让我高兴高兴哈哈哈~

服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net

相关推荐: linux和windows爬虫有什么区别

Linux和Windows作为操作系统对于爬虫的差异不是特别大,因为两个操作系统同时都可以用于编写运行爬虫的程序。 主要的差异可能源于开发工具和环境的差异。Linux上通常使用命令行工具来编写和运行爬虫程序,而Windows则更加倾向于使用图形化界面的编程软件…

Related posts:

  1. 绍兴idc机柜租用
  2. 高效托管,稳定运行:服务器托管机器
  3. Oracle SQL 两个日期类型毫秒值求差,日期转毫秒,时间差(ms)自定义函数解决毫秒差
  4. 服务器托管常见故障如何处理
  5. 北京文件托管服务器:高效稳定的文件管理服务

服务器托管,北京服务器托管,服务器租用,机房机柜带宽租用

服务器托管

咨询:董先生

电话13051898268 QQ/微信93663045!

上一篇: leetcode 718 最长重复子数组 maximum-length-of-repeated-subarra【ct】
下一篇: 【Redis】聊一下Redis的哨兵机制

最新更新

  • 使用 Databend 加速 Hive 查询
  • C国演义 [第六章] 最长递增子序列 最长连续递增序列
  • 领域驱动设计(DDD):DDD落地问题和一些解决方法
  • JavaScript 及其众多框架
  • 接口使用的最佳时机

随机推荐

  • 网易云微专业-大数据开发工程师-编程猿
  • 议程大曝光,GOTC 2023 解密 AI 编程
  • Windows 下 PHP 7 中 *getcsv
  • 高效稳定!北京机房租用专线服务介绍
  • 深入了解香港服务器托管公司:专业、安全、高效

客服咨询

  • 董先生
  • 微信/QQ:93663045
  • 电话:13051898268
  • 邮箱:dongli@hhisp.com
  • 地址:北京市石景山区重聚园甲18号2层

友情链接

  • 服务器托管
  • 机房租用托管
  • 服务器租用托管
©2023 服务器托管,北京服务器托管,服务器租用-价格及机房咨询 京ICP备13047091号-8