OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4087|回复: 9

有关DMA操作的一些问题

[复制链接]

8

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2014-5-5
在线时间
0 小时
发表于 2015-5-13 17:11:09 | 显示全部楼层 |阅读模式
5金钱
最近在弄一个东西,用stm32进行调制解调。在解调端,通过一些基本处理后送入到AD口时,一个码元周期是244us,如果是码元1,那么在最开始会有大概25us的幅度冲击(3.5V);如果是0,整个码元周期内都不会有幅度的冲击。于是我的想法就是利用AD和DMA ,利用幅度进行判决。但是现在从结果来看,会存在一定的误码,所有的误码都是发送1时有可能会被判决成0。一般情况下这都是由于幅度判决时门限的问题,可是我无论怎么更改门限和调整位同步算法,1判决成0这种误码一直存在。所以我就有了以下一些问题,希望各位大神能够解答。
1、因为送入AD口的数据是连续的,所以AD我现在是一直开着,利用DMA把AD值存储到内存buf1中,500个点进一次中断。DMA中断函数中,先关闭DMA,再切换DMA存储的内存地址到buf2,开启DMA,如此循环进行乒乓操作。所以每次中断函数执行的时候会漏掉一些AD采样的值,我想请问各位中断函数的时间是多少呢?利用JTAG仿真的时候,算出大概中断函数的执行时间是9us不到10us,我想知道是不是中断函数就是这个时间。下面是我的DMA中断函数
[mw_shl_code=c,true]void DMA1_Channel1_IRQHandler(void) { static u8 BufFlg=0; if((DMA1->ISR) & (1<<1)) { DMA1_Channel1->CCR&=~(1<<0); DMA1->IFCR |= 1<<1; if(BufFlg==0) { DMA1_Channel1->CMAR = (u32)(AD_Value2+30); BufFlg=1; flag1 = 1; //memcpy(AD_Value1, AD_Value2+500, 30*sizeof(short)); } else { DMA1_Channel1->CMAR = (u32)(AD_Value1+30); BufFlg=0; flag2 = 1; //memcpy(AD_Value2, AD_Value1+500, 30*sizeof(short)); } DMA1_Channel1->CCR|=1<<0; } //DMA_ClearITPendingBit(DMA1_IT_TC1); }[/mw_shl_code]
2、其实根据波形,可以知道关键是对1的判决,检测是否有幅度的冲击。目前我的算法是,遍历buf,如果找到连续的3个点大于预设的门限值(假设此时为第10个点),就进行位同步调整,并判决为1。因为一个码元周期是54个点,所以理论上下一个位同步的点应该是当前点加上54(即10+54=64),考虑实际的情况,我现在进行遍历的点是这个理论点(64)左边15个点开始,一直持续到理论点(64)右边4个。如果这其中找到了幅度的冲击,继续之前的;如果没有就判决为0,更改下一个位同步时刻的理论点(64+54=118)。因为我不管怎么更改门限,都会存在1判决为0的情况,所以有可能是某个码元周期点数小于40并且大于58,如果是这样,就说明AD的稳定度很低。stm32的AD的稳定度会有这么低吗?
3、1判决成0就是在扫描区间内没有找到幅度冲起来的点,因为冲起来的电压大概是3.5V,大于stm32AD的参考电压3.3V,会不会是因为是这个原因导致的AD采样不稳定,导致有些时候采样值不稳定,所以冲击起来的高度完全没有采到呢?

最后,我还做过这种测试,就是一次性采样5000个点,将这5000个点分割存储在10个buf中,每个buf500个点,利用算法进行判决,试了几组数据都没有误码。这两种方法唯一的区别就是一次性采样5000个点就不会发生DMA中断函数中,切换buf时导致的部分采样点丢失,所以个人感觉第一个原因是主要原因。请问各位大神,利用JTAG仿真时得出来的大概9us的中断函数执行时间到底是否准确?

写了一大堆,希望有大神能够耐心解答,非常感谢。

最佳答案

查看完整内容[请看2#楼]

1、9us,似乎有点长。如果没有包含memcpy语句,感觉应当是 1us 。——纯粹是感觉了。 2、未必是 AD 不稳定的问题。没法保证输入信号的严整性和一致性。 3、输入信号过高,如果没有损坏器件,AD输出的值应当是最大,0xFFFF 这样。 4、可以换其他方法测试一下,然后对比。比如,数一数总共执行多少条汇编指令,然后折算一下时间;或者用输出脉冲的方式,用示波器看。 这个事情,用 AD 和算 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11555
金钱
11555
注册时间
2014-4-1
在线时间
1317 小时
发表于 2015-5-13 17:11:10 | 显示全部楼层
1、9us,似乎有点长。如果没有包含memcpy语句,感觉应当是 1us 。——纯粹是感觉了。

2、未必是 AD 不稳定的问题。没法保证输入信号的严整性和一致性。

3、输入信号过高,如果没有损坏器件,AD输出的值应当是最大,0xFFFF 这样。

4、可以换其他方法测试一下,然后对比。比如,数一数总共执行多少条汇编指令,然后折算一下时间;或者用输出脉冲的方式,用示波器看。

这个事情,用 AD 和算法去做,思路对头吗? 

应当先把信号整形一下,再用 CPU 或者 FPGA 处理。
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11555
金钱
11555
注册时间
2014-4-1
在线时间
1317 小时
发表于 2015-5-13 17:11:10 | 显示全部楼层
回复【5楼】cha1992:
---------------------------------

1、很想知道你是如何看到 9us 的,我还不会呢。IAR 还是 MDK?能截个图吗?

2、关键是信号的严重性、一致性。只有保证这个,你的整个思路才可行。

3、

4、因为一条汇编语句执行的时间可以认为是确定的,所以比较准确一点。怎么数?一言难尽,问问周围吧。
   输出脉冲,就是用IO在程序首、尾各输出一个脉冲,示波器来看,中间空档就是执行时间。


5、尽量不要抱怨老师,每件事都是锻炼。端正心态很重要。

6、原来用的FPGA是什么型号?我想看看原来的成本。

7、5000个点太少,不能证明信号的“一致性”。做过判别程序,连续运行至少若干小时,只要有一次错就报警、计数,看看不一致的比率到底多大。

8、我基本不开qq。我事情也多。自己的路,还是要靠自己的腿。
回复

使用道具 举报

8

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2014-5-5
在线时间
0 小时
 楼主| 发表于 2015-5-13 17:13:21 | 显示全部楼层
沙发自己做。顺便吐槽一下,DMA确实是个好东西,就是硬件调试的时候各种蛋疼,很多情况调试都会失效
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-13 23:17:22 | 显示全部楼层
帮顶。。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

8

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2014-5-5
在线时间
0 小时
 楼主| 发表于 2015-5-14 09:19:27 | 显示全部楼层
回复【4楼】xuande:
---------------------------------
谢谢
1、我也不知道  我用JTAG硬件仿真看的时间是9us  如果是您说的1us  那当然最好了  您说的第四点我还没完全理解  能在稍微详细一点不
2、我也感觉不是AD不稳定  就算不稳定也可能差距会有10几个点这么大吧
3、芯片其实内部都会有一个保护措施的  我这只是大了一点点  所以不会烧坏器件的 采样出来的值时0x0FFF
4、能在详细描述一下吗  非常感谢
另外  信号是经过整形送进AD口的   这个是必须的  解调就是一个模拟信号输入进来对它进行采样  根据采样的点进行判决的过程  所以如果不用AD那该怎么做的?
这个东西之前就是用FPGA来做的  结果我老师不知道怎么想的  突然说出于成本和板子大小的考虑  要把FPGA去掉  调制解调的部分改用stm32来实现  为了实现老师的这种傻逼想法  那不就我们下面的学生倒霉啊  
其实关键是  我做过测试  比如说我一次性采样5000个点  将这5000个点分割存储在10个buf中  每个buf500个点  对着10个buf进行解调和判决  没有出现误码  但是实际情况涉及到DMA中断的切换buf操作  就会有1判决成0的情况发生  所以个人感觉问题就出现在DMA中断函数里面
最后  能方便留下您的qq吗  加你qq详细问吧   我的是1184912615  谢谢
回复

使用道具 举报

8

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2014-5-5
在线时间
0 小时
 楼主| 发表于 2015-5-14 09:20:00 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥  有没有办法验证中断函数的执行时间呢  是不是用的硬件仿真的方法  算出来的时间不准啊
回复

使用道具 举报

8

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2014-5-5
在线时间
0 小时
 楼主| 发表于 2015-5-14 10:09:39 | 显示全部楼层
哈哈  问题我解决了  谢谢xuande和原子大哥  main函数里面要对buf进行一次复制的操作  那里memcpy的第三个参数我开始写错了  导致有部分数据没有复制  所以会出现有时1判决成0的情况  谢谢各位
回复

使用道具 举报

8

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2014-5-5
在线时间
0 小时
 楼主| 发表于 2015-5-14 13:37:16 | 显示全部楼层
回复【8楼】xuande:
---------------------------------
恩  谢谢  问题解决了  memcpy的第三个参数我写错了  软件就是用的MDK  方法百度就有
http://zhidao.baidu.com/link?url=gQ8pEgnsONoY6qCn5UHjSECxYtbpSJKYiZYnIQTtcPRbHL5pKKJDrzddr_FgTkPbMPJXJJWkp_LzDO0IKoWsnq
FPGA的型号我也不懂  毕竟不是我做的  只是老师突然有这种想法  然后丢给我去实现  只是我觉得没有任何意义 
您说的  很有道理 心态最重要 并且你的第四条  这种思路我也学到了 谢谢您百忙之中回答问题
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-14 22:00:48 | 显示全部楼层
回复【6楼】cha1992:
---------------------------------
我们的usmart就可以查看函数执行时间。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 15:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表