历史上的今天
返回首页

历史上的今天

今天是:2025年01月04日(星期六)

2019年01月04日 | stm32 DMA 的 buffersize 意义与设置

2019-01-04 来源:eefocus

总结一下:


我的理解是一次传输多个数据,不管你的数据是8位,16位还是32位,也就相当于你接收数据部分缓存的数据量。buf[buf_size],就是这个bufe_size。




1.看库函数中
DMAy_Channelx->CNDTR = DMA_InitStruct->DMA_BufferSize;
而CNDTR即数据传输数量 (Number of data to transfer)
数据传输数量为0至65535。这个寄存器只能在通道不工作(DMA_CCRx的EN=0)时写入。通
道开启后该寄存器变为只读,指示剩余的待传输字节数目。寄存器内容在每次DMA传输后递
减。
数据传输结束后,寄存器的内容或者变为0;或者当该通道配置为自动重加载模式时,寄存
器的内容将被自动重新加载为之前配置时的数值。
当寄存器的内容为0时,无论通道是否开启,都不会发生任何数据传输。


2.DMA_BufferSize的大小应该取多少?

上面的讨论很多同学就疑惑了,这个大小应该取多少呢?暂时我建议你需要多少数据就写多少。

__IO uint16_t ADC_ConvertedValue[NUM];

一般,我们会定义一个变量存我们的数据,然后

DMA_InitStruct.DMA_BufferSize = NUM;

DMA_InitStruct.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;


这时候,缓冲区的大小和我们定义的数组一致,也方便我们操作。

但是如果DMA_BufferSize大于NUM会怎么样?根据上面问题1的解释,缓冲区地址其实就是我们的ADC_ConvertedValue地址,如果DMA_BufferSize为NUM+N,其实缓冲区就是ADC_ConvertedValue[NUM+N],再说一遍,Buffer的首地址和ADC_ConvertedValue相同,如果我们用指针访问,可以很好的验证。

__IO uint16_t *p;
p=ADC_ConvertedValue;

////省略代码,printf是串口通信改写的函数….

printf(“%4x\n”,ADC_ConvertedValue[NUM-1]);
printf(“%4x\n”,*(p+NUM));

printf(“%4x\n”,*(p+NUM+1));


你会很吃惊的发现,*(p+NUM)里面也有我们采样的数据。如果我们用ADC_ConvertedValue[NUM]访问则会出错,因为超出数组范围了。也就是说DMA_BufferSize可以大于NUM,但是大于NUM的地址属于不被定义的内容。从编程角度,它使用了未知的区域,如果这个地址定义别的变量,那么就会误操作这个变量。


ysmz4:可以将DMA_SetCurrDataCounter(DMA2_Channel3,R_B_SIZE); //设置传输数据长度 

               改成DMA_SetCurrDataCounter(DMA2_Channel3,n);    //n为实际用到的大小

我觉得就可以避免这个问题。


__IO uint16_t ADC_ConvertedValue[NUM];
__IO uint16_t a[N];

比如我们定义时候,紧跟ADC_ConvertedValue定义一个a;一般编译器会把这两个变量的地址连在一起。那么在运行程序时候:

printf(“%4x\n”,ADC_ConvertedValue[NUM-1]);
printf(“%4x\n”,*(p+NUM));



printf(“%4x\n”,ADC_ConvertedValue[NUM-1]);
printf(“%4x\n”,a[0]);

是一样的数据。

很危险吧。a[0]的数据就被DMA覆盖了。


推荐阅读

史海拾趣

Excelight Communications Inc公司的发展小趣事

Excelight Communications Inc公司成立于XX世纪初,当时正值通信技术飞速发展的时代。创始人李明(化名)是一位电子工程专家,他对光通信技术有着浓厚的兴趣。在创办公司之前,李明曾在一家大型通信企业工作,积累了丰富的技术和管理经验。他发现市场上对于高速、高效的光通信产品有着巨大的需求,于是决定创立Excelight,专注于研发和生产光通信模块和设备。

创业初期,Excelight面临着资金、技术和市场等多方面的挑战。李明带领团队日夜兼程,不断攻克技术难关,同时积极寻找合作伙伴和投资人。经过几年的努力,Excelight逐渐在市场上崭露头角,其光通信产品因性能优越、价格合理而受到了客户的广泛好评。

台湾肯尼威(CANNYWELL)公司的发展小趣事

面对不断变化的市场需求和技术环境,肯尼威始终坚持以创新为引领。公司不断投入研发资源,推出了一系列具有创新性的产品。例如,针对特殊需求的客户,公司推出了定制化的电源滤波器解决方案;同时,还开发了新型的三相电源滤波器等产品,满足了市场的多样化需求。这些创新不仅提升了公司的技术实力,也为公司赢得了更多的市场份额。

Catalyst / ON Semiconductor公司的发展小趣事

随着技术的不断进步,Catalyst / ON Semiconductor公司逐渐在半导体领域取得了重要的技术突破。公司投入大量资源进行研发,成功开发出了一系列高性能、低功耗的半导体产品,这些产品在市场上受到了广泛的欢迎。这些技术突破不仅提升了公司的市场竞争力,也为整个电子行业的发展注入了新的活力。

超音(CY)公司的发展小趣事

面对数字化浪潮的冲击,超音积极响应行业变革,加快了数字化转型和智能化升级的步伐。公司引入了先进的生产设备和管理系统,提高了生产效率和产品质量。同时,超音还加大了对智能化产品的研发投入,推出了一系列具有智能化功能的音频设备产品。这些产品不仅满足了消费者对高品质音频的需求,还提供了更加便捷和智能的使用体验。这些努力使得超音在数字化转型和智能化升级方面取得了显著成效,为公司的未来发展注入了新的活力。

Amphenol RF公司的发展小趣事

为了进一步提升品牌影响力,超音开始积极拓展国际市场。公司参加了多个国际展会,与国际知名音频设备厂商建立了合作关系。同时,超音还加强了与国际市场的沟通和交流,了解不同地区的消费者需求,针对性地推出符合当地市场需求的产品。这些努力使得超音在国际市场上的知名度不断提升,产品销量也稳步增长。

Frequency Management International公司的发展小趣事

FMI深知技术创新是企业发展的核心动力。因此,公司一直致力于在石英晶体和晶体振荡器领域进行技术研发和创新。通过不断的技术积累和优化,FMI成功开发出了一系列高性能、高稳定性的产品,如压控温度补偿晶体振荡器(VCTCXO)、压控晶体振荡器(VCXO)、温度补偿晶体振荡器(TCXO)等。这些产品的推出不仅丰富了FMI的产品线,还进一步提升了公司在行业内的竞争力。

问答坊 | AI 解惑

四川话8级测试

一。选择题(70分) 1。 “ 包谷 ” 是指( ) A 农民 B 小麦 C 蝗虫 D 玉米 2。 “ 批噻噻 ” 是形容一个人() A 舌头长,搬弄是非 B 一种腌制品 C 长得强壮 D 一种交通工具 3。 “ 叮叮猫 ” 是指( ) A ...…

查看全部问答>

国外海事浮油雷达监测

估算浮油 OSIS 是一家丹麦公司,专门在海上石油钻井监控漏油情况,其漏油识别系统帮助岸上观察员执行24小时在线监测,并获得释放到海洋环境中的石油的精确测量数据。 OSIS使用一种dvi 转usb转换设备开始了新的方案。 OSIS的Brian Hansen说:“ ...…

查看全部问答>

点触摸屏,屏幕会出现小黑圆圈,这部分代码在那里?

在wince中,当我们用触摸笔点一下屏幕的时候,会在围绕触摸笔在触摸笔周围画一个由几个小黑圆点围成的圆圈,我想问一下,这部分代码在什么位置?调用的什么函数或者库?…

查看全部问答>

51单片机控制SIM300收发数据

各位高手,我想用51通过串口来控制SIM300收发数据,现在已经把SIM300模块和51实验板通过串口连接起来了,可写完程序后模块没有反应,不知道为什么,需要对模块初始化吗?我把程序贴上来麻烦大家看看有什么问题。另外我想用串口接收字符串并判断接收 ...…

查看全部问答>

关于WinCE下USB Serial的问题?

我用的是朋友的板子,目前WinCE已经支持了USB Serial功能,但是将USB插到PC上面的时候,PC就让我安装USB Serial驱动,请问这个驱动从哪里得到阿? 还是我的系统有什么问题? 谢谢。…

查看全部问答>

难道是KEILMDK的BUG吗?!!有图为证,郁闷~~

就是当你在线仿真调试的时候,变量多的时候MDK的变量(有些是不能显示出来,) 我不知道这算不算是BUG,现在我把我个人经历写出来,希望同行有类似经历时,多留个心眼,换个思维解决,说不定不是你的错! 在我的程序中,刚开始是KEIL MDK建 ...…

查看全部问答>

【版主救命】关于STM8S的SPI模式的选择

我想用STM8S207和一个解码芯片进行SPI通信,ST芯片只接受,而解码芯片只发送,两者之间有3根线连接,一根CS片选,一根时钟,一根数据线,然后我用的STVD和source insight进行编程,其中sourceinsight库中有2LINES_FULLDUPLEX,  2LI ...…

查看全部问答>

新人求高人指教!

我刚接触VxWorks,求学习方法和资料,谢谢了!!!!…

查看全部问答>

关于linux安装中的 liinux与硬盘分区

Linux与硬盘分区  前面已经为大家介绍了关于linux安装中的linux守护进程介绍,接下来就要和大家讲解关于Linux与硬盘分区的知识点,废话少说,看快来看看吧!  通常,我们的硬盘上已被Windows所占据,而现在要让Linux入住,就得为它腾出一定的硬 ...…

查看全部问答>

EPA发布小型网络设备能源之星规范草案第三稿

转自:http://www.ebotest.cn/zxzx/2013/0614/586.html EPA发布小型网络设备能源之星规范草案第三稿 武汉CE认证 |时间:2013-06-14 09:00| 来源:未知| 作者:admin 2013年6月,美国环保署EPA发布了关于能源之星小型网络设备规范(v1)草案第三稿。 ...…

查看全部问答>