野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11920|回复: 13

外部FLASH存储BMP图片数据显示问题

[复制链接]
发表于 2016-1-12 10:08:38 | 显示全部楼层 |阅读模式
我把SD卡里的BMP图片数据读出来,存放在外部的FLASH里,然后从外部FLASH里读出显示,显示不出来,用串口打印出数据是正确的喔,这是为什么呢?

void Lcd_show_bmp(unsigned short int x, unsigned short int y,unsigned char *pic_name)
{
        int i, j, k=0;
        int width, height, l_width;


        BYTE red,green,blue;
        BITMAPFILEHEADER bitHead;
        BITMAPINFOHEADER bitInfoHead;
        WORD fileType;


        unsigned int read_num;
        unsigned char tmp_name[20];
        //sprintf((char*)tmp_name,"0:%s",pic_name);

//        f_mount(0, &bmpfs[0]);
        //BMP_DEBUG_PRINTF("file mount ok \r\n");   
        //bmpres = f_open( &bmpfsrc , (char *)tmp_name, FA_OPEN_EXISTING | FA_READ);       
/*-------------------------------------------------------------------------------------------------------*/
        //if(bmpres == FR_OK)
        //{
                //BMP_DEBUG_PRINTF("Open file success\r\n");

                /* ¶áè¡Îļtí·DÅÏ¢  á½¸ö×Ö½ú*/         
                //f_read(&bmpfsrc,&fileType,sizeof(WORD),&read_num);     
                SPI_FLASH_BufferRead((u8*)&fileType, 0, sizeof(WORD));                /* ÅD¶ÏêÇ2»êÇbmpÎļt "BM"*/
                if(fileType != 0x4d42)
                {
                        BMP_DEBUG_PRINTF("file is not .bmp file!\r\n");
                        return;
                }
                else
                {
                        BMP_DEBUG_PRINTF("Ok this is .bmp file\r\n");       
                }        


        //        f_read(&bmpfsrc,&bitHead,sizeof(tagBITMAPFILEHEADER),&read_num);        
        //        showBmpHead(&bitHead);
        SPI_FLASH_BufferRead((u8*)&bitHead, sizeof(WORD), sizeof(tagBITMAPFILEHEADER));
        showBmpHead(&bitHead);

                //f_read(&bmpfsrc,&bitInfoHead,sizeof(BITMAPINFOHEADER),&read_num);        
        //        showBmpInforHead(&bitInfoHead);
                        SPI_FLASH_BufferRead((u8*)&bitInfoHead, sizeof(WORD)+sizeof(tagBITMAPFILEHEADER), sizeof(BITMAPINFOHEADER));
                        showBmpInforHead(&bitInfoHead);
        //}   
        //else
        //{
                //BMP_DEBUG_PRINTF("file open fail!\r\n");
        //        return;
        //}   
/*-------------------------------------------------------------------------------------------------------*/
        //SPI_FLASH_BufferRead((u8*)&bitInfoHead, sizeof(tagBITMAPFILEHEADER)+sizeof(WORD), sizeof(BITMAPINFOHEADER));

        width = bitInfoHead.biWidth;
        height = bitInfoHead.biHeight;


        l_width = WIDTHBYTES(width* bitInfoHead.biBitCount);       

        //if(l_width > 960)
        //{
                BMP_DEBUG_PRINTF("\n SORRY, PIC IS TOO BIG (<=320)%d\n",l_width);
                //return;
        //}
       


        Lcd_GramScan( 3 );
       


        LCD_OpenWindow(x, y, width, height);

       

        //if(bitInfoHead.biBitCount >= 24)
//        {
                for(i=0;i< height; i++)
                {         

//                        #if 0
//                                for(j=0; j< l_width; j++)                                                                                                                
//                                {               
//                                        f_read(&bmpfsrc,pColorData+j,1,&read_num);
//                                }            
//                        #elif 1               
                                SPI_FLASH_BufferRead(pColorData, (sizeof(WORD)+sizeof(tagBITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+l_width*i), l_width);       
                                        for(j=0;j<l_width;j++)
                                        printf("%c",pColorData[j]);
                //BMP_DEBUG_PRINTF("\n SORRY, PIC IS TOO BIG (<=320)%d\n",l_width);                       
                                //f_read(&bmpfsrc,pColorData,l_width/2,&read_num);
                                //f_read(&bmpfsrc,pColorData+l_width/2,l_width/2,&read_num);
//                        #else
//                                f_read(&bmpfsrc,pColorData,l_width,&read_num);
//                        #endif

                        for(j=0; j<width; j++)                                                                                            //ò&#187;DDóDD§D&#197;&#207;¢
                        {
                                k = j*3;                                                                                                                                         //ò&#187;DD&#214;DμúK&#184;&#246;&#207;&#241;&#203;&#216;μ&#196;&#198;eμ&#227;
                                red = pColorData[k+2];
                                green = pColorData[k+1];
                                blue =         pColorData[k];
                                LCD_WR_Data(RGB24TORGB16(red,green,blue)); //D′è&#235;LCD-GRAM
                        }            
                }                                                                                                                                                                                              
//        }   
        //else
        //{        
                //BMP_DEBUG_PRINTF("SORRY, THIS PIC IS NOT A 24BITS REAL COLOR");
        //        return ;
        //}
        //f_close(&bmpfsrc);   
}





2016-01-12 10 07 16.png
回复

使用道具 举报

 楼主| 发表于 2016-1-12 10:11:37 | 显示全部楼层
用SD卡读取直接显示没有问题,可以显示。
回复 支持 反对

使用道具 举报

发表于 2016-2-15 10:17:39 | 显示全部楼层
xiao华110 发表于 2016-1-12 10:11
用SD卡读取直接显示没有问题,可以显示。

请问楼主问题解决了吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-17 08:58:11 | 显示全部楼层
zsh910j 发表于 2016-2-15 10:17
请问楼主问题解决了吗?

解决了。。。。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2016-2-17 16:52:58 | 显示全部楼层
时什么问题啊 可以分享一下不
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-19 20:44:45 | 显示全部楼层
zsh910j 发表于 2016-2-17 16:52
时什么问题啊 可以分享一下不

我上面发的程序没有问题,只是在 LCD_OpenWindow(x, y, width, height)函数里面,没有发给显示屏0X2C命令,所以显示不出数据
回复 支持 反对

使用道具 举报

发表于 2016-2-20 08:34:56 | 显示全部楼层
xiao华110 发表于 2016-2-19 20:44
我上面发的程序没有问题,只是在 LCD_OpenWindow(x, y, width, height)函数里面,没有发给显示屏0X2C命令 ...

噢,了解了,谢谢啊!
回复 支持 反对

使用道具 举报

发表于 2016-3-10 13:23:47 | 显示全部楼层
楼主,请问你是怎么把SD卡里的bmp图片保存到外部FLASH中的,能给个代码吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-12 08:37:59 | 显示全部楼层
gubin6716 发表于 2016-3-10 13:23
楼主,请问你是怎么把SD卡里的bmp图片保存到外部FLASH中的,能给个代码吗

把BMP放到SD上,STM32用文件系统把SD上的BMP图片数据读出,再写到外部FLASH上。
回复 支持 反对

使用道具 举报

发表于 2016-3-15 13:06:03 | 显示全部楼层
本帖最后由 gubin6716 于 2016-3-15 14:15 编辑
xiao华110 发表于 2016-3-12 08:37
把BMP放到SD上,STM32用文件系统把SD上的BMP图片数据读出,再写到外部FLASH上。

帮我看看,这个下面这个鞋flash程序对不对,读BMP用你上面那段程序来读。还有下面“紫色”标出来的读数据,读出的内容还包括BMP的类型、文件头、位图信息头、颜色信息等数据信息吗



int Save_Picture_To_Flash(u32 WriteAddr, uint8_t * pic_name)
{
        int i, j, k;
        int width, height, l_width;

        BYTE red,green,blue;
        BITMAPFILEHEADER bitHead;
        BITMAPINFOHEADER bitInfoHead;
        WORD fileType;
        
        unsigned int read_num;
        unsigned char tmp_name[20];
        sprintf((char*)tmp_name,"0:%s",pic_name);

        
       //擦除FLASH  24k大小,从4096*64               
        for(i=0;i<6;i++){
                SPI_FLASH_SectorErase(WriteAddr+4096*i);        
        }
        printf("\r\n FLASH擦除成功! \r\n");
        
////////////////////////////////////////////////////////////////////////////////////
        f_mount(0, &bmpfs[0]);  
        bmpres = f_open( &bmpfsrc , (char *)tmp_name, FA_OPEN_EXISTING | FA_READ);        

        if(bmpres == FR_OK)
        {
                // 读头文件信息 2字节      
                f_read(&bmpfsrc,&fileType,sizeof(WORD),&read_num);     

                // 判断是不是BMP文件
                if(fileType != 0x4d42)
                {
                        BMP_DEBUG_PRINTF("file is not .bmp file!\r\n");
                        return 1;
                }
                else
                {
                        BMP_DEBUG_PRINTF("Ok this is .bmp file\r\n");        
                }        

                // 读bmp头文件信息
                f_read(&bmpfsrc,&bitHead,sizeof(tagBITMAPFILEHEADER),&read_num);        
                showBmpHead(&bitHead);

                // 读位图头文件信息
                f_read(&bmpfsrc,&bitInfoHead,sizeof(BITMAPINFOHEADER),&read_num);        
                showBmpInforHead(&bitInfoHead);
        }   
        else
        {
                BMP_DEBUG_PRINTF("file open fail!\r\n");
                return 1;
        }
//////////////////////////////////////////////////////////////////////

        
        width = bitInfoHead.biWidth;
        height = bitInfoHead.biHeight;

        // 计算位图的实际宽度      
        l_width = WIDTHBYTES(width* bitInfoHead.biBitCount);        

        if(l_width > 960)
        {
                BMP_DEBUG_PRINTF("\n SORRY, PIC IS TOO BIG (<=320)\n");
                return 1;
        }
////////////////////////////////////////////////////////////////////        
        if( bitInfoHead.biBitCount >= 24 )
        {
                for ( i = 0; i < height; i ++ )
                {
      f_lseek ( & bmpfsrc, bitHead .bfOffBits + ( height - i - 1 ) * l_width );        
                        
                        // 读取一行bmp数据到数组pColorData
                        bmpres=f_read ( & bmpfsrc, pColorData, l_width, & read_num );
                        printf("\r\n bmpres=%d \r\n",bmpres);
                        
                        if(bmpres==FR_OK){                                                        //将读出的数据写FLASH中,写入地址4096*64
                                SPI_FLASH_BufferWrite(pColorData, WriteAddr+i*l_width, l_width);
                        }else{
                                return 1;
                        }        
                }        
                return 0;
        }   
        
        else
        {        
                BMP_DEBUG_PRINTF("SORRY, THIS PIC IS NOT A 24BITS REAL COLOR");
                return 1;
        }
        
///////////////////////////////////////////////////////////////////////////////////////        
        f_close(&bmpfsrc);
}







回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-15 14:30:26 | 显示全部楼层
gubin6716 发表于 2016-3-15 13:06
帮我看看,这个下面这个鞋flash程序对不对,读BMP用你上面那段程序来读。还有下面“紫色”标出来的读数据 ...

                                                Sd_to_Flash(264*4096,264*4096,23,982,"/main1_bai.bmp");   //多少K,多少字节
                                                Sd_to_Flash((264+6*1)*4096,(264+6*1)*4096,23,982,"/main2_bai.bmp");   //多少K,多少字节               
                                                Sd_to_Flash((264+6*2)*4096,(264+6*2)*4096,23,982,"/main3_bai.bmp");   //多少K,多少字节               
                                                Sd_to_Flash((264+6*3)*4096,(264+6*3)*4096,23,982,"/main4_bai.bmp");   //多少K,多少字节       
                                                Sd_to_Flash((264+6*4)*4096,(264+6*4)*4096,23,982,"/main5_bai.bmp");   //多少K,多少字节               


void Sd_to_Flash(u32 Per_SectorAddr,u32 SectorAddr, uint16_t volume_k,uint16_t volume_b,unsigned char *file_name)
{
        uint8_t buffer[1024];               
        uint16_t i=0,j=0;
        uint16_t k4=0;
       
        k4 = volume_k / 4;
        //printf("\r\n please wait...\r\n");       
        //LCD_DispStr_1632WithoutMode(0,0,(uint8_t *)"please wait...",RED,BLACK);
       
        for(i=0;i < k4+2; i++)
        {
                SPI_FLASH_SectorErase(SectorAddr + 4096*i);               
        }
        if(volume_k > 0)
        {
                for(i=0; i < volume_k ; i++)
                {
                        GetGBKCode_from_sd(buffer,1024,SectorAddr-Per_SectorAddr, file_name);         /* 取字模数据 */               
//                        for(j=0;j<256;j++)
//                        printf("%c",buffer[j]);               
                        SPI_FLASH_BufferWrite(buffer, SectorAddr, 1024);
                                //SPI_FLASH_PageWrite(buffer, SectorAddr, 256);                       
                                SectorAddr +=1024;
                }                       
        }
        if(volume_b > 0)
        {
        GetGBKCode_from_sd(buffer,volume_b,SectorAddr-Per_SectorAddr, file_name);         /* 取字模数据 */                                       
        SPI_FLASH_BufferWrite(buffer, SectorAddr, volume_b);               
        }
        //        printf("\r\n OK!\r\n");       
        //LCD_DispStr_1632WithoutMode(0,0,(uint8_t *)"0k!",RED,BLACK);
       
       
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-15 14:32:00 | 显示全部楼层
xiao华110 发表于 2016-3-15 14:30
Sd_to_Flash(264*4096,264*4096,23,982,"/main1_bai.bmp");   //多少K,多少字节
                                                Sd_to_Fla ...

int GetGBKCode_from_sd(unsigned char* pBuffer, uint16_t byte_num, u32 SectorAddr, unsigned char *file_name)
{
//    unsigned char High8bit,Low8bit;
//    unsigned int pos;
//    High8bit=*c;     /* 取高8位数据 */
//    Low8bit=*(c+1);  /* 取低8位数据 */
       
//  printf("%d ,%d\r\n",High8bit,Low8bit);
//        printf("%x ,%x\r\n",High8bit,Low8bit);
       
    //pos = ((High8bit-0xb0)*94+Low8bit-0xa0-1)*2*16;
   // pos = ((High8bit-0xa0-16)*94+Low8bit-0xa0-1)*2*16;
                unsigned char tmp_name[20];
       
                sprintf((char*)tmp_name,"0:%s",file_name);       
       
    f_mount(0, &myfs[0]);
    //myres = f_open(&myfsrc , "0:/HZLIB.bin", FA_OPEN_EXISTING | FA_READ);
                myres = f_open(&myfsrc , (char *)tmp_name, FA_OPEN_EXISTING | FA_READ);   
    if ( myres == FR_OK )
    {
                       
        f_lseek (&myfsrc, SectorAddr);                //指针偏移
        myres = f_read( &myfsrc, pBuffer, byte_num, &mybr );                 //16*16大小的汉字 其字模 占用16*2个字节
        f_close(&myfsrc);  
        return 0;  
    }   
    else
        return -1;   
}
回复 支持 反对

使用道具 举报

发表于 2016-3-16 10:27:22 | 显示全部楼层
xiao华110 发表于 2016-3-15 14:32
int GetGBKCode_from_sd(unsigned char* pBuffer, uint16_t byte_num, u32 SectorAddr, unsigned char *f ...

谢谢楼主,按照你给的程序问题已经解决了
回复 支持 反对

使用道具 举报

发表于 2016-9-22 17:41:19 | 显示全部楼层
能把你整个工程的代码都发给我吗,我想自己学习,研究下。可以吗?我的邮箱245485039@qq.com
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-5 08:53 , Processed in 0.037543 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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