嗨,对话框中,DA1468x的内部DMA是否支持GPIO的输入?如果是,如何初始化DMA触发器?如果我想用timer0时钟和源GPIO->P4_DATA_REG三角DMA,我能做什么?先谢谢你。
嗨techteh,
DMA用于在不使用CPU的情况下快速传输大量数据时,例如通过I2C或SPI传输数据时,而不是在希望读取GPIO寄存器时。您正在使用的寄存器是1字节,因此事务将花费很长时间,因为DMA的初始化太慢了。另外,请注意,DMA的初始化将占用您的数据事务太长的时间。因此,我强烈建议您直接读取GPIO寄存器而不使用DMA,因为这种技术比使用DMA更快。
谢谢,PM_Dialog
你好,谢谢您的回复,是的,我想在不使用CPU的情况下快速传输大量数据。这个大数据通过GPIO。我有一个2K字节数组在内存中,我想读取GPIO端口4的值,并将这些字节保存到这个2K字节数组,每1微秒。这意味着dest_address是内存中的Array, src_address是GPIO->P4_DATA_REG。我的问题是,dma_req_mux怎么样?我已经为此建立了一个1兆赫时钟信号。是否有任何方法将GPIO值转移到内存中的阵列与DMA和这个时钟信号触发器?
谢谢。
您所建议的是,您可以使用DMA来执行内存到内存的事务,因此,是的,您可以使用hw从内存转移到所需的寄存器GPIO。但是Dialog没有实现这种用例,而且SDK也不支持这种功能,所以你必须直接使用低级驱动程序。一些类似代码的东西应该做的工作:
gpio_bitbang。channel_number = HW_DMA_CHANNEL_1;gpio_bitbang。bus_width = HW_DMA_BW_HALFWORD;gpio_bitbang。irq_enable = HW_DMA_IRQ_STATE_ENABLED;gpio_bitbang。irq_nr_of_trans = sizeof(数组);gpio_bitbang。dreq_mode = HW_DMA_DREQ_START;gpio_bitbang。a_inc = HW_DMA_AINC_TRUE;gpio_bitbang。b_inc = HW_DMA_BINC_FALSE;gpio_bitbang。圆= HW_DMA_MODE_NORMAL;gpio_bitbang。dma_prio = HW_DMA_PRIO_6;gpio_bitbang。dma_idle = HW_DMA_IDLE_INTERRUPTING_MODE;gpio_bitbang。dma_init = HW_DMA_INIT_AX_BX_AY_BY;gpio_bitbang。dma_req_mux = HW_DMA_TRIG_NONE;gpio_bitbang。src_address = (uint32_t)数组;gpio_bitbang.dest_address = 0 x50003002;gpio_bitbang。长度= sizeof(数组);gpio_bitbang。回调= fn;
hw_dma_channel_initialization (&gpio_bitbang);hw_dma_channel_enable (gpio_bitbang。channel_number HW_DMA_STATE_ENABLED);
此外,DMA使用的时钟是系统时钟,您不能为了执行事务而将外部时钟应用到DMA,如果这是您的意思的话。
由于MT_dialog
你好,非常感谢您的回复和您提供的样本代码。我没有外部时钟。我想使用内部定时器0时钟信号在每1微秒三角DMA。有办法做到这一点吗?如果不是,您说“HW_DMA_TRIG_NONE”意味着系统时钟在我的情况下是16mhz。是否有另一种方法将DMA触发器的时钟值减少到1 MHz ?16兆赫对连接到GPIO的外部设备来说太高了。
HW_DMA_TRIG_NONE意味着一旦设置了DMA_ON, DMA本身就会开始与DMA时钟一起运行,因为在内存到内存访问中不能以与触发外围设备类似的方式触发。现在,正如所提到的,DMA与系统时钟一起运行,这并不意味着你将看到你的gpio切换16MHz频率,DMA需要一个以上的周期来做一个事务。除此之外,通过减少AHB时钟或APB时钟来得到你想要的频率你可以得到你想要的频率但是让所有模块在低时钟中运行不是一个很好的实践。此外,在某些情况下,核心还将需要AHB总线,并将停止DMA访问总线。一个可能的解决方案是在1MHz从另一个外设生成假触发器(并保持源和目的地相同),以便设备在每个触发器中执行事务,但同样,您将有一个虚拟外设运行,以提供时间。
你好,我照你说的做了我使用SPI外设为DMA触发器,现在我的问题解决了。
很高兴你把问题解决了。
嗨techteh,
DMA用于在不使用CPU的情况下快速传输大量数据时,例如通过I2C或SPI传输数据时,而不是在希望读取GPIO寄存器时。您正在使用的寄存器是1字节,因此事务将花费很长时间,因为DMA的初始化太慢了。另外,请注意,DMA的初始化将占用您的数据事务太长的时间。因此,我强烈建议您直接读取GPIO寄存器而不使用DMA,因为这种技术比使用DMA更快。
谢谢,PM_Dialog
你好,
谢谢您的回复,
是的,我想在不使用CPU的情况下快速传输大量数据。这个大数据通过GPIO。我有一个2K字节数组在内存中,我想读取GPIO端口4的值,并将这些字节保存到这个2K字节数组,每1微秒。这意味着dest_address是内存中的Array, src_address是GPIO->P4_DATA_REG。我的问题是,dma_req_mux怎么样?我已经为此建立了一个1兆赫时钟信号。是否有任何方法将GPIO值转移到内存中的阵列与DMA和这个时钟信号触发器?
谢谢。
嗨techteh,
您所建议的是,您可以使用DMA来执行内存到内存的事务,因此,是的,您可以使用hw从内存转移到所需的寄存器
GPIO。但是Dialog没有实现这种用例,而且SDK也不支持这种功能,所以你必须直接使用低级驱动程序。一些类似代码的东西应该做的工作:
gpio_bitbang。channel_number = HW_DMA_CHANNEL_1;
gpio_bitbang。bus_width = HW_DMA_BW_HALFWORD;
gpio_bitbang。irq_enable = HW_DMA_IRQ_STATE_ENABLED;
gpio_bitbang。irq_nr_of_trans = sizeof(数组);
gpio_bitbang。dreq_mode = HW_DMA_DREQ_START;
gpio_bitbang。a_inc = HW_DMA_AINC_TRUE;
gpio_bitbang。b_inc = HW_DMA_BINC_FALSE;
gpio_bitbang。圆= HW_DMA_MODE_NORMAL;
gpio_bitbang。dma_prio = HW_DMA_PRIO_6;
gpio_bitbang。dma_idle = HW_DMA_IDLE_INTERRUPTING_MODE;
gpio_bitbang。dma_init = HW_DMA_INIT_AX_BX_AY_BY;
gpio_bitbang。dma_req_mux = HW_DMA_TRIG_NONE;
gpio_bitbang。src_address = (uint32_t)数组;
gpio_bitbang.dest_address = 0 x50003002;
gpio_bitbang。长度= sizeof(数组);
gpio_bitbang。回调= fn;
hw_dma_channel_initialization (&gpio_bitbang);
hw_dma_channel_enable (gpio_bitbang。channel_number HW_DMA_STATE_ENABLED);
此外,DMA使用的时钟是系统时钟,您不能为了执行事务而将外部时钟应用到DMA,如果这是您的意思的话。
由于MT_dialog
你好,
非常感谢您的回复和您提供的样本代码。
我没有外部时钟。我想使用内部定时器0时钟信号在每1微秒三角DMA。有办法做到这一点吗?如果不是,您说“HW_DMA_TRIG_NONE”意味着系统时钟在我的情况下是16mhz。是否有另一种方法将DMA触发器的时钟值减少到1 MHz ?16兆赫对连接到GPIO的外部设备来说太高了。
谢谢。
嗨techteh,
HW_DMA_TRIG_NONE意味着一旦设置了DMA_ON, DMA本身就会开始与DMA时钟一起运行,因为在内存到内存访问中不能以与触发外围设备类似的方式触发。现在,正如所提到的,DMA与系统时钟一起运行,这并不意味着你将看到你的gpio切换16MHz频率,DMA需要一个以上的周期来做一个事务。除此之外,通过减少AHB时钟或APB时钟来得到你想要的频率你可以得到你想要的频率但是让所有模块在低时钟中运行不是一个很好的实践。此外,在某些情况下,核心还将需要AHB总线,并将停止DMA访问总线。一个可能的解决方案是在1MHz从另一个外设生成假触发器(并保持源和目的地相同),以便设备在每个触发器中执行事务,但同样,您将有一个虚拟外设运行,以提供时间。
由于MT_dialog
你好,
我照你说的做了
我使用SPI外设为DMA触发器,现在我的问题解决了。
谢谢。
嗨techteh,
很高兴你把问题解决了。
谢谢,PM_Dialog