各位大佬好,在使用DMA+SPI刷新一張圖片時遇到一個問題。DMA一次傳輸?shù)臄?shù)據(jù)長度最大為65535,我一張圖片的大小為240*320*16bit,遠(yuǎn)遠(yuǎn)大于CNTR的最大值。網(wǎng)上查了下stm32F4XX有雙緩沖模式,好像可以解決,ch32v307手冊上沒有寫這個模式,應(yīng)該是不支持吧。
現(xiàn)在我用的辦法,在刷新圖片的時候加個while循環(huán)每發(fā)送一次65534個數(shù)據(jù)長度,使能一次DMA,同時更新圖片數(shù)組的地址,循環(huán)第三次后,退出while循環(huán)。但是刷新出來的圖片會有花屏錯位的情況,在21ic那邊也問了,幾位老師給出的方法,也沒有解決。
下面是刷新圖片的方法。
void?LCD_ShowPicture(u16?x,u16?y,u16?length,u16?width,const?u8?pic[]) { ????u8?t=1; ????u32?num=length*width*2,num1; ????LCD_Address_Set(x,y,x+length-1,y+width-1); ????LCD_CS_Clr(); ????while(t) ????{ ????????if(num>65534) ????????{ ????????????num-=65534; ????????????num1=65534; //????????????t=0;????????????????//?測試只發(fā)送一次 ????????} ????????else ????????{ ????????????t=0; ????????????num1=num; ????????} ????????MYDMA_Config(DMA1_Channel3,(u32)&SPI1->DATAR,(u32)pic,num1); ????????SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx,ENABLE); ????????MYDMA_Enable(DMA1_Channel3); ????????while(DMA_GetFlagStatus(DMA1_FLAG_TC3)==RESET);//?等待通道3傳輸完成標(biāo)志 ????????DMA_ClearFlag(DMA1_FLAG_TC3);//清除通道3傳輸完成標(biāo)志 ????????while(SPI_I2S_GetFlagStatus(SPI1,?SPI_I2S_FLAG_TXE)==RESET);????//?等待SPI發(fā)送緩沖區(qū)為空 ????????while(SPI_I2S_GetFlagStatus(SPI1,?SPI_I2S_FLAG_BSY)==SET);??????//?等待SPI為非BSY ????????pic+=num1; ????} ????LCD_CS_Set(); }
剛學(xué)這方面的知識,望各位大佬指點下。感謝(*^_^*)