OpenEdv-开源电子网

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

STM32F4能实现GPIO数据通过DMA到SDRAM

[复制链接]

10

主题

28

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-5-19
在线时间
14 小时
发表于 2016-11-12 15:55:34 | 显示全部楼层 |阅读模式
10金钱
我查看了stm32中文参考手册,里面明确说了DMA只能使用在外设和存储器、存储器和外设、存储器和存储器之间。(10.2章节)首先GPIO肯定是个外设,就是想请教下大家SDRAM算外设还是存储器?或者怎么界定外设的?
如果SDRAM是存储器的话,这种通过DMA实现GPIO和SDRAM数据交互可行吗?
请大家多多指教啊!

最佳答案

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

可以的,参考这个:http://www.openedv.com/posts/list/39098.htm
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2016-11-12 15:55:35 | 显示全部楼层
回复

使用道具 举报

28

主题

218

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2013-11-19
在线时间
92 小时
发表于 2016-11-13 11:44:29 | 显示全部楼层
通过DMA实现GPIO和SDRAM数据交互可行。stm32的外设指看门狗、GPIO、IIS、DAC、ADC等,SDRAM不是stm32自带的外设,stm32本身没有SDRAM吧?
回复

使用道具 举报

10

主题

28

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-5-19
在线时间
14 小时
 楼主| 发表于 2016-11-13 12:32:39 | 显示全部楼层
1375917982gxut 发表于 2016-11-13 11:44
通过DMA实现GPIO和SDRAM数据交互可行。stm32的外设指看门狗、GPIO、IIS、DAC、ADC等,SDRAM不是stm32自带的 ...

那是把SDRAM看成是stm32的存储器来进行DMA的初始化配置吗
回复

使用道具 举报

10

主题

28

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-5-19
在线时间
14 小时
 楼主| 发表于 2016-11-14 15:32:26 | 显示全部楼层
正点原子 发表于 2016-11-12 15:55
可以的,参考这个:http://www.openedv.com/posts/list/39098.htm

回复

使用道具 举报

0

主题

7

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2022-6-10
在线时间
2 小时
发表于 2022-6-14 13:28:26 | 显示全部楼层
这个问题其实很简答,原子大侠的做法是追求极致速度的做法,如果要按照特定的节奏读取GPIO数据,这种做法就不适合。
我的设计是工作的一部分,很抱歉不能贴出代码,但可以用文字简单说明。
先说一下硬件背景,CPU是STM32F405RGT6,即64脚LQFP封装的器件,只有GPIOA~C三个口可用,不过也足够了。数据从GPIOC的低字节输入,每250ns一个字节,因此只能使用DMA。
由TIM8定时产生DMA请求,DMA采用双缓冲区的方式,每传输64(256字节)个字节中断一次,由软件把数据倒腾出来并进行初步的预处理。
DMA的配置中,这里只挑重点说:
首先传输方向自然是PeripheralToMemory,设备数据宽度为字节,内存数据宽度为32位字,外设地址设置为GPIOC->IDP的地址。DMA缓冲区为一个二维数组,其基地址设置在DMA_SxM0AR中,后半区地址通过设置双缓冲区的函数设置。使能FIFO模式,外设和内存的突发模式都选择单次,而突发大小其实已经不重要了。
这里需要说明一下:其实内存的数据宽度也可以选择字节,然后禁止FIFO模式(即采用直接模式)。不过这种做法并太好,因为每250ns就需要触发一次写内存的DMA,会影响主程序的执行效率。如果每次DMA传输的数据量是4字的整数倍,甚至可以采用更大的突发模式,例如突发阈值设置成全满,内存突发大小设置成4拍,这样每4个字才触发写内存的DMA操作,充分利用器件内部的FIFO资源。
DMA中断服务例程使用汇编语言编写,是为了能够足够快地完成。实际上即使用C语言也没有问题。
我的设计已经通过验证。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 15:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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