OpenEdv-开源电子网

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

想做一个bad apple,怎么读取bin文件

[复制链接]

41

主题

226

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
481
金钱
481
注册时间
2017-7-29
在线时间
233 小时
发表于 2017-9-19 16:38:55 | 显示全部楼层 |阅读模式
10金钱
想用手头的stm32f4和4.3寸的显示屏做一个bad apple,将图片转为bin文件后,还是不懂怎么将数据取出来显示到LCD上,有人做过显示一张图片的例程或者直接有bad apple的例程吗?

最佳答案

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

感觉不需要用W25QXX,直接用文件系统读bin文件可能还好一点,而且整个视频6000+的图片,库函数版本的的spi简介中有说W25Q128的擦写周期为10W次,但是要真这样搞,擦写周期感觉都显少了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

41

主题

226

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
481
金钱
481
注册时间
2017-7-29
在线时间
233 小时
 楼主| 发表于 2017-9-19 16:38:56 | 显示全部楼层
感觉不需要用W25QXX,直接用文件系统读bin文件可能还好一点,而且整个视频6000+的图片,库函数版本的的spi简介中有说W25Q128的擦写周期为10W次,但是要真这样搞,擦写周期感觉都显少了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-9-20 00:27:58 | 显示全部楼层
学会FATFS使用
回复

使用道具 举报

41

主题

226

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
481
金钱
481
注册时间
2017-7-29
在线时间
233 小时
 楼主| 发表于 2017-9-20 16:16:48 | 显示全部楼层
本帖最后由 142zjb 于 2017-9-20 16:19 编辑

原子哥,文件系统我已经学习了一段时间,运用的时候还是会遇到些问题,我现在想通过文件系统将bin文件的数据取出来,读到spi flash,几条关键的代码如下:

ftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL));
buf=mymalloc(SRAMIN,1024*50);                        
binbuf=mymalloc(SRAMIN,512);

f_open(ftemp,(TCHAR*)filename,FA_READ);                        
f_read(ftemp,buf,51200,&br);

W25QXX_Read(binbuf,(u32)buf,512);

我试着直接打印出取出的数据,

for(i=0;i < 512;i++)
{        
   printf("the data is %X\t",*(buf+i));
}这样的话是能正确读出bin文件的数据的,但是将*(buf+i),改成*(binbuf+i)
for(i=0;i < 512;i++)
{        
   printf("the data is %X\t",*(binbuf+i));
}
这样读出来的bin文件的数据是错误的,为什么呢?
回复

使用道具 举报

41

主题

226

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
481
金钱
481
注册时间
2017-7-29
在线时间
233 小时
 楼主| 发表于 2017-9-20 16:37:36 | 显示全部楼层

   刚3楼我好像有点理解错误了spi flash了,得先把buf写入spi flash的某个地址,才能从哪个地址读出来给到binbuf,申请内存和文件系统读取时直接按照那样申请和写入51200字节应该是可以的吧?
   因为图片是800*480,只需要在后面每次读480字节循环100次,每一次及时刷入LCD,是不是就能做到读取整个bin文件的图片?
  如果刷一秒30帧,最好用什么方法来刷图片可以比较快,需要用到DMA吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-9-21 01:59:49 | 显示全部楼层
142zjb 发表于 2017-9-20 16:37
刚3楼我好像有点理解错误了spi flash了,得先把buf写入spi flash的某个地址,才能从哪个地址读出来给 ...

你还是继续学学再去做这个项目吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

41

主题

226

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
481
金钱
481
注册时间
2017-7-29
在线时间
233 小时
 楼主| 发表于 2017-9-22 11:07:09 | 显示全部楼层
正点原子 发表于 2017-9-21 01:59
你还是继续学学再去做这个项目吧

那原子哥,先不管我做这个项目先,我遇到了一个地方是
for(count = 0;count < 100;count++)
{
  W25QXX_Write(buf,16*1024*1024-480,480);
  W25QXX_Read(binbuf,16*1024*1024-480,480);       
  for(i=0;i < 480;i++)
  {       
    printf("the data is %X\t",*(binbuf+i));
  }
  buf+=480;
}
buf是我定义的指针,里面存的数不止480个数据,我循环for100次,我这样操作得出的结果是只能打印前480个字节。
但是W25QXX_Write这个函数不是自带的擦除功能吗?
不应该每次都会更新buf和binbuf吗?问题出在哪里,还是我的理解有误
回复

使用道具 举报

41

主题

226

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
481
金钱
481
注册时间
2017-7-29
在线时间
233 小时
 楼主| 发表于 2017-9-22 11:11:35 | 显示全部楼层
W25QXX_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
这个函数的原理是将原来扇区的数据存到W25QXX_BUFFER,也就是存到了W25QXX_BUF指针中,然后通过更新要存的数据,最后再一次性的写入整个扇区,这个操作不存在说如果多次在相同地址写入数据时,会刷不走上一次数据吧?
下面这两行就是函数中关键性的更新数据语句吧
for(i=0;i<secremain;i++)       
{
   W25QXX_BUF[i+secoff]=pBuffer[i];          
}
回复

使用道具 举报

41

主题

226

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
481
金钱
481
注册时间
2017-7-29
在线时间
233 小时
 楼主| 发表于 2017-9-22 11:26:28 | 显示全部楼层
奇了怪了。。。
刚看了一个类似的帖子,说的是
W25QXX_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
这个函数还可以保留有原数据的功能,原来的数据存到了内部SRAM,我的binbuf是申请480字节的内部SRAM,我改成申请的960字节,在for循环里就能读取数据了,但是我又改回480字节,居然还是可以刷新数据,我六楼说的情况就不存在了。。我都没改过其他代码
可能是我之前看错了吧
回复

使用道具 举报

9

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2017-2-14
在线时间
90 小时
发表于 2017-9-22 16:11:59 | 显示全部楼层
你用的 LCD屏,就必须要对应去 取图像的模,你想完整的做完一个bad apple 不难,你首先把视频生成超过30fps的图片,然后一张张的把图像的模提取出来,然后添加在程序里面,当然这个要分成几步骤,内存是不够的,第一个程序是将所有的图像的模,写入W25QXX,然后再用另一个项目,去播放它。你把虽然把图片转化成了bin但是你不知道bin对应的LCD的屏宽高,所以只有一步一步提取图像模
回复

使用道具 举报

41

主题

226

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
481
金钱
481
注册时间
2017-7-29
在线时间
233 小时
 楼主| 发表于 2017-9-22 16:48:25 | 显示全部楼层
Polychromatic 发表于 2017-9-22 16:11
你用的 LCD屏,就必须要对应去 取图像的模,你想完整的做完一个bad apple 不难,你首先把视频生成超过30fps ...

我现在已经可以把一张bin的图片取出来了,但是刷新速度太慢了,接近11s才刷得一张
我用的思路也是先写入W25QXX,然后再读出来,因为我要显示的是800*480,我将一张bin图片,循环100次,每次读480的内容
有什么好的方法可以提高刷新的速度吗?
回复

使用道具 举报

9

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2017-2-14
在线时间
90 小时
发表于 2017-9-22 16:56:06 | 显示全部楼层
你用的什么LCD屏。
回复

使用道具 举报

41

主题

226

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
481
金钱
481
注册时间
2017-7-29
在线时间
233 小时
 楼主| 发表于 2017-9-22 16:56:31 | 显示全部楼层
我之前把48000字节当成了48000K
因为W25QXX中前12M被fatfs占用了,以为得分成100分去写和读,我试了一下直接写和读48000字节,刷新速度就很快了,我再研究研究
回复

使用道具 举报

41

主题

226

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
481
金钱
481
注册时间
2017-7-29
在线时间
233 小时
 楼主| 发表于 2017-9-22 16:57:29 | 显示全部楼层

4.3寸的TFT,之前搞错些基本概念,我再试试读多张图片
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-9-22 21:26:32 | 显示全部楼层
142zjb 发表于 2017-9-22 16:48
我现在已经可以把一张bin的图片取出来了,但是刷新速度太慢了,接近11s才刷得一张
我用的思路也是先写入 ...

刷320*240兴许有希望,刷800*480,就有点难搞l
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

41

主题

226

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
481
金钱
481
注册时间
2017-7-29
在线时间
233 小时
 楼主| 发表于 2017-9-22 22:18:52 | 显示全部楼层
Polychromatic 发表于 2017-9-22 16:11
你用的 LCD屏,就必须要对应去 取图像的模,你想完整的做完一个bad apple 不难,你首先把视频生成超过30fps ...

最好把所有的bin文件合成到一个bin文件吗?省去程序中操作打开下一个文件的繁琐
回复

使用道具 举报

41

主题

226

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
481
金钱
481
注册时间
2017-7-29
在线时间
233 小时
 楼主| 发表于 2017-9-23 10:51:26 | 显示全部楼层
正点原子 发表于 2017-9-22 21:26
刷320*240兴许有希望,刷800*480,就有点难搞l

帧数不够,一秒多一帧和理想中的1s30帧差距有点大。。。是因为W25QXX的读函数中用到的擦除扇区函数void W25QXX_Erase_Sector(u32 Dst_Addr)的原因吗?

void W25QXX_Erase_Sector(u32 Dst_Addr)
这个函数的备注有写“擦除一个扇区的最少时间:150ms”,我每次读写一帧的图片要接近48K,就相当于超过10个扇区,至少就是1.5s每次擦除,所以帧数都会不够,是这样理解吗
回复

使用道具 举报

41

主题

226

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
481
金钱
481
注册时间
2017-7-29
在线时间
233 小时
 楼主| 发表于 2017-9-24 15:24:41 | 显示全部楼层
正点原子 发表于 2017-9-22 21:26
刷320*240兴许有希望,刷800*480,就有点难搞l

DMA请求映射的都有相应的数据流通道,我想知道从文件系统取出数据存到buf,这个buf的数据直接存到LCD->RAM,这样能否使用DMA?有什么相应的数据流通道
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 15:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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