OpenEdv-开源电子网

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

原子哥,战舰开发板综合实验中两张背景图片及图标显示的两个地方求解

[复制链接]

1

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-7-1
在线时间
0 小时
发表于 2014-7-11 15:27:18 | 显示全部楼层 |阅读模式
5金钱
1:主任务中:spb_init(); 对两张背景图片和18个图标进行加载,具体调用的函数如下:

[mw_shl_code=c,true] SLCD.frame=0; //画第一张图片 ai_load_picfile(spb_bkpic_path_tbl[0],0,0,240,320,0); spb_load_icos(SLCD.frame); [/mw_shl_code]
这几句话操作的具体意义就是将背景图片和图标数据存入外部内存的数组中 LCD_GRAM_BUF[480][320],通过查找发现背景图片数据是通过下面函数写入外部SRAM中的
[mw_shl_code=c,true]u32 jpeg_out_func_point(JDEC* jd,void* rgbbuf,JRECT* rect) { …… pic_phy.draw_point(realx+picinfo.S_XOFF,realy+picinfo.S_YOFF,*pencolor); …… }[/mw_shl_code]
pic_phy结构体初始化如下,pic_phy.draw_point函数对应的函数为pic_phy.draw_point=LCD_Fast_DrawPoint;


[mw_shl_code=c,true]void piclib_init(void) { pic_phy.read_point=LCD_ReadPoint; pic_phy.draw_point=LCD_Fast_DrawPoint; pic_phy.fill=LCD_Fill; pic_phy.draw_hline=piclib_draw_hline; pic_phy.set_window=LCD_Set_Window; pic_phy.fill_prepare=LCD_WriteRAM_Prepare; pic_phy.fill_point=LCD_WriteRAM; …… }[/mw_shl_code]
但是:
运行程序时pic_phy.draw_point函数执行的是sramlcd.c文件的如下函数,该函数是将图片数据写入外部SRAM中
[mw_shl_code=c,true]void slcd_draw_point(u16 x,u16 y,u16 color) { LCD_GRAM_BUF[x+240*SLCD.frame][y]=color; }[/mw_shl_code]
不理解是为什么了?


2.通过DMA将图片数据从外部内存显示到LCD上时调用DMA情况如下:
[mw_shl_code=c,true]u16 LCD_CUR_LINE; u32 DMA2_MEM_LEN=320*240/2;//保存DMA每次数据传送的长度 半屏幕 void LCD_DMA_Config(void) { …… DMA_InitStructure.DMA_BufferSize = DMA2_MEM_LEN; //DMA通道的DMA缓存的大小 …… } void LCD_DMA_Enable(u16 x){}[/mw_shl_code]
不理解的地方在:一张320*240图片数据大小为320*240*2(因为color为2个字节),定义DMA2_MEM_LEN=320*240/2,数据量岂不是是全屏幕数据的1/4吗?而不是一半



[mw_shl_code=c,true]
[mw_shl_code=c,true]
[mw_shl_code=c,true][/mw_shl_code]
[/mw_shl_code]
[/mw_shl_code]

最佳答案

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

[mw_shl_code=c,true]//初始化spb各个参数 void spb_init(void) { u16 i,j; spbdev.oldxpos=0; spbdev.curxpos=0; spbdev.curypos=0; spbdev.spbsta=0; spbdev.selico=0xff; for(i=0;i<3;i++) { for(j=0;j<3;j++) { spbdev.icos[0].x=5+j* 80; spbdev.icos[0].y=10+i*105; spbdev.icos[0].width=70; spbdev.icos[0].height=90; sp ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-11 15:27:19 | 显示全部楼层
[mw_shl_code=c,true]//初始化spb各个参数 void spb_init(void) { u16 i,j; spbdev.oldxpos=0; spbdev.curxpos=0; spbdev.curypos=0; spbdev.spbsta=0; spbdev.selico=0xff; for(i=0;i<3;i++) { for(j=0;j<3;j++) { spbdev.icos[0][i*3+j].x=5+j* 80; spbdev.icos[0][i*3+j].y=10+i*105; spbdev.icos[0][i*3+j].width=70; spbdev.icos[0][i*3+j].height=90; spbdev.icos[0][i*3+j].path=(u8*)spb_icos_path_tbl[0][i*3+j]; spbdev.icos[0][i*3+j].name=(u8*)icos_name_tbl[gui_phy.language][0][i*3+j]; spbdev.icos[1][i*3+j].x=5+j*80; spbdev.icos[1][i*3+j].y=10+i*105; spbdev.icos[1][i*3+j].width=70; spbdev.icos[1][i*3+j].height=90; spbdev.icos[1][i*3+j].path=(u8*)spb_icos_path_tbl[1][i*3+j]; spbdev.icos[1][i*3+j].name=(u8*)icos_name_tbl[gui_phy.language][1][i*3+j]; } } //配置sram->lcd的dma设置 LCD_DMA_Coinfig(); //指向sramlcd gui_phy.read_point=slcd_read_point; gui_phy.draw_point=slcd_draw_point; pic_phy.read_point=slcd_read_point; pic_phy.draw_point=slcd_draw_point; SLCD.frame=0; ai_load_picfile(spb_bkpic_path_tbl[0],0,0,240,320,0);//画第一张图片 spb_load_icos(SLCD.frame); SLCD.frame=1; //帧计数器增加 ai_load_picfile(spb_bkpic_path_tbl[1],0,0,240,320,0);//画第二张图片 spb_load_icos(SLCD.frame); //指向lcd gui_phy.read_point=LCD_ReadPoint; gui_phy.draw_point=LCD_Fast_DrawPoint; gui_phy.lcdwidth=lcddev.width; gui_phy.lcdheight=lcddev.height; pic_phy.read_point=LCD_ReadPoint; pic_phy.draw_point=LCD_Fast_DrawPoint; SLCD.pos=0; //设置当前显示的位置 SLCD.frame=0; SLCD.show(SLCD.pos);//显示主界面 }[/mw_shl_code]
答案见第34,35行代码
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-11 15:27:19 | 显示全部楼层
1次DMA是1/4么?
是1/2!!!
因为传输位宽是16位的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-11 22:55:38 | 显示全部楼层
第二个问题,因为DMA一次最多传输65536个数据,一个320*240的图片,比这个值大,所以干脆设置传输1/2屏,传2次.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-7-1
在线时间
0 小时
 楼主| 发表于 2014-7-12 10:55:15 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
谢谢原子哥,第一个问题自己居然大意把那四句话忘记了,呵呵
第二个问题是这样的,一张图片有320*240*2这么多的数据,而DMA传输一次只传输320*240/2,所以一次DMA传输只传输了1/4的数据,是不是应该传4次才可以把整个图片传输完成呢?
回复

使用道具 举报

1

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-7-1
在线时间
0 小时
 楼主| 发表于 2014-7-13 10:47:55 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
明白了,传输位数是16位的!每次传输320*240/2个16位的数据,刚好是半屏!谢谢原子哥耐心解答
回复

使用道具 举报

2

主题

29

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5345
金钱
5345
注册时间
2013-11-10
在线时间
639 小时
发表于 2014-12-11 16:18:10 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
ai_load_picfile(spb_bkpic_path_tbl[0],0,0,240,320,0);//画第一张图片
spb_load_icos(SLCD.frame);
  SLCD.frame=1; //帧计数器增加
ai_load_picfile(spb_bkpic_path_tbl[1],0,0,240,320,0);//画第二张图片
为什么屏幕上不显示这两张图片
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-11 23:23:40 | 显示全部楼层
回复【7楼】校草02:
---------------------------------
回复【7楼】校草02:
---------------------------------
位这个时候LCD画图打点函数定向到SRAM里面了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

29

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5345
金钱
5345
注册时间
2013-11-10
在线时间
639 小时
发表于 2014-12-13 15:40:13 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
那已经将点写到SRAM里面了,那用DMA有什么用??
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-14 11:29:19 | 显示全部楼层
回复【9楼】校草02:
---------------------------------
DMA将SRAM数据搬运到LCD.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

29

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5345
金钱
5345
注册时间
2013-11-10
在线时间
639 小时
发表于 2014-12-17 14:39:47 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
1、弱弱的问一句,通过SRAM显示还不够快吗?还要用DMA?
2、那为什么不直接LCD画图打点函数定向到stm32内部SRAM里面呢?这样显示快,而且不需要DMA(不需要吗?个人猜测).
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-17 22:58:07 | 显示全部楼层
回复【11楼】校草02:
---------------------------------
1,你可以对比下。别光顾着问,学会自己动手。
2,内部sram有多少?一个320*240的图片,有多大?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
发表于 2015-10-31 10:41:15 | 显示全部楼层
[mw_shl_code=c,true]好帖。。。。[/mw_shl_code]
Good good study , day day up...
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 11:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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