|
请教下,使用stm32f7x硬件解码avi视频+emwin并显示出现闪烁?
都是使用 dma2d 输出
视频效果地址:
https://v.youku.com/v_show/id_XM ... j.8428770.3416059.1
视频中,SCB_CleanInvalidateDCache(); 这个函数是没有屏蔽的
// **********************************************************************************************************************************************
在解码期间,如果屏蔽如下函数里面的 SCB_CleanInvalidateDCache 这个函数,显示画面比较稳定,不会出现闪烁,抖动的情况,但是显示的画面是黑丝或者有黑点条状:
static void AVI_HardDecodeFrame(uint16_t _usX,
uint16_t _usY,
unsigned int buf,
unsigned int size,
uint32_t AviOutAddrBuff)
{
uint8_t _JpegProcessing_End;
AVI_JPEG_Decode_DMA(&JPEG_Handle, (uint32_t)buf, size , AviOutAddrBuff);
_JpegProcessing_End = 0;
do
{
// SCB_CleanInvalidateDCache(); //貌似跟这个有关,吧这个函数屏蔽后显示就不会闪烁了,但是貌似没有视频图像出来,画面如下所以 ?????????
_JpegProcessing_End = JPEG_OutputHandler(&JPEG_Handle);
}while(_JpegProcessing_End == 0);
HAL_JPEG_GetInfo(&JPEG_Handle, &JPEG_Info);
AVI_DMA2D_Init(JPEG_Info.ImageWidth, JPEG_Info.ImageHeight);
AVI_DMA2D_CopyBuffer((uint32_t *)AviOutAddrBuff,
(uint32_t *)JPEG_LCD_FRAME_BUFFER,
_usX ,
_usY,
JPEG_Info.ImageWidth,
JPEG_Info.ImageHeight);
}
// **********************************************************************************************************************************************
屏蔽 SCB_CleanInvalidateDCache(); 这个函数后显示的效果画面如下:
// ************************************************************************************************************************
如果不使用 emwin 这个是没有问题的
// dma2d 显示函数
static void AVI_DMA2D_CopyBuffer(uint32_t *pSrc, uint32_t *pDst, uint16_t _usX, uint16_t _usY, uint16_t ImageWidth, uint16_t ImageHeight)
{
__IO uint32_t XaddrPutPixel = 0, timeout=0;
XaddrPutPixel = (BYTES_PER_PIXEL * (uint32_t)((_usY * LCD_PIXEL_WIDTH) + (_usX)));
{
// 查询法
DMA2D->CR &= ~DMA2D_CR_START; // 现停止 dma2d
DMA2D->NLR &= ~(DMA2D_NLR_NL | DMA2D_NLR_PL);
DMA2D->NLR |= (ImageHeight | (ImageWidth << 16));
DMA2D->OMAR = (uint32_t)pDst + XaddrPutPixel;
DMA2D->FGMAR = (uint32_t)pSrc ;
DMA2D->CR |= DMA2D_CR_START; // 启动
while((DMA2D->ISR & (DMA2D_FLAG_TC)) == 0) //等待传输完成
{
timeout++;
if(timeout > 0X1FFFFF) break; //超时退出
}
DMA2D->IFCR |= (DMA2D_FLAG_TC | DMA2D_FLAG_CTC); //清除传输完成标志
}
}
|
|