硬汉嵌入式论坛

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

[ThreadX全家桶] stm32g0 这样的片子用dbi 16bit ili9341不加内存可以跑 guix不?

  [复制链接]

15

主题

87

回帖

132

积分

初级会员

积分
132
发表于 2021-5-27 14:47:25 | 显示全部楼层 |阅读模式
看guix的资料是说可以不用画布,直接使用 ili9341这类驱动的内部 gram 的,有些小屏,价格也便宜,480*320 用 8080模式就可以驱动
有些小产品手持式的,用小芯片做些功能也还是不错了,有这方面的现实需求
  像 陶晶驰的串口屏 才用一个 stm32f030, 64kb rom ,加一个 25q128,跑图形也很快,f030这类芯片,又不支持  xip 跑在 spi flash上,这么
点rom它还能跑图形这么溜。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107044
QQ
发表于 2021-5-27 15:30:44 | 显示全部楼层
可以,需要使用直接驱动方式,之前研究过一次没有搞出来,后面就没有再研究了。

这些小屏,资源少的场合,使用坛友做的这个也非常不错
开源免费商用的玲珑GUI
http://www.armbbs.cn/forum.php?mod=viewthread&tid=103511


回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2021-5-27 16:53:09 | 显示全部楼层
ST的touchGFX支持G071这个芯片,效果很好,你可以去试试。
回复

使用道具 举报

15

主题

87

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2021-5-27 17:03:01 | 显示全部楼层
我有空点试一下,看能不能搞出来
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107044
QQ
发表于 2021-5-27 17:10:11 | 显示全部楼层
fly7185 发表于 2021-5-27 16:53
ST的touchGFX支持G071这个芯片,效果很好,你可以去试试。

看过那个视频展示,效果很帅。

回复

使用道具 举报

15

主题

87

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2021-5-28 09:25:28 | 显示全部楼层
我感觉思路应该是这样的,定义一个映射地址,这个地址是画布的首地址,也是gram的首地址,如果是 fmc 的话,芯片会自动读写这个地址,如果没有 fmc 如 g0之类的芯片,这个地址由用户实现读写,guix是先在画布上更新,更新完了再把画布上的内容搬到显存中,而这种方式则直接是画布就是gram 地址,画布更新函数为空函数就可以了
回复

使用道具 举报

15

主题

87

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2021-5-31 15:53:57 | 显示全部楼层
研究了一下代码,发现这种方式可以实现,但很麻烦,
有些函数要自己实现,
display -> gx_display_driver_pixel_write                   = _gx_display_driver_16bpp_pixel_write;
这个是写点函数,这个实现起来倒是不难,但有一堆基础函数是基于内存的
没有画布是完不成了,
VOID _gx_display_driver_16bpp_simple_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT ystart, INT xend, INT yend)

//这个是直接操作内存,如果没有画布内存,要自己实现,要哭死,
put = (USHORT *)(context -> gx_draw_context_memory) + ystart * context -> gx_draw_context_pitch + xstart;
    next_put = (USHORT *)(context -> gx_draw_context_memory) + yend * context -> gx_draw_context_pitch + xend;

/**************************************************************************/
VOID _gx_display_driver_565rgb_pixel_blend(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR fcolor, GX_UBYTE alpha)
{
GX_UBYTE fred, fgreen, fblue;
GX_UBYTE bred, bgreen, bblue;
GX_UBYTE balpha;

USHORT   bcolor;
USHORT  *put;


    /* Is the pixel non-transparent? */
    if (alpha > 0)
    {
        /* calculate address of pixel */
        put = (USHORT *)context -> gx_draw_context_memory;
        put += context -> gx_draw_context_pitch * y;

这些都是基于画布内存的,没有画布内存,实现这一堆画线,画圆函数


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107044
QQ
发表于 2021-6-1 09:21:10 | 显示全部楼层
yuntian 发表于 2021-5-31 15:53
研究了一下代码,发现这种方式可以实现,但很麻烦,
有些函数要自己实现,
display -> gx_display_driver ...

对,直接驱动得脱离画布。
回复

使用道具 举报

11

主题

122

回帖

160

积分

初级会员

积分
160
发表于 2021-6-1 13:53:35 | 显示全部楼层
eric2013 发表于 2021-6-1 09:21
对,直接驱动得脱离画布。

可以发现在16bpp的display_driver文件里是有类型的宏定义的,但是都是局部定义,默认还是使用缓存读写。我是在config配置文件里定义了两个宏,GET_PIXEL(addr),PUT_PIXEL(addr,color),所有底层的put,get操作都用宏代替,针对有外部gram的直接替代为具体的读写函数,这样就可以直驱了。晚上发上来,有兴趣的可以测试下。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107044
QQ
发表于 2021-6-1 16:02:36 | 显示全部楼层
有梦为马 发表于 2021-6-1 13:53
可以发现在16bpp的display_driver文件里是有类型的宏定义的,但是都是局部定义,默认还是使用缓存读写。 ...

回复

使用道具 举报

15

主题

87

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2021-6-1 21:18:55 | 显示全部楼层
有梦为马 发表于 2021-6-1 13:53
可以发现在16bpp的display_driver文件里是有类型的宏定义的,但是都是局部定义,默认还是使用缓存读写。 ...

是值得研究一下,要不然不挂 ram 就玩不成了
回复

使用道具 举报

11

主题

122

回帖

160

积分

初级会员

积分
160
发表于 2021-6-1 23:13:42 | 显示全部楼层
我在gx_port.h里添加了宏定义:
#define USE_CORLOR_2BPP

#if (defined USE_CORLOR_1BPP)
#define GX_PIXEL_WRITE(loc, val) (*(loc) = ((UCHAR)val))
#define GX_PIXEL_READ(loc) (*(UCHAR *)(loc))
#define GX_COLOR_BYTES        1
#elif        (defined USE_CORLOR_2BPP)
#define GX_PIXEL_WRITE(loc, val) (*(loc) = ((USHORT)val))
#define GX_PIXEL_READ(loc) (*(USHORT *)(loc))
#define GX_COLOR_BYTES        2
#elif        (defined USE_CORLOR_4BPP)
#define GX_PIXEL_WRITE(loc, val) (*(loc) = ((UINT)val))
#define GX_PIXEL_READ(loc) (*(UINT *)(loc))
#define GX_COLOR_BYTES        4
#else
#define GX_PIXEL_WRITE(loc, val) (*(loc) = (val))
#define GX_PIXEL_READ(loc) (*(loc))
#define GX_COLOR_BYTES        4
#endif

例如在gx_display_driver_565rgb_pixel_blend.c里
put的操作都替换成了
//*put = (USHORT)ASSEMBLECOLOR(fred, fgreen, fblue);
GX_PIXEL_WRITE(put,ASSEMBLECOLOR(fred, fgreen, fblue));
附件的driver绘制函数里都做了替换,未全部测试。

guix_display_driver.7z

82.36 KB, 下载次数: 7

回复

使用道具 举报

15

主题

87

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2021-6-2 07:14:50 | 显示全部楼层
所有的基础画图工具都要换,画点,画线,画圆
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
发表于 2021-6-2 10:11:54 | 显示全部楼层
有梦为马 发表于 2021-6-1 23:13
我在gx_port.h里添加了宏定义:
#define USE_CORLOR_2BPP

   
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107044
QQ
发表于 2021-6-2 10:59:45 | 显示全部楼层
有梦为马 发表于 2021-6-1 23:13
我在gx_port.h里添加了宏定义:
#define USE_CORLOR_2BPP

感谢,
回复

使用道具 举报

0

主题

48

回帖

48

积分

新手上路

积分
48
发表于 2021-6-3 08:51:03 | 显示全部楼层
[url=]可以参考一下这个驱动,没有使用画布,通过直接读写LCD的GRAM实现的:[/url]
[url=]stm324xg_screen.h[/url][url=]stm324xg_screen_direct_16bpp.c[/url]

stm324xg_screen.h

1.5 KB, 下载次数: 17

stm324xg_screen_direct_16bpp.c

7.78 KB, 下载次数: 22

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107044
QQ
发表于 2021-6-3 09:14:40 | 显示全部楼层
Ting 发表于 2021-6-3 08:51
可以参考一下这个驱动,没有使用画布,通过直接读写LCD的GRAM实现的:
stm324xg_screen.hstm324xg_screen_ ...

太给力了,
回复

使用道具 举报

15

主题

87

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2021-6-3 13:34:00 | 显示全部楼层
Ting 发表于 2021-6-3 08:51
可以参考一下这个驱动,没有使用画布,通过直接读写LCD的GRAM实现的:
stm324xg_screen.hstm324xg_screen_ ...

太给力了,晚点试下
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107044
QQ
发表于 2021-6-3 21:05:04 | 显示全部楼层
Ting 发表于 2021-6-3 08:51
可以参考一下这个驱动,没有使用画布,通过直接读写LCD的GRAM实现的:
stm324xg_screen.hstm324xg_screen_ ...

测试了一下,这里有个关键问题,这种方式还支持GUIX Studio生成的代码吗,测试了下不能用。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107044
QQ
发表于 2021-6-3 21:10:24 | 显示全部楼层
Ting 发表于 2021-6-3 08:51
可以参考一下这个驱动,没有使用画布,通过直接读写LCD的GRAM实现的:
stm324xg_screen.hstm324xg_screen_ ...

可以了,操作部分控件,撕裂比较厉害,应该是需要再优化优化
回复

使用道具 举报

15

主题

87

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2021-6-3 23:05:51 | 显示全部楼层
我的主页都还没显示出来
        gx_system_initialize();
       
  gx_studio_display_configure(DISPLAY_1 ,m4_mono_lcd_driver ,LANGUAGE_CHINESE ,DISPLAY_1_THEME_1 ,&root);
  gx_studio_named_widget_create("win_main", (GX_WIDGET *)root, GX_NULL);
        //gx_studio_named_widget_create("window", (GX_WIDGET *)root, (GX_WIDGET **)&screen);
       
        gx_widget_show(root);
       
        gx_system_start();
       
        while(1)
        {
                tx_thread_sleep(100);
                update_display();
        }
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107044
QQ
发表于 2021-6-4 07:32:58 | 显示全部楼层
yuntian 发表于 2021-6-3 23:05
我的主页都还没显示出来
        gx_system_initialize();
       

我的成功了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107044
QQ
发表于 2021-6-4 07:35:30 | 显示全部楼层
Ting 发表于 2021-6-3 08:51
可以参考一下这个驱动,没有使用画布,通过直接读写LCD的GRAM实现的:
stm324xg_screen.hstm324xg_screen_ ...

发的这个参考驱动还有不完善的地方,那个toggle函数没有优化

这个函数在防止撕裂问题上非常关键,看看还有什么折中的解决办法没。
回复

使用道具 举报

5

主题

519

回帖

534

积分

金牌会员

积分
534
发表于 2021-7-25 21:52:46 | 显示全部楼层
yuntian 发表于 2021-6-3 23:05
我的主页都还没显示出来
        gx_system_initialize();
       

G0使用GUIX成功了吗?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 10:20 , Processed in 0.244410 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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