硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5812|回复: 3
收起左侧

[有问必答] 使用sd卡显示图片遇到的问题

[复制链接]

32

主题

97

回帖

193

积分

初级会员

积分
193
发表于 2016-2-10 08:31:13 | 显示全部楼层 |阅读模式
FRESULT result;
UINT bw;

/* 实际的测试需要是图像宽度的4倍即可,切记(也就是保证每个像素如果是32位数据的情况) */
static char _acBuffer[480*4];


static int _GetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off)
{
    U32 i;
    static int FileAddress = 0;
    UINT NumBytesRead = 0;
    FIL *PicFile;
    PicFile = (FIL *)p;

    /*    * 检测缓存大小    */
    if (NumBytesReq > sizeof(_acBuffer)) {
    NumBytesReq = sizeof(_acBuffer);
    }

    /*    * 设置读取位置    */
    if(Off == 1)
            FileAddress = 0;
    else
            FileAddress = Off;
    result =f_lseek(PicFile, FileAddress);
   
    /*    * 读取数据到缓存, 由于FatFS+官方SD卡的方案存在DMA传输上的4字节对齐问题,这里以小于等于一个
    * SD卡扇区大小来操作,超过512字节会出错。    */
    for(i = 0; i < NumBytesReq / 512; i++)
    {
        result = f_read(PicFile, &_acBuffer[512*i], 512, &bw);
        NumBytesRead += bw;
    }
   
    result = f_read(PicFile, &_acBuffer[512*i], NumBytesReq % 512, &bw);
    NumBytesRead += bw;

    /*    * 让指针ppData指向读取的函数    */
    *ppData = (const U8 *)&_acBuffer[0];

    /*    * 返回读取的字节数    */
    return NumBytesRead;
}



void ShowBmpFun(void)
{
       uint8_t *uwInternelBuffer;
    uint8_t XSize=0,YSize=0;
    uint32_t bytesread = 0;                     /* File write/read counts */
    FATFS SDFatFs;                              /* File system object for SD card logical drive */
        FIL MyFile;                                        /* File object */
        char SDPath[40] = {"0"};                   /* SD card logical drive path */
       uwInternelBuffer = (uint8_t *)0xC0300000;    //1024x768x4
       char SDPath_Name[] = "image04.bmp";
       uint32_t uwBmplen = 0;

           /*##-1- Link the micro SD disk I/O driver ##################################*/
                   if(FATFS_LinkDriver(&SD_Driver, SDPath) == 0)
                   {
                /*##-2- Register the file system object to the FatFs module ##############*/
            if(f_mount(&SDFatFs, (TCHAR const*)SDPath, 0) != FR_OK)
            {
                /* FatFs Initialization Error */
                Error_Handler();
            }
            else
            {
                if(f_open(&MyFile, "image04.bmp", FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS) != FR_OK)  //图片打开后
                {
                    /* 'STM32.TXT' file Open for read Error */
                    Error_Handler();
                }
                else
                {
                    /*##-8- Read data from the text file ###########################*/
                       //res = f_read(&MyFile, rtext, sizeof(rtext), (UINT*)&bytesread);
                        
                      /* Open a file and copy its content to an internal buffer */
                     GUI_Delay(20);       //加延时效果不大
                     GUI_Delay(120);

                      XSize = GUI_BMP_GetXSizeEx(_GetData, &MyFile);
                      YSize = GUI_BMP_GetYSizeEx(_GetData, &MyFile);
                    //GUI_Delay(20);

                    GUI_BMP_DrawEx(_GetData, &MyFile, 100, 100);
                         f_close(&MyFile);
                    }   
                }
               }        
}


main()
{
          GUI_Delay(200);        
       GUI_Delay(200);   
       ShowBmpFun();
       GUI_Delay(10);
     GUI_Delay(20);   
     GUI_Delay(200);   
}

问题:image04.bmp为480X272,24位的bmp图片,但显示时,XSize=224,YSize =16,实际显示时也是只显示224X16那么大,我反复改_acBuffer[480*4]这个数组大小,无论改多大图像宽度的4倍,这个注意了),倒是480*4效果能好一些。其它的大小,倒达不到224X16,可能224X10
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117542
QQ
发表于 2016-2-14 11:20:01 | 显示全部楼层
不好意思啊,楼主,没有及时回复你,你的这个是用在STM32F1上面的吗
回复

使用道具 举报

32

主题

97

回帖

193

积分

初级会员

积分
193
 楼主| 发表于 2016-2-15 18:20:20 | 显示全部楼层
在 stm32f429上运行,经过几次调试,发现在 result =f_lseek(PicFile, FileAddress);后面加 GUI_Delay(1);        
在 result = f_read(PicFile, &_acBuffer[512*i], 512, &bw);后面加GUI_Delay(1);       能够正常显示,不知道是为什么
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117542
QQ
发表于 2016-2-15 19:39:14 | 显示全部楼层

回 beyondabcd 的帖子

beyondabcd:在 stm32f429上运行,经过几次调试,发现在 result =f_lseek(PicFile, FileAddress);后面加 GUI_Delay(1);        
在 result = f_read(PicFile, &_acBuffer[512*i], 512, &bw);后面加GUI_Delay(1);    &nbs .. (2016-02-15 18:20)
你上面帖子的程序应该是F1上的显示方式,参考V5板子F407上的显示方式即可,另外就是SDIO的DMA需要设置下,F4xx里面的DMA四字节对齐问题可以通过如下方法设置
SD_LowLevel_DMA_TxConfig函数
  SDDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  SDDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

SD_LowLevel_DMA_RxConfig函数
  SDDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  SDDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-13 20:17 , Processed in 0.041008 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表