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.

[参考译文] TMS570LC4357:将 CTCOUNT 用作 while 环路触发器

Guru**** 2442090 points
Other Parts Discussed in Thread: TMS570LC4357, HALCOGEN

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1267866/tms570lc4357-using-ctcount-as-while-loop-trigger

器件型号:TMS570LC4357
主题中讨论的其他器件: HALCOGEN

我们正在使用 TMS570LC4357中的 DMA 控制器、从闪存到 EMIF 总线进行4MB DMA 的校准。

 

我们只需要执行 DMA 一次、只需让处理器旋转、直到 DMA 完成。  在我们之前的 TMS570处理器上、我们使用了 CTCOUNT、只是等待它倒数到零。

 

在 TMS570LC4357上、DMA 正常运行、但 CTCOUNT 的值为0xF8DAF7E6、从不改变或递减。  

 

我已在 TMS570LC43x 参考手册中查看、根据表20-108、CTCOUNT 似乎仍应具有类似的功能。  

 

您能不能帮助我弄清楚我是使用 CTCOUNT 错误、还是告诉我使用 DMA 控制器中的寄存器来知道 DMA 传输何时完成的替代方法?  FWiw 我尝试使用 DMASTAT 而不是 CTCOUNT ,它似乎起作用。  我的担心是、根据轮询 DMASTAT、4MB DMA 花费了721毫秒、这可能对于我们的时间表来说是一个问题。

 

下面是一个代码片段、它显示了如何设置 DMA 通道和启动事务。  while 循环永远不会退出、因为 CTCOUNT 不会改变。

 

谢谢你。

 

 g_dmaCTRL g_dmaCTRLPKT;   /* DMA 控制数据包*/

 

 /*设置 DMA 传输*/

 

 G_dmaCTRLPKT。 SADD =      Source_Adrs 闪存;/*源地址(闪存开头)*/

 G_dmaCTRLPKT。 DADD =     缓冲器的 Base_Adrs;         /*目标地址(FPGA 缓冲器)*/

 G_dmaCTRLPKT。 CHCTRL =   0;                            /*待使用的 DMA 通道编号*/

 /*传输大小为(帧计数*元素计数*字大小)*/

 G_dmaCTRLPKT。 FRCNT =    NumWords/0x1000;            /*帧计数*/

 G_dmaCTRLPKT。 ELCNT =    0x1000;                       /*元素数量*/

 G_dmaCTRLPKT。 ELDOFFSET = 0;                            /*元素目标偏移量*/

 G_dmaCTRLPKT。 ELSOFFSET = 0;                            /*元素源偏移量*/

 G_dmaCTRLPKT。 FRDOFFSET = 0;                            /*帧目的偏移量*/

 G_dmaCTRLPKT。 FRSOFFSET = 0;                            /*帧源偏移*/

 G_dmaCTRLPKT。 PORTASGN = Porta_read_Porta_write;       /*端口分配*/

 G_dmaCTRLPKT。 RDSIZE =   access_32_bit;                /*读取大小*/

 G_dmaCTRLPKT。 WRSIZE =   access_32_bit;                /*写大小*/

 G_dmaCTRLPKT。 TTYPE =    block_transfer;               /*块传输*/

 G_dmaCTRLPKT。 ADDMODERD = ADDR_INC1;                    /*使读取地址递增*/

 G_dmaCTRLPKT。 ADDMODEWR = ADDR_INC1;                    /*写入地址递增*/

 G_dmaCTRLPKT。 AUTOINIT = AUTOINIT_OFF;                 /*自动初始化关闭*/

 

 /*让驱动程序在 DMA 控制存储器中初始化 DMA 结构*/

 dmaSetCtrlPacket (dma_CH0、g_dmaCTRLPKT);

 /*启用由软件触发的 DMA 通道*/

 dmaSetChEnable (DMA_CH0、DMA_SW);

 

 /*开始传输*/

 dmaEnable();

 

 /*等待传输完成*/

 while (dmaRAMREG->WCP[DMA_CH0].CTCOUNT > 0)

 {

 }

 

 dmaDisable();