OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13177|回复: 30

新手求教,关于用外部flash显示图片的问题。

[复制链接]

8

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-5-15
在线时间
8 小时
发表于 2014-7-31 18:02:26 | 显示全部楼层 |阅读模式
5金钱
各位大哥大姐高手们好,向大家请教几个问题。想用TFT显示图片,由于刷屏速度太慢,就把图片用Ima2Lcd转换成二进制数据再开窗显示图片。但是由于一张320*240的图片转换完后大概有153K的大小,想显示多张图片,CPU内部flash不够,想先把转换后的图片数据一张一张写入W25X16里,然后用STM32读出来再显示,请问这样可以吗?
但是我把例程里的代码改后下载到mini版里运行不了,一直都是黑屏,请各位大侠帮忙指教一下。

#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "lcd.h"
#include "image2lcd.h"
#include "spi.h"
#include "flash.h"

extern const u8 gImage_image1[];//图片数据(包含信息头),存储在image1.c里面.
#define SIZE 60008

int main(void)
{
    u8 datatemp[SIZE];
    u16 i=0;
    Stm32_Clock_Init(9);//系统时钟设置
    delay_init(72);  //延时初始化
    uart_init(72,9600); //串口1初始化  
    LED_Init();
    LCD_Init();
    SPI_Flash_Init();   //SPI FLASH 初始化 

    while(SPI_Flash_ReadID()!=FLASH_ID)//检测不到W25X16
   {   
       i=SPI_Flash_ReadID();
       printf("ID:%d",i);
       LCD_ShowString(60,130,"W25X16 Check Failed!");
       delay_ms(500);
       LCD_ShowString(60,130,"   Please Check!    ");
       delay_ms(500);
       LED0=!LED0;//DS0闪烁
    }
    LCD_ShowString(60,130,"W25X16 Ready!");
    delay_ms(1000);

    LCD_Fill(0,0,240,320,WHITE);
    LCD_ShowString(60,170,"Start Write W25X16....");
    SPI_Flash_Write((u8*)gImage_image1,1000,SIZE);//从1000字节处开始,写入SIZE长度的数据
    LCD_ShowString(60,170,"W25X16 Write Finished!");//提示传送完成
 
   delay_ms(1000);
   LCD_Fill(0,0,240,320,WHITE);
   LCD_ShowString(60,170,"Start Read W25X16.... ");
   SPI_Flash_Read(datatemp,1000,SIZE);//从1000地址处开始,读出SIZE个字节
   LCD_ShowString(60,170,"The Data Readed Succeeded!");//提示传送完成
   delay_ms(1000);

   image_display(0,0,(u8*)datatemp);//在指定地址显示图片
   while(1);
}

还有就是当我这样写下面这条语句的时候就出现错误,这是为什么?
#define SIZE sizeof(gImage_image1)

然后就是下面这条语句
u8 datatemp[SIZE];
当SIZE大于65536时,就会出现
main.c(39): warning:  #69-D: integer conversion resulted in truncation,整数转换导致截断
这是为什么呢?难道是定义数组时,里面的元素不能大于65536吗?

请各位热心人帮忙给我指点一下迷津,谢谢!

最佳答案

查看完整内容[请看2#楼]

(1)局部数组变量这么大会有问题的。。。最大不可能大于堆栈大小。。一般就几百。 (2) 你可以试试用全局变量。。大数组不要用局部变量。 (3)这种做法是可以的。。。你要去调试看问题出在哪里。。先弄一张小图片。。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2014-7-31 18:02:27 | 显示全部楼层
(1)局部数组变量这么大会有问题的。。。最大不可能大于堆栈大小。。一般就几百。
(2) 你可以试试用全局变量。。大数组不要用局部变量。
(3)这种做法是可以的。。。你要去调试看问题出在哪里。。先弄一张小图片。。。。
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复

使用道具 举报

8

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-5-15
在线时间
8 小时
 楼主| 发表于 2014-8-1 08:01:22 | 显示全部楼层
回复【2楼】Admin:
---------------------------------
堆栈大小是指什么的堆栈大小?嗯,我把数组定义为全局变量就好了,但是显示不了多大的图片,照理说mini板的cpu是RBt6的,内部ROM也有128K,至少也可以显示一半大小的图片吧,但是当SIZE稍微大一点,就会出现
..\OBJ\往内部flash写图片数据然后显示出来.axf: Error: L6406E: No space in execution regions with .ANY selector matching main.o(.bss).
..\OBJ\往内部flash写图片数据然后显示出来.axf: Error: L6407E: Sections of aggregate size 0x7530 bytes could not fit into .ANY selector(s).
请问我该怎么办?
哦,还有谢谢站长为我解答,一直很感谢正点原子的无私帮助,希望你们能越做越好!
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-8-1 08:21:19 | 显示全部楼层
完全不需要定义u8 datatemp[SIZE]这个全局变量,直接从单片机内部FLASH里读取gImage_image1[]写到SPI FLASH里
目前在玩STM32,BBB,RPi
回复

使用道具 举报

8

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-5-15
在线时间
8 小时
 楼主| 发表于 2014-8-1 08:31:48 | 显示全部楼层
回复【4楼】w0rmis20:
---------------------------------
单片机内部flash不够呢,只有128K,可一张320*240的图片就是153K
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-8-1 08:36:49 | 显示全部楼层
如果是做实验你只能用小一点图片。否则用SD卡和文件系统,然后JPEG解码输出到屏幕。
目前在玩STM32,BBB,RPi
回复

使用道具 举报

8

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-5-15
在线时间
8 小时
 楼主| 发表于 2014-8-1 08:48:55 | 显示全部楼层
回复【6楼】w0rmis20:
---------------------------------
用SD卡和文件系统再解码,图片的刷屏速度很慢的,所以就像先把转化好的图像数据存到外部flash里,需要的时候就再用cpu从外部flash里读出来。
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-8-1 09:00:28 | 显示全部楼层
回复【7楼】whut-showming:
---------------------------------
你可以参考USB试验,把SPI FLASH 模拟成U盘(需要FatFS),然后再电脑上直接把转换好的图片复制进去。。
目前在玩STM32,BBB,RPi
回复

使用道具 举报

8

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-5-15
在线时间
8 小时
 楼主| 发表于 2014-8-1 09:23:33 | 显示全部楼层
回复【8楼】w0rmis20:
-------------------
最后做的板子上没有SD卡。。。。大侠,请问把数据放到外部flash里行不行呢
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-8-1 10:15:53 | 显示全部楼层
回复【9楼】whut-showming:
---------------------------------
当然可以,只要你能比较方便的把数据烧到外部flash里就行了
目前在玩STM32,BBB,RPi
回复

使用道具 举报

8

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-5-15
在线时间
8 小时
 楼主| 发表于 2014-8-1 10:35:42 | 显示全部楼层
回复【10楼】w0rmis20:
---------------------------------
现在就是不知道怎样方便的把数据烧到外部flash里,烧倒是能烧,就是烧不进去大的数据。。
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-8-1 10:38:11 | 显示全部楼层
回复【11楼】whut-showming:
---------------------------------
烧不进去大的数据是什么意思?
目前在玩STM32,BBB,RPi
回复

使用道具 举报

8

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-5-15
在线时间
8 小时
 楼主| 发表于 2014-8-1 10:48:23 | 显示全部楼层
回复【12楼】w0rmis20:
---------------------------------
就是本来一张240*320的图片是153K,而mini版只有128K,通过CPU烧不进去很正常。可是我现在把它缩小,我去显示120*160的图片,才几十K,它也烧不进去,必须得把图片弄得更小,就比如80*120,才能烧进去。可是128KCPU的应该可以烧更大一点的数据,就比如120*160的图片,大神怎么破?
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-8-1 10:58:45 | 显示全部楼层
不是和你说了吗,不要要定义u8 datatemp[SIZE]这个全局变量,这么大的数组是放到RAM里,不是FLASH里的。。。所以肯定不行啊,STM32也就20K内存
目前在玩STM32,BBB,RPi
回复

使用道具 举报

8

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-5-15
在线时间
8 小时
 楼主| 发表于 2014-8-1 11:08:10 | 显示全部楼层
回复【14楼】w0rmis20:
---------------------------------
啊,,,,大哥,我比较菜,再请教一下。怎样才能将这么大的数组放到Flash里呢?将u8 datatemp[SIZE]定义为局部变量吗?但是我把它放到main函数里后,就运行不了,一直黑屏,怎么破。。。?
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-8-1 11:09:55 | 显示全部楼层
你已经定义好了const u8 gImage_image1[] 在程序里从 gImage_image1把数据读出直接写道SPI FLASH就好了,你弄个临时变量啥意思?
目前在玩STM32,BBB,RPi
回复

使用道具 举报

8

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-5-15
在线时间
8 小时
 楼主| 发表于 2014-8-1 11:31:55 | 显示全部楼层
回复【16楼】w0rmis20:
---------------------------------
因为最后还要读出来然后再显示出来。。。
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-8-1 11:36:21 | 显示全部楼层
回复【17楼】whut-showming:
---------------------------------
。。。。
那就更不需要了,你现在内置FALSH和SPI FLASH里都有数据了。你随便选择哪个读出来显示啊
目前在玩STM32,BBB,RPi
回复

使用道具 举报

15

主题

114

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-7-1
在线时间
28 小时
发表于 2014-11-5 23:53:25 | 显示全部楼层
回复【18楼】w0rmis20:
---------------------------------
大哥,我是把图片数据放到外部flash中,但是读出来的时候很慢,能不能帮我看下呢?

http://www.openedv.com/posts/list/41613.htm
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-8-5
在线时间
0 小时
发表于 2014-12-27 01:39:05 | 显示全部楼层
我也遇到了这个问题,怎么解决啊?没有SD卡啊
回复

使用道具 举报

48

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
380
金钱
380
注册时间
2013-6-27
在线时间
17 小时
发表于 2015-1-20 14:42:25 | 显示全部楼层
回复【14楼】w0rmis20:
---------------------------------
大哥,问个问题,我在给NAND做文件系统时,用到了一个128K的数组,在RAM里肯定不够,内部Flash有512K,有什么办法可以把这个数组定义到Flash里去呢???
回复

使用道具 举报

70

主题

6769

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13240
金钱
13240
注册时间
2012-11-26
在线时间
3825 小时
发表于 2015-1-20 15:07:34 | 显示全部楼层
回复【21楼】can123dao:
---------------------------------
你到底是ram  还是flash  ?

flash的话  用const 标志   便存储在flash上了
学无止境
回复

使用道具 举报

48

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
380
金钱
380
注册时间
2013-6-27
在线时间
17 小时
发表于 2015-1-20 15:22:41 | 显示全部楼层
回复【22楼】jermy_z:
---------------------------------
定义一个二维数组备用,但数组u8 BackUpData[64][2048],这就不能放在RAM里了。但用const就不能对这个数组进行写了啊。
 问题来源是:
现在打算在外部的NAND Flash上做一个文件系统,在一个块(64*2K)中写几个页(2K)时,肯定先要擦除整个块,但块里不进行写操作的页的数据必须保存下来,所以就要在擦除前将这块里的数据保存进这个数组,最后在将不需要修改的数据写回原来的位置。
回复

使用道具 举报

70

主题

6769

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13240
金钱
13240
注册时间
2012-11-26
在线时间
3825 小时
发表于 2015-1-20 15:38:29 | 显示全部楼层
回复【23楼】can123dao:
---------------------------------
那估计是不能存在flash里了......加外部ram吧....
学无止境
回复

使用道具 举报

48

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
380
金钱
380
注册时间
2013-6-27
在线时间
17 小时
发表于 2015-1-20 16:19:34 | 显示全部楼层
回复【24楼】jermy_z:
---------------------------------
才也好好想了,打算用外部RAM,在KEIL里设置了外部RAM的起始地址和大小,这们只是编译链接能通过而已。
代码是一上电就从,flash加载到RAM的,外部RAM使用应该先初始化吧,所以这里还不知道怎么办。
只能再想想了
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2015-1-20 16:23:30 | 显示全部楼层
用const 的确不能直接对数组写。我建议你还不如直接把FLASH的从第多少页开始作为缓存区,用FLASH编程的方法。
目前在玩STM32,BBB,RPi
回复

使用道具 举报

70

主题

6769

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13240
金钱
13240
注册时间
2012-11-26
在线时间
3825 小时
发表于 2015-1-20 16:44:07 | 显示全部楼层
回复【25楼】can123dao:
---------------------------------
你可以定义数组的存放位置,可以存在内部与外部    看你怎么定义数组的了
学无止境
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2015-1-19
在线时间
0 小时
发表于 2015-1-20 18:05:27 | 显示全部楼层
(1)局部数组变量这么大会有问题的。。。最大不可能大于堆栈大小。。一般就几百。 
(2) 你可以试试用全局变量。。大数组不要用局部变量。 
(3)这种做法是可以的。。。你要去调试看问题出在哪里。。先弄一张小图片。。。。
回复

使用道具 举报

48

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
380
金钱
380
注册时间
2013-6-27
在线时间
17 小时
发表于 2015-1-21 09:12:07 | 显示全部楼层
回复【27楼】jermy_z:
---------------------------------
数组用一个static定义了,那样这个数组就只是在那个源文件里可见了,在编译后属于ZI,这部分是不能放在Flash里的,只能放到RAM,内部不够就只能入外部了。
关键就是外部RAM怎么用的问题。除了在KEIL里设置一些选项,让编译链接通过外,还必须在上电后第一时间初始化FSMC,这个初始化应该在哪儿做,system_stm32f10x.c里有SystemInit()其中有
    ......
#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)
  #ifdef DATA_IN_ExtSRAM
    SystemInit_ExtMemCtl(); 
  #endif /* DATA_IN_ExtSRAM */
#endif
    ...... 
可是在定义了DATA_IN_ExtSRAM后,调试也是一上电就进HardFault();
回复

使用道具 举报

70

主题

6769

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13240
金钱
13240
注册时间
2012-11-26
在线时间
3825 小时
发表于 2015-1-21 09:15:20 | 显示全部楼层
回复【29楼】can123dao:
---------------------------------
u32 testsram[250000]    __attribute__((at(0X68000000)));

不知道这样的写法满足不满足你 

后面的0X68000000  是外部sram基地址
学无止境
回复

使用道具 举报

48

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
380
金钱
380
注册时间
2013-6-27
在线时间
17 小时
发表于 2015-1-21 09:42:17 | 显示全部楼层
回复【30楼】jermy_z:
---------------------------------
现在我是在系统初始化的时候就初化了外部SRAM,然后在Keil 4里对定义数组的源文件做了设置,设置里面的ZI在外部RAM就可以用了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-10-15 10:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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