STM32使用SPI DMA加双缓冲区的方式加速LCD显示BMP图片时刷屏速度

平台:STM32F103

功能:STM32F103通过FSMC的方式驱动320*480的3.5寸液晶屏,期间需要从SPI FLASH中读出已经转化为数组格式的BMP图片并显示处理,由于没有外挂SRAM,所以不能通过缓存完整个图片后在显示出来,只能读一部分然后显示一部分,此时就能明显看到刷屏的动作,使用DMA方式从SPI FLASH中读图片数据,采用双缓冲区,可以加快刷屏速度,但是还是可以看到刷屏的动作。


上代码,求指点:

/******************************************************************************
 * FUNCTION: Img2LCD_Dis_By_Index ( )
 * DESCRIPTION: 从SPI FLASH中读取图片数据并显示出来
 *    Input the description of function: 
 * Input Parameters: 
 * Output Parameters: 
 * Returns Value: 
 * 
 * Author: FuDongQiang @ 2015/05/22
 * 
 * modification history
 *   ...
 ******************************************************************************/
void Img2LCD_Dis_By_Index(u16 x,u16 y,uint32_t StartIndex)
{
    const uint8_t *pColor;
    uint32_t Count = 0,NowIndex = StartIndex;
    uint16_t h,w,color,height,width;
    uint8_t TempBuff[GUI_MAX_PIC_BUFF_SIZE],TempBuff2[GUI_MAX_PIC_BUFF_SIZE],OffSize,NowBuffIndex = 0;
    ST_Img2LCD *pStImg2Lcd;

    NowBuffIndex = 0;
    SPI_FLASH_Data_Read_By_DMA(TempBuff,NowIndex,GUI_MAX_PIC_BUFF_SIZE);
    while(DMA_GetCurrDataCounter(SPI_RX_DMA_CH)!=0);                    //等待上一次通道传输完成
    NowIndex += GUI_MAX_PIC_BUFF_SIZE;
    SPI_FLASH_Data_Read_By_DMA(TempBuff2,NowIndex,GUI_MAX_PIC_BUFF_SIZE);
    while(DMA_GetCurrDataCounter(SPI_RX_DMA_CH)!=0);
    
    OffSize = sizeof(ST_Img2LCD);//得到ST_Img2LCD结构体的大小
    pStImg2Lcd = (ST_Img2LCD *)TempBuff;
    height = pStImg2Lcd->h - 1;
    width = pStImg2Lcd->w - 1;
    pColor = TempBuff+OffSize;
    Count += OffSize;

    if(height >= GUI_HEIGHT)
    {
        height = GUI_HEIGHT-1;
    }
    if(width >= GUI_WIDTH)
    {
        width = GUI_WIDTH-1;
    }
    
    GUI_WindowMax(x,y,x+width,y+height);
    GUI_WriteRAM_Prepare();
    for(h = 0; h <= height; h++)
    {
        for(w = 0; w <= width; w++)
        {
            //低位在前,高位在后
            color = *(pColor);
            color |= ((u16)*(pColor+1))<<8;            
            GUI_WriteRAM(color);
            pColor += 2;
            Count += 2;
            if(Count == GUI_MAX_PIC_BUFF_SIZE)
            {
                Count = 0;
                NowIndex += GUI_MAX_PIC_BUFF_SIZE;
                
                NowBuffIndex++;
                if(NowBuffIndex >= 2)
                {
                    NowBuffIndex = 0;
                }
                
                if(1 == NowBuffIndex)
                {
                    pColor = TempBuff2;
                    SPI_FLASH_Data_Read_By_DMA(TempBuff,NowIndex,GUI_MAX_PIC_BUFF_SIZE);
                }
                else
                {
                    pColor = TempBuff;
                    SPI_FLASH_Data_Read_By_DMA(TempBuff2,NowIndex,GUI_MAX_PIC_BUFF_SIZE);
                }
            }
        }
    }

    //注意,这里DMA传输时使用的是局部数组,函数返回时该数组无效,所以要先等待DMA操作结束,否则就会有内存错误
    while(DMA_GetCurrDataCounter(SPI_RX_DMA_CH)!=0);                    //等待上一次通道传输完成
}


你可能感兴趣的:(STM32使用SPI DMA加双缓冲区的方式加速LCD显示BMP图片时刷屏速度)