各位大佬好,在使用DMA+SPI刷新一张图片时遇到一个问题。DMA一次传输的数据长度最大为65535,我一张图片的大小为240*320*16bit,远远大于CNTR的最大值。网上查了下stm32F4XX有双缓冲模式,好像可以解决,ch32v307手册上没有写这个模式,应该是不支持吧。
现在我用的办法,在刷新图片的时候加个while循环每发送一次65534个数据长度,使能一次DMA,同时更新图片数组的地址,循环第三次后,退出while循环。但是刷新出来的图片会有花屏错位的情况,在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; // 测试只发送一次 } 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传输完成标志 DMA_ClearFlag(DMA1_FLAG_TC3);//清除通道3传输完成标志 while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET); // 等待SPI发送缓冲区为空 while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)==SET); // 等待SPI为非BSY pic+=num1; } LCD_CS_Set(); }
刚学这方面的知识,望各位大佬指点下。感谢(*^_^*)
热门产品 :
CH32V317: 互联型青稞RISC-V MCU