嗨,对话框中,的内部DMA DA1468x支持来自GPIO输入?如果是,如何初始化DMA的触发器?我能做什么如果我想三角DMA timer0时钟和GPIO的来源- > P4_DATA_REG吗?提前谢谢你。
嗨techteh,
使用DMA传输的数据量大时迅速不使用CPU,例如通过I2C或SPI传输数据时,而不是当想读GPIO寄存器。您正在使用的寄存器是1个字节,那么事务将会花很长时间,因为DMA的初始化进度太慢了。DMA的同时,请注意,初始化需要太长时间的交易数据。所以,我强烈建议您阅读的直接不使用DMA寄存器,因为这项技术更快的使用DMA。
谢谢,PM_Dialog
你好,谢谢你的回复,是的我想要一个大的数据量迅速转不使用CPU。这个大数据经过GPIO。我有一个2 k字节数组在内存中,我想读GPIO口4值并保存这些字节2 k字节数组,每1微。这意味着dest_address数组在内存和src_address GPIO - > P4_DATA_REG。所以,我的问题是dma_req_mux呢?我已经建立了一个1 MHz时钟信号。有什么方法可以转移GPIO价值与DMA数组在内存中,这个时钟信号触发?
谢谢。
你提出的是可能你可以执行内存到内存的DMA过渡语,所以您可以使用hw从记忆转移到所需的注册GPIO。但是没有从对话框在这样一个用例实现,也不支持这种functionallity 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为了执行交易,如果这就是你的意思。
由于MT_dialog
你好,我很感谢你的回复和你提供的样例代码。我没有一个外部时钟。我想使用内部定时器0三角DMA在每一个时钟信号1微秒。要做到这一点呢?如果不是,你说“HW_DMA_TRIG_NONE”意味着16兆赫在我的情况下的系统时钟。有另一种方式来减少这个时钟值1 MHz DMA触发?16兆赫太高对于我的外部设备连接的。
HW_DMA_TRIG_NONE意味着一旦你设置DMA_ON DMA本身将开始运行与DMA时钟从内存到内存访问不能以类似的方式被触发,外围设备可以被触发。现在如前所述DMA运行与系统时钟,这并不意味着你会看到GPIOs切换16兆赫频率、DMA需要超过一个周期为了做一个事务。除此之外通过减少AHB时钟或APB时钟为了得到频率,你希望你可以得到你想频率,但它不是一个良好的实践的所有模块运行在较低的时钟。另外在某些时候核心还需要AHB总线,并将阻止DMA访问总线。什么可能是一个解决方案是生成错误触发1 mhz从另一个外围(并保持源和目标相同的)为了使设备在每个触发执行一个事务,但是你会有一个虚拟外设提供运行时间。
你好,我做了你的建议,我使用SPI外围的DMA触发,现在我的问题解决了。
很高兴你找到你的问题。
嗨techteh,
使用DMA传输的数据量大时迅速不使用CPU,例如通过I2C或SPI传输数据时,而不是当想读GPIO寄存器。您正在使用的寄存器是1个字节,那么事务将会花很长时间,因为DMA的初始化进度太慢了。DMA的同时,请注意,初始化需要太长时间的交易数据。所以,我强烈建议您阅读的直接不使用DMA寄存器,因为这项技术更快的使用DMA。
谢谢,PM_Dialog
你好,
谢谢你的回复,
是的我想要一个大的数据量迅速转不使用CPU。这个大数据经过GPIO。我有一个2 k字节数组在内存中,我想读GPIO口4值并保存这些字节2 k字节数组,每1微。这意味着dest_address数组在内存和src_address GPIO - > P4_DATA_REG。所以,我的问题是dma_req_mux呢?我已经建立了一个1 MHz时钟信号。有什么方法可以转移GPIO价值与DMA数组在内存中,这个时钟信号触发?
谢谢。
嗨techteh,
你提出的是可能你可以执行内存到内存的DMA过渡语,所以您可以使用hw从记忆转移到所需的注册
GPIO。但是没有从对话框在这样一个用例实现,也不支持这种functionallity 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为了执行交易,如果这就是你的意思。
由于MT_dialog
你好,
我很感谢你的回复和你提供的样例代码。
我没有一个外部时钟。我想使用内部定时器0三角DMA在每一个时钟信号1微秒。要做到这一点呢?如果不是,你说“HW_DMA_TRIG_NONE”意味着16兆赫在我的情况下的系统时钟。有另一种方式来减少这个时钟值1 MHz DMA触发?16兆赫太高对于我的外部设备连接的。
谢谢。
嗨techteh,
HW_DMA_TRIG_NONE意味着一旦你设置DMA_ON DMA本身将开始运行与DMA时钟从内存到内存访问不能以类似的方式被触发,外围设备可以被触发。现在如前所述DMA运行与系统时钟,这并不意味着你会看到GPIOs切换16兆赫频率、DMA需要超过一个周期为了做一个事务。除此之外通过减少AHB时钟或APB时钟为了得到频率,你希望你可以得到你想频率,但它不是一个良好的实践的所有模块运行在较低的时钟。另外在某些时候核心还需要AHB总线,并将阻止DMA访问总线。什么可能是一个解决方案是生成错误触发1 mhz从另一个外围(并保持源和目标相同的)为了使设备在每个触发执行一个事务,但是你会有一个虚拟外设提供运行时间。
由于MT_dialog
你好,
我做了你的建议,
我使用SPI外围的DMA触发,现在我的问题解决了。
谢谢。
嗨techteh,
很高兴你找到你的问题。
谢谢,PM_Dialog