了解更多常见问题教程

8个职位/0个新职位
最后一篇文章
技术
离线
最后一次见到:3个月4周前
已加入:2018-07-16 12:09
GPIO DMA

嗨,对话,
DA1468x的内部DMA是否支持GPIO输入?如果是,如何初始化DMA的触发器?如果我想用timer0时钟和GPIO->P4\u DATA\u REG的源触发DMA,我该怎么办?
先谢谢你。

关键词:
设备:
PM\U对话框
离线
最后一次见到:3天14小时前
工作人员
已加入:2018-02-08 11:03
高科技,

高科技,

DMA用于在不使用CPU的情况下快速传输大量数据时,例如在通过I2C或SPI传输数据时,而不是在需要读取GPIO寄存器时。您使用的寄存器是1字节,因此事务将花费很长时间,因为DMA的初始化太慢。另外,要注意DMA的初始化将花费太长的时间来处理数据事务。因此,我强烈建议您不使用DMA直接读取GPIO寄存器,因为这种技术比使用DMA更快。

谢谢,下午好

技术
离线
最后一次见到:3个月4周前
已加入:2018-07-16 12:09
你好,

你好,
谢谢你的回复,
是的,我想在不使用CPU的情况下快速传输大量数据。这些大数据通过GPIO。我有一个2K字节数组在内存中,我想读取GPIO端口4的值,并保存这些字节到这个2K字节数组,每1微秒。这意味着dest\u地址是内存中的数组,src\u地址是GPIO->P4\u DATA\u REG。所以,我的问题是dma\u req\u mux呢?我已经建立了一个1兆赫的时钟信号。有没有什么方法可以通过DMA和这个时钟信号触发器将GPIO值传输到内存中的数组?

Thanks.

MT\u对话框
离线
最后一次见到:1 month 2 weeks ago
工作人员
已加入:2015-06-08 11:34
高科技,

高科技,

您的建议是,您可以让DMA执行内存到内存的转换,因此可以使用硬件从内存传输到所需内存的寄存器
GPIO。但是在这样一个用例上没有从Dialog实现,而且SDK也不支持这种功能,所以您必须直接使用底层驱动程序。类似代码的内容应该可以完成这项工作:

gpio_bitbang。channel_number = HW_DMA_CHANNEL_1;
gpio_bitbang。bus_width = HW_DMA_BW_HALFWORD;
gpio公司_bitbang.irq\u启用=HW\ DMA\ IRQ\状态\启用;
gpio公司_bitbang.irq\u交易编号=sizeof(数组);
gpio公司_bitbang.dreq\u模式=HW\u DMA\u DREQ\u启动;
gpio\u bitbang.a\u inc=HW\u DMA\u AINC\u TRUE;
gpio\u bitbang.b\u inc=HW\u DMA\u BINC\u FALSE;
gpio公司_bitbang.圆形=HW\u DMA\u MODE\u NORMAL;
gpio公司_bitbang.dma\优先=HW\u DMA\u PRIO\u 6;
gpio公司_bitbang.dma\u空闲=HW\ DMA\空闲\中断\模式;
gpio_bitbang。dma_init = HW_DMA_INIT_AX_BX_AY_BY;
gpio_bitbang。dma_req_mux = HW_DMA_TRIG_NONE;
gpio公司_bitbang.src\u地址=(uint32\t)数组;
gpio公司_bitbang.dest\u地址=0x50003002;
gpio公司_比特邦长度=sizeof(数组);
gpio公司_bitbang.回调=fn;

hw\u dma\u channel\u initialization(&gpio\u bitbang);
硬件dma信道启用(gpio_bitbang.channel\u编号、硬件\ DMA \状态\启用);

另外,DMA使用的时钟是系统时钟,如果这是您的意思,那么您不能为DMA应用外部时钟来执行事务。

谢谢你的对话

技术
离线
最后一次见到:3个月4周前
已加入:2018-07-16 12:09
你好,

你好,
我am so thankful for your reply and the sample code you provided.
我没有外置时钟。我想使用内部定时器0时钟信号触发DMA在每1微秒。有什么办法吗?如果不是,你说“HW\u DMA\u TRIG\u NONE”在我的例子中是指16mhz的系统时钟。有没有其他方法可以将DMA触发器的时钟值降低到1MHz?16 MHz对于连接到GPIO的外部设备来说太高。

Thanks.

MT\u对话框
离线
最后一次见到:1 month 2 weeks ago
工作人员
已加入:2015-06-08 11:34
高科技,

高科技,

HW\u DMA\u TRIG\u NONE意味着一旦您在DMA上设置DMA\u,DMA本身就将开始使用DMA时钟运行,因为在内存到内存的访问不能以与外设触发类似的方式触发。如前所述,DMA使用系统时钟运行,这并不意味着您将看到您的GPIO以16MHz频率切换,DMA需要一个以上的周期才能完成事务。除此之外,通过减少AHB时钟或APB时钟以获得您想要的频率,您可以获得您想要的频率,但让所有模块在低时钟下运行并不是一个好的做法。此外,在某些时候,核心还需要AHB总线,并将阻止DMA访问总线。一个可能的解决方案是从另一个外设以1MHz的频率生成错误的触发器(并且保持源和目标相同),以便设备在每个触发器中执行事务,但是同样地,为了提供时间,您将运行一个虚拟外设。

谢谢你的对话

技术
离线
最后一次见到:3个月4周前
已加入:2018-07-16 12:09
你好,

你好,
我听了你的建议,
我用SPI外设触发DMA,现在我的问题解决了。

Thanks.

PM\U对话框
离线
最后一次见到:3天14小时前
工作人员
已加入:2018-02-08 11:03
高科技,

高科技,

很高兴你解决了你的问题。

谢谢,下午好