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.

[参考译文] TMS320F28P650DH:DMA 设置

Guru**** 2519650 points
Other Parts Discussed in Thread: TMS320F28P650DH

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1384786/tms320f28p650dh-dma-settings

器件型号:TMS320F28P650DH

工具与软件:

嗨、大家好!

提前感谢您努力帮助我解决以下问题  

我想使用器件  tms320f28p650dh 中的 dma 进行以下传输。

我的源数组为 uint32 s_arr[8]、目标数组为 unint32 d_arr[16]。 传输应该就像将 srsource 数组复制到目标数组中一样、不会干扰 CPU 和连续模式。

--- (稍后我将使用源阵列作为 ADCPPBSUM 和计数值、这样我就可以连续存储两个结果以供进一步处理、但现在 RAM 中的任何阵列都可以)--现在不需要了。  

我正在使用控制卡监控转接是否成功。 我尝试了许多设置、但尽管活动 ADDR 指针在调试会话中是正确的、但似乎没有发生内存传输。 这是我的 DMA 配置-

extern Uint32 adcBuffer_dst[16]={0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0};
extern Uint32 adcBuffer_src[8]={50、51,552、5、54、55、56、57};

转接后、我希望结果为----  adcBuffer_dst[16]={50,51,52,53,54,55,56,57,50,51,53,54,55,56,57}  ;

void initDMA (void)

uint16_t i;
__ EALLOW ();

DmaRegs.DMACTRL.bit.hardreset = 1;
asm (" NOP");
asm (" NOP");
DmaRegs.DMACTRL.bit.hardreset = 0;

//在突发内
DmaRegs.ch1.burst_size.all = 7;//每次传输8次突发
DmaRegs.CH1.SRC_BURST_STEP = 1;//源地址递增1  
DmaRegs.CH1.dst_BURST_STEP = 1;//目标地址递增1

DmaRegs.ch1.transfer_size = 1;//一次传输中出现2个突发
DmaRegs.CH1.SRC_TRANSFER_STEP =-7;//源地址回至 s[0]
DmaRegs.ch1.dst_transfer_step = 0;//目标地址继续

DmaRegs.ch1.control.bit.ERRCLR = 1;


// DmaRegs.ch1.dst_wrap_size =-1;//在 buffer_size 之后换行目标地址
// DmaRegs.ch1.dst_wrap = 0;// Step Back to start of buffer (步回缓冲区的起始位置)
DmaRegs.CH1.SRC_WRAP_SIZE =-1;//在 Buffer_size 之后换行目标地址
DmaRegs.CH1.SRC_WRAP_STEP = 0;// Step Back to start of buffer (返回缓冲区的起始位置)

DmaRegs.CH1.MODE.bit.CHINTE = 0;// Disable channel interrupt
DmaRegs.CH1.MODE.bit.OneShot = 0;//禁用单触发模式
DmaRegs.ch1.mode.bit.continuous = 1;//连续模式已启用
DmaRegs.ch1.mode.bit.PERINTSEL = DMA_TRIGGER_SOFTWARE;// DMA_ADCBINT3;//外设中断源
DmaRegs.CH1.MODE.bit.PERINTE = 1;// Peripheral interrupt enable (DmaRegs.CH1.MODE.bit.PERINTE = 1)
DmaRegs.DEBUGCTRL.bit.free = 1;
DmaRegs.ch1.control.bit.run = 1;

DmaRegs.CH1.SRC_ADDR_SHADOW =(UINT32) adcBuffer_src;//源地址
DmaRegs.CH1.dst_ADDR_SHADOW =(UINT32) adcBuffer_dst;//目标地址
//DmaRegs.ch1.dst_beg_ADDR_shadow =(UINT16) adcBuffer_dst;
//DmaRegs.ch1.SRC_BEG_ADDR_SHADOW =(UINT16) adcBuffer_src;

_EDIS();

}

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

    gsram1中的存储器分配以及修改共同解决了这个问题