andy哥,您看我这个程序刚编译完,还没初始化,怎么DMA REGISTER就有初值了呢?
还有就是,链式DMA定义如下:
struct des{
struct des * des_ptr;
volatile uint8_t (*start_addr)[];
volatile uint16_t dma_cfg;
volatile uint16_t xcnt;
volatile uint16_t xmod;
volatile uint16_t ycnt;
volatile uint16_t ymod;
};
typedef struct des des_struct;
//初始化链表:
des_struct des1 = {
&des2,
sFrame0,
0x7900 | DI_EN | WNR | WDSIZE_16| DMA2D,
720,
2,
288,
2};
des_struct des2 = {
&des1,
sFrame0+1,
0x7900 | DI_EN | WNR | WDSIZE_16| DMA2D,
720,
2,
288,
2};
void Init_PPI_DMA(des_struct * Des)
{
*pPPI_CONTROL = FLD_SEL | PACK_EN ;
*pPPI_FRAME = 625;
sync();
//connect PPI to DMA channel 0
*pDMA0_PERIPHERAL_MAP = 0x0;
*pDMA0_NEXT_DESC_PTR = Des; //DMA描述符链表的起点
*pDMA0_CONFIG = 0x7900 | DI_EN | WNR | WDSIZE_16| DMA2D ;
ssync();
}//end Init_PPI
Init_PPI_DMA(&des1);
enable_PPI_DMA();
后,能进入到DMA中断,但是缓存中没有数据,查看DMA寄存器发现没有完成和运行标,如下:
但是如果把上面红色的0x7900改为0x7400,只改这一个地方,程序就能跑了,真不知道是为什么,请问andy哥遇到过这样的情况么?我的链表明明就是9个元素,为什么NSIZE=9不行,NSIZE=4就可以了呢???十分不解。。。