|
|
找到了 RT-Thread GUI 的信息,先转贴知乎上 2018 年的文章:
https://zhuanlan.zhihu.com/p/45431187
RT-Thread 三探——LCD 驱动移植(使用GUI Engine)
继网络之后又一个比较重要的功能--GUI
对于 RT-Thread 使用的 GUI 我还没有什么概念,本文只是针对 LCD 驱动部分的移植,并使用 GUI 运行本身提供的 demo 样例。
当然还是和 ETH 一样,在 STM32F4xx-HAL 的 BSP 中是没有 LCD 的驱动文件的,还是从 STM32F429 BSP 中复制过来,在此基础上移植就好啦。
移植步骤:
在此可以稍微介绍下 RTT 基本的结构,RTT 这个系统主要由下面几个部分组成:
1、最重要的实时内核
2、shell
3、一些常用库(Lwip,文件系统,AT Command)
4、一些中间层(如设备抽象,SAL)
5、一些不那么常用的软件库(各种软件package,如图像识别,GUI,iot支持,数据库等)
这次要使用的 GUI 就在 package 的 system packages 中。
关于 RTT 整个系统的理解,我也会在领会了之后在文章中慢慢写出来供大家探讨。那么先,回到移植上来:
1、首先在 env 中使用 menuconfig,开启 GUI Engine。



然后保存退出,别忘了在 env 中使用 pkgs --update 更新软件包,然后重新生成 mdk5 的工程。
接下来就是在 STM32F429 的 BSP 中找到 drv_lcd.c .h 文件,复制到 STM32F4xx-HAL,Driver 文件夹中,并添加到 mdk 工程中,如下图:

该驱动主要需要根据不同的接线更改几个部分:
一、将 FMC 修改为 FSMC。因为 STM32F429 外设是 FMC,而 STM32F407 的外设是 FSMC,这个地方需要首先修改。

二、修改 FSMC 相关引脚,因为引脚复用关系,所以有可能使用的 FSMC 引脚与 STM32F429 使用的不相同,这个部分需要根据原理图修改。

三、修改 LCD RAM 的地址,以及 NAND Section 的选择。根据接线的不同,修改这些参数。


四、修改背光控制引脚。根据原理图,初始化背光控制引脚,并打开背光。

还有一点可能是一个小 BUG,在源文件中,使用宏
INIT_BOARD_EXPORT(rt_hw_lcd_init);
将初始化代码添加到自动初始化中,但是这种初始化会使得 lcd 在串口初始化之前就被初始化,初始化无论是否打开 DEBUG 宏,内部的调试都无法输出。解决这个问题可以使用如下宏
INIT_APP_EXPORT(rt_hw_lcd_init);
将初始化导入到 APP 之前的阶段,这样就可以输出调试信息了。
接下来导入一个 GUI 的 demo 程序。
- struct rtgui_win *main_win;
- rt_bool_t dc_event_handler(struct rtgui_object *object, rtgui_event_t *event);
- static void rt_gui_demo_entry(void *parameter)
- {
- struct rtgui_app *app;
- //struct rtgui_dc *dc;
-
- DEBUG_PRINTF("gui demo entry\n");
-
- /* create gui app */
- app = rtgui_app_create("gui_demo");
- if (app == RT_NULL)
- {
- DEBUG_PRINTF("rtgui_app_create faild\n");
- return;
- }
-
- /* create main window */
- main_win = rtgui_mainwin_create(RT_NULL, "UiWindow", RTGUI_WIN_STYLE_NO_TITLE | RTGUI_WIN_STYLE_NO_BORDER);
- if (main_win == RT_NULL)
- {
- DEBUG_PRINTF("main_win is null\n");
- rtgui_app_destroy(app);
- return;
- }
-
- rtgui_object_set_event_handler(RTGUI_OBJECT(main_win), dc_event_handler);
-
- DEBUG_PRINTF("rtgui_win_show\n");
- rtgui_win_show(main_win, RT_FALSE);
-
- DEBUG_PRINTF("rtgui_app_run\n");
- rtgui_app_run(app);
-
- DEBUG_PRINTF("rtgui_win_destroy\n");
- rtgui_win_destroy(main_win);
-
- DEBUG_PRINTF("rtgui_app_destroy\n");
- rtgui_app_destroy(app);
- }
- rt_bool_t dc_event_handler(struct rtgui_object *object, rtgui_event_t *event)
- {
- struct rtgui_widget *widget = RTGUI_WIDGET(object);
- if (event->type == RTGUI_EVENT_PAINT)
- {
- struct rtgui_dc *dc;
- rtgui_rect_t rect;
-
- rt_kprintf("\r\n RTGUI_EVENT_PAINT \r\n");
- rtgui_win_event_handler(RTGUI_OBJECT(widget), event);
-
- rtgui_widget_get_rect(widget, &rect);
- DEBUG_PRINTF("widget react x1: %d, y1: %d, x2: %d, y2: %d\r\n",
- rect.x1, rect.y1, rect.x2, rect.y2);
- dc = rtgui_dc_begin_drawing(widget);
- if(dc == RT_NULL)
- {
- DEBUG_PRINTF("\r\n dc is null \r\n");
- return RT_FALSE;
- }
- rtgui_dc_draw_line(dc,0,0,240,320);
- rtgui_dc_draw_line(dc,0,320,240,0);
- //rtgui_dc_draw_text(dc, __DATE__, &rect);
- rtgui_dc_draw_text_stroke(dc, __DATE__, &rect, HIGH_LIGHT, BLUE);
-
- rect.y1 += 20;
- rect.y2 += 20;
- rtgui_dc_draw_text_stroke(dc, __TIME__, &rect, HIGH_LIGHT, BLACK);
-
-
- rtgui_dc_end_drawing(dc, RT_TRUE);
- }
- return RT_FALSE;
- }
- int rt_gui_demo_init(void)
- {
- rt_thread_t tid;
- tid = rt_thread_create("mygui",
- rt_gui_demo_entry, RT_NULL,
- 2048, 25, 10);
- if (tid != RT_NULL)
- rt_thread_startup(tid);
-
- return 0;
- }
复制代码
移植工作到此也就基本结束了,接下来就没有最期待的 Shell 环节了(。。。)毕竟是移植 GUI,直接看屏幕也就 OK 啦,拍照留念。

编辑于 2018-09-27
|
|