嗨对话框,DA1468x的内部DMA是否支持GPIO的输入?如果是,如何初始化DMA的触发器?如果我想用Timer0时钟和GPIO-> P4_DATA_REG的源头触发DMA,我该怎么办?先感谢您。
嗨Techteh,
在不使用CPU的情况下快速传输大量数据时使用DMA,例如,当通过I2C或SPI传输数据时,而不是想要读取GPIO寄存器时。您使用的寄存器是1字节,因此交易需要很长时间,因为DMA的初始化太慢。此外,请注意,DMA的初始化从数据的交易中将花费太长。因此,我非常建议您直接读取GPIO寄存器而不使用DMA,因为这种技术从使用DMA时更快。
谢谢,PM_DIALOG.
嗨,感谢您的回复,是的,我想在不使用CPU的情况下快速传输大量数据。这个大数据通过GPIO。我在内存中有一个2k字节数组,我想读取GPIO端口4值并将这些字节保存到此2K字节数组,每1微秒。这意味着dest_address是内存中的数组,src_address是gpio-> p4_data_reg。所以,我的问题是dma_req_mux怎么样?我已经为此建立了1 MHz时钟信号。是否有没有办法将GPIO值转移到具有DMA和此时钟信号触发器的内存中的数组?
谢谢。
您提出的可能性,您可以让DMA对内存转换进行内存,因此是的,您可以使用HW从内存传输到所需的寄存器GPIO。但是在这样的用例中没有对话框的实现,并且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(array);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.circular = 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 = 0x50003002;gpio_bitbang.length = sizeof(array);gpio_bitbang.callback = fn;
hw_dma_channel_initialization(&gpio_bitbang);hw_dma_channel_enable(gpio_bitbang.channel_number,hw_dma_state_enabled);
也是DMA使用的时钟是系统时钟,您无法将外部时钟应用于DMA以便执行交易,如果这是您的意思。
谢谢mt_dialog.
嗨,我非常感谢您的回复和您提供的示例代码。我没有外部时钟。我想在每1微秒中使用内部定时器0时钟信号到Trig DMA。无论如何要这样做吗?如果没有,你说“HW_DMA_TRIG_NONE”表示我的情况下为16 MHz的系统时钟。是否有另一种方法可以将此时钟值降低到1 MHz的DMA触发?对于连接到GPIO的外部设备,16 MHz太高。
HW_DMA_TRIG_NONE意味着,只要您设置DMA本身就会开始使用DMA时钟开始运行,因为在存储器访问中,无法以类似的方式触发外围设备的类似方式。现在如上所述DMA与系统时钟运行,这并不意味着您将看到GPIOS以16MHz频率切换,DMA需要多个周期以进行事务。除了通过减少AHB时钟或APB时钟来获得您希望您希望的频率,可以获得您想要的频率,但它并不是如此良好的做法,以便在低时钟中运行所有模块。此外,核心还需要AHB总线并将停止DMA访问总线。什么可能是解决方案是从另一个外设(并保持源和目标相同)生成1MHz的错误触发,以便设备在每个触发器中执行事务,但是您将有一个虚拟外围运行运行提供时间。
你好,我做了你的建议,我使用SPI外设进行DMA触发器,现在我的问题解决了。
很高兴你想到了你的问题。
嗨Techteh,
在不使用CPU的情况下快速传输大量数据时使用DMA,例如,当通过I2C或SPI传输数据时,而不是想要读取GPIO寄存器时。您使用的寄存器是1字节,因此交易需要很长时间,因为DMA的初始化太慢。此外,请注意,DMA的初始化从数据的交易中将花费太长。因此,我非常建议您直接读取GPIO寄存器而不使用DMA,因为这种技术从使用DMA时更快。
谢谢,PM_DIALOG.
嗨,
感谢您的回复,
是的,我想在不使用CPU的情况下快速传输大量数据。这个大数据通过GPIO。我在内存中有一个2k字节数组,我想读取GPIO端口4值并将这些字节保存到此2K字节数组,每1微秒。这意味着dest_address是内存中的数组,src_address是gpio-> p4_data_reg。所以,我的问题是dma_req_mux怎么样?我已经为此建立了1 MHz时钟信号。是否有没有办法将GPIO值转移到具有DMA和此时钟信号触发器的内存中的数组?
谢谢。
嗨Techteh,
您提出的可能性,您可以让DMA对内存转换进行内存,因此是的,您可以使用HW从内存传输到所需的寄存器
GPIO。但是在这样的用例中没有对话框的实现,并且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(array);
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.circular = 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 = 0x50003002;
gpio_bitbang.length = sizeof(array);
gpio_bitbang.callback = fn;
hw_dma_channel_initialization(&gpio_bitbang);
hw_dma_channel_enable(gpio_bitbang.channel_number,hw_dma_state_enabled);
也是DMA使用的时钟是系统时钟,您无法将外部时钟应用于DMA以便执行交易,如果这是您的意思。
谢谢mt_dialog.
嗨,
我非常感谢您的回复和您提供的示例代码。
我没有外部时钟。我想在每1微秒中使用内部定时器0时钟信号到Trig DMA。无论如何要这样做吗?如果没有,你说“HW_DMA_TRIG_NONE”表示我的情况下为16 MHz的系统时钟。是否有另一种方法可以将此时钟值降低到1 MHz的DMA触发?对于连接到GPIO的外部设备,16 MHz太高。
谢谢。
嗨Techteh,
HW_DMA_TRIG_NONE意味着,只要您设置DMA本身就会开始使用DMA时钟开始运行,因为在存储器访问中,无法以类似的方式触发外围设备的类似方式。现在如上所述DMA与系统时钟运行,这并不意味着您将看到GPIOS以16MHz频率切换,DMA需要多个周期以进行事务。除了通过减少AHB时钟或APB时钟来获得您希望您希望的频率,可以获得您想要的频率,但它并不是如此良好的做法,以便在低时钟中运行所有模块。此外,核心还需要AHB总线并将停止DMA访问总线。什么可能是解决方案是从另一个外设(并保持源和目标相同)生成1MHz的错误触发,以便设备在每个触发器中执行事务,但是您将有一个虚拟外围运行运行提供时间。
谢谢mt_dialog.
你好,
我做了你的建议,
我使用SPI外设进行DMA触发器,现在我的问题解决了。
谢谢。
嗨Techteh,
很高兴你想到了你的问题。
谢谢,PM_DIALOG.