嗨,对话,DA1468x的内部DMA是否支持GPIO输入?如果是,如何初始化DMA的触发器?如果我想用timer0时钟和GPIO->P4\u DATA\u REG的源触发DMA,我该怎么办?先谢谢你。
高科技,
DMA用于在不使用CPU的情况下快速传输大量数据时,例如在通过I2C或SPI传输数据时,而不是在需要读取GPIO寄存器时。您使用的寄存器是1字节,因此事务将花费很长时间,因为DMA的初始化太慢。另外,要注意DMA的初始化将花费太长的时间来处理数据事务。因此,我强烈建议您不使用DMA直接读取GPIO寄存器,因为这种技术比使用DMA更快。
谢谢,下午好
你好,谢谢你的回复,是的,我想在不使用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.
您的建议是,您可以让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应用外部时钟来执行事务。
谢谢你的对话
你好,我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的外部设备来说太高。
HW\u DMA\u TRIG\u NONE意味着一旦您在DMA上设置DMA\u,DMA本身就将开始使用DMA时钟运行,因为在内存到内存的访问不能以与外设触发类似的方式触发。如前所述,DMA使用系统时钟运行,这并不意味着您将看到您的GPIO以16MHz频率切换,DMA需要一个以上的周期才能完成事务。除此之外,通过减少AHB时钟或APB时钟以获得您想要的频率,您可以获得您想要的频率,但让所有模块在低时钟下运行并不是一个好的做法。此外,在某些时候,核心还需要AHB总线,并将阻止DMA访问总线。一个可能的解决方案是从另一个外设以1MHz的频率生成错误的触发器(并且保持源和目标相同),以便设备在每个触发器中执行事务,但是同样地,为了提供时间,您将运行一个虚拟外设。
你好,我听了你的建议,我用SPI外设触发DMA,现在我的问题解决了。
很高兴你解决了你的问题。
高科技,
DMA用于在不使用CPU的情况下快速传输大量数据时,例如在通过I2C或SPI传输数据时,而不是在需要读取GPIO寄存器时。您使用的寄存器是1字节,因此事务将花费很长时间,因为DMA的初始化太慢。另外,要注意DMA的初始化将花费太长的时间来处理数据事务。因此,我强烈建议您不使用DMA直接读取GPIO寄存器,因为这种技术比使用DMA更快。
谢谢,下午好
你好,
谢谢你的回复,
是的,我想在不使用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.
高科技,
您的建议是,您可以让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应用外部时钟来执行事务。
谢谢你的对话
你好,
我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.
高科技,
HW\u DMA\u TRIG\u NONE意味着一旦您在DMA上设置DMA\u,DMA本身就将开始使用DMA时钟运行,因为在内存到内存的访问不能以与外设触发类似的方式触发。如前所述,DMA使用系统时钟运行,这并不意味着您将看到您的GPIO以16MHz频率切换,DMA需要一个以上的周期才能完成事务。除此之外,通过减少AHB时钟或APB时钟以获得您想要的频率,您可以获得您想要的频率,但让所有模块在低时钟下运行并不是一个好的做法。此外,在某些时候,核心还需要AHB总线,并将阻止DMA访问总线。一个可能的解决方案是从另一个外设以1MHz的频率生成错误的触发器(并且保持源和目标相同),以便设备在每个触发器中执行事务,但是同样地,为了提供时间,您将运行一个虚拟外设。
谢谢你的对话
你好,
我听了你的建议,
我用SPI外设触发DMA,现在我的问题解决了。
Thanks.
高科技,
很高兴你解决了你的问题。
谢谢,下午好