工具/软件:Code Composer Studio
您好:
我的器件是 tms570LC43x、我测试以下软代码以使用 DMA_SW 触发 DMA,、但它不起作用、我发现语句"dmaSetChEnable (DMA_CH0、DMA_SW)"不会更改 SWCHENAS 寄存器的值、我不知道原因、是否有任何需要特别注意的地方?
顺便说一下、我测试了"example_sci_dma.c"示例、它运行良好、 我知道"如果启用了 SCI DMA、 当数据写入 SCITD 且 TXRDY 置位时、SCI TX DMA 请求被发送到 DMA "、但我在发送请求之前看不到任何数据被写入 SCITD、它如何发送请求?我找到"sciREG3->SETINT |= SCI_SET_TX_DMA | SCI_SET_RX_DMA| SCI_SET_SEND_DMA;这是所有类型的"DMA 奇怪的是,谁能解释这一点?
int main (空)
{
/*用户代码开始(3)*/
uint32 src0[transfer_size]={0x11111111、0x22222222、0x333333、0x444444、0x555555、 0x66666666、0x77777777、0x8888888888};
uint32 src1[transfer_size]={0x99999999、0xaaaaaaaaaa、0xbbbbbbbb、0xcccccc、0xdddddddd、 0xeeeeee、0xffffffff、0x12345678};
uint32 src2[transfer_size]={0x11223344、0x55667788、0x99aabbcc、0xddeeff00、0x12345678、 0x1、3579bdf、0x2468ace0、0x87654321};
uint32 dest0[transfer_size]={0};
uint32 dest1[transfer_size]={0};
uint32 dest2[transfer_size]={0};
/*启用 IRQ 中断*/
_enable_IRQ ();
dmaEnable();
/*-配置 DMA 控制数据包*/
G_dmaCTRLPKT.Sadd =(uint32_t) src0;/*源地址*
G_dmaCTRLPKT.DADD =(uint32_t) dest0;/*目标地址;TG0的起始地址*/
G_dmaCTRLPKT.CHCTRL = DMA_CH1 + 1;/*通道控制*
G_dmaCTRLPKT.FRCNT = F_COUNT;/*帧计数*/
G_dmaCTRLPKT.ELCNT = E_COUNT;/*元素计数*
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 = frame_transfer;/* transfer type *
G_dmaCTRLPKT.ADDMODERD = ADDR_INC1;/*地址模式读取*
G_dmaCTRLPKT.ADDMODEWR = ADDR_INC1;/*地址模式写入*
G_dmaCTRLPKT.AUTOINIT = AUTOINIT_OFF;/*自动初始化*/
//为接收设置 DMA 控制数据包
dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT);
/*-配置 DMA 控制数据包*/
G_dmaCTRLPKT.Sadd =(uint32_t) src1;//源地址*
G_dmaCTRLPKT.DADD =(uint32_t) dest1;/*目标地址;TG0的起始地址*/
G_dmaCTRLPKT.CHCTRL = DMA_CH2 + 1;/*通道控制*
G_dmaCTRLPKT.FRCNT = F_COUNT;/*帧计数*/
G_dmaCTRLPKT.ELCNT = E_COUNT;/*元素计数*
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 = frame_transfer;/* transfer type *
G_dmaCTRLPKT.ADDMODERD = ADDR_INC1;/*地址模式读取*
G_dmaCTRLPKT.ADDMODEWR = ADDR_INC1;/*地址模式写入*
G_dmaCTRLPKT.AUTOINIT = AUTOINIT_OFF;/*自动初始化*/
//为接收设置 DMA 控制数据包
dmaSetCtrlPacket (DMA_CH1、g_dmaCTRLPKT);
/*-配置 DMA 控制数据包*/
G_dmaCTRLPKT.Sadd =(uint32_t) src2;/*源地址*
G_dmaCTRLPKT.DADD =(uint32_t) dest2;/*目标地址;TG0的起始地址*/
G_dmaCTRLPKT.CHCTRL = 0;/*通道控制*/
G_dmaCTRLPKT.FRCNT = F_COUNT;/*帧计数*/
G_dmaCTRLPKT.ELCNT = E_COUNT;/*元素计数*
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 = frame_transfer;/* transfer type *
G_dmaCTRLPKT.ADDMODERD = ADDR_INC1;/*地址模式读取*
G_dmaCTRLPKT.ADDMODEWR = ADDR_INC1;/*地址模式写入*
G_dmaCTRLPKT.AUTOINIT = AUTOINIT_OFF;/*自动初始化*/
//为接收设置 DMA 控制数据包
dmaSetCtrlPacket (dma_ch2、g_dmaCTRLPKT);
dmaSetChEnable (DMA_CH0、DMA_SW);//启用 DMA 通道*
dmaSetChEnable (DMA_CH1、DMA_HW);
dmaSetChEnable (DMA_CH2、DMA_HW);
while ((dmaREG->HWCHENAS & 0x07)!= 0x0);
while (1);/*循环永远*/
/*用户代码结束*/
返回0;
}