This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我正在尝试 使用 UDMA 将数据从存储器传输到 GPIO。
我的目标是使用 uDMA 将几个字节从存储器(源)传输到 PORTD (目标)。
我使用 的是 TIvAware c_series_2_1_4_178库。
我修改 了 UDMA_DEMON.c 以实现上述目标。
当我尝试内存到内存传输时,它工作正常。 但是、当我将目的地址更改为 GPIO PORTD 时、不会生成 UDMA 中断。
我 进行了以下更改。
// mem 到 GPIO ControlSet
uDMAChannelControlSet (UDMA_CHANGE_SW | UDMA_PRI_SELECT、
UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE |
UDMA_ARB_1);
//内存到 GPIO TransferSet
uDMAChannelTransferSet (UDMA_CHANGE_SW | UDMA_PRI_SELECT、
UDMA_MODE_BASIC、g_ui32SrcBuf、(void *)(GPIO_PORTN_BASE+0x0)、
MEM_buffer_size);
我怀疑 在 uDMAChannelTransferSet 函数中使用的目标地址可能错误。 如何正确指定此.correctly。
Tivaware 外设驱动程序库在592页有以下注释
注:
当 GPIO_O_DATA 寄存器是源或目标时、应用程序代码必须
使用位段地址空间、而不是指定源地址或目标地址
GPIO_DATA。
如何处理上述问题?
提前感谢您的帮助。
抱歉。 小幅修正。 端口为 PORTN
好的。 我通过之前的帖子找到了实现这一目的的方法。
正确的方法是:
// mem 到 GPIO
uDMAChannelControlSet (UDMA_CHANGE_SW | UDMA_PRI_SELECT、
UDMA_SIZE_32 | UDMA_SRC_INC_32 | UDMA_DST_INC_NONE |
UDMA_ARB_256);
uDMAChannelTransferSet (UDMA_CHANGE_SW | UDMA_PRI_SELECT、
UDMA_MODE_AUTO、g_ui32SrcBuf、(void *)(GPIO_Porte _AHB_BASE +0x3fc)、
MEM_buffer_size);
我只能对端口 A 至 J 执行上述操作
现在数据出现在 Porte 上、对于多 个请求(无抖动)、数据非常稳定。
一个相关的问题是、如何 使用单个 UDMA 传输器将16位数据从存储器传输到两个相邻端口、例如 E 和 F。
其目的是使用没有 LCD 外设的 TM4C1294NCPDT 制作光栅图形 LCD 驱动器。
感谢你的任何帮助。
您好、Krishna、
UDMA 支持存储器到存储器、存储器到外设和外设到存储 器的传输、但不支持外设到外设的传输、因此您将无法在单个 DMA 传输中执行此操作。 执行此操作需要两次传输。
此致、
Ralph Jacobi
您好、Ralph、
我 想执行 内存到外设传输、而不是外设到 外设。
我想要的是同时将2个字节的数据从存储器传输到两个端口(例如 E 和 F)。
如果我要将单个像素16位 RGB 数据传输到 LCD 显示屏、则需要执行此操作。
是否有办法做到这一点?
此致、
Krishna
您好、Krishna、
不可能100%同时执行、它将背靠背。 总线架构不允许在同一 CPU 周期内写入不同的寄存器位置。
此致、
Ralph Jacobi
感谢 Ralph 的澄清。 我假设我必须在微控制器外部使用 FIFO 来同步来自2个端口 j 的2个字节
您能否提供有关使用 TM4C1294NCPDT 驱动光栅图形 LCD 的设计的任何参考?
此致
Krishna
您好、Krishna、
如果您是指实际的硬件接口、我们没有类似的东西、因为通常客户会使用我们的 LCD 控制器外设或 SSI。
至于图形部分本身、它作为图形库在 TivaWare 中提供。 TivaWare 中提供了大量相关文档。 我们还在编写有关该主题的新应用手册、但不确定该手册的推出时间。
此致、
Ralph Jacobi
您好、Ralph、
我有另一个问题。 当我们触发存储器到 GPIO 单次请求传输时、从端口引脚到另一端口的数据可用性的 UDMA 请求的最快可实现响应时间是多少?
我在 EK_TM4C124XL 上做了一个实验 、在 Porte Pin0发出使用 uDMA 的请求的情况下、将数据从存储器传输到 PORTB。
我的观察结果是、从 Porte Pin0的下降沿到 PORTB 的数据更改需要100ns 才能进行单次传输(基本模式)。
在自动模式下、第一次传输仍然需要100ns、随后 的传输每字节需要50ns。
CPU 频率设置为120MHz。
问题是、这是我们在 TM4C1294的 uDMA 中可以实现的最佳传输速率吗? 如果有改进方法,如何进行。
理想情况下、对于单次请求、我希望获得每字节40ns 的传输速率。
提前感谢。
此致。
您好、Krishna、
这在我对 DMA 预期的时序范围内。 实际上没有任何方法可以加快 UDMA 的速度。
如果这是一项硬性要求、我认为没有外部电路就无法满足。 如前所述、所有客户都使用 SSI 或 LCD 控制器来实现此类应用。
这是转换之间的时间、不一定是实际的数据输出? 如果是、您可能可以使用一些外部缓冲器 IC? 这就是我在外部电路方面的想法。
此致、
Ralph Jacobi
您好、Ralph、
我正在尝试使用 TM4C1294的 RAM 驱动每像素4位的光栅 LCD 显示屏。 分辨率为800x480 就可以了(192KB 的帧缓冲区。 这在微控制器的 RAM 内提供了一个双缓冲器选项)。 您建议使用 SSI。 这是您所说的四路 SSI 吗? 能否在 uDMA 中配置 QSSI 以生成像素时钟和驱动光栅 LCD 的4位数据?
此致。
您好 Kumar、
借助 SSI 或四 SSI、客户可驱动外部 LCD 控制器 IC、该 IC 通过 SSI 接收像素数据、然后将其转换为 LCD 的并行输出以及时钟和控制信号。 如果未使用 LCD 控制器外设、则建议使用这种方法连接光栅显示屏。
此致、
Ralph Jacobi