显示效果如上图,使用RTThread Studio 开发,触摸 和 framebuffer 使用的论坛里的 非常感谢
RTThread 和LVGL 直接使用的Studio直接初始化出来的
期间遇到各种问题 ,包括一直卡在触摸,原来是开发板Pd0和PD12 用于触摸而显示设置的666导致触摸I2C信号被破坏,改成565就好了
目前还有的问题就是 颜色跟实际设计的演示,电脑版lvgl 显示的不太一致
离线
RGB 中 R和B反色的问题找到了 因为开发板 RB交叉了 不知道为什么这样设计 需要在drv_fb 里设置tcon时序的时候将0x40 的第23位设置为1
离线
能否分享一下,RTThread Studio 的配置过程
离线
能否分享一下,RTThread Studio 的配置过程
按照上面的步骤 应该就可以创建一个新的工程了
接下来 添加LVGL
离线
接下来 说说我改的配置 rtconfig.h
添加
#define RT_DEBUG_INIT 1 //开启debug模式时:该宏定义为0时表示关闭打印组件初始化信息,定义为1时表示启用
#define RT_DEBUG_THREAD 0 //开启debug模式时:该宏定义为0时表示关闭打印线程切换信息,定义为1时表示启用
#define TINA_USING_LCD // 开启使用LCD 初始化fb
#define LV_MEM_DYNAMIC
#define LV_HOR_RES 1024 // 屏幕尺寸
#define LV_VER_RES 600 // 屏幕尺寸
#define LV_DPI 50
#define TINA_USING_UART1 // 因为我开发板用的串口1 而系统默认的串口0 所以我需要加
修改
#define RT_CONSOLE_DEVICE_NAME "uart1" // 因为我开发板用的串口1 而系统默认的串口0 所以我需要改
//#define TINA_USING_SPI1 // 这个是因为我的开发板 开了这个不能启动 但是调了好久 才发现要屏蔽他 其他开发板不知道要不要改
离线
[09:02:29.387]收
\ | /
- RT - Thread Operating System
/ | \ 4.1.0 build Apr 13 2023 04:35:43
2006 - 2022 Copyright by RT-Thread team
[33m[W/SFUD] [SFUD] Warning: The OS tick(100) is less than 1000. So the flash write will take more time.[0m
[32m[I/SFUD] Warning: Read SFDP parameter header information failed. The gd25qxx is not support JEDEC SFDP.[0m
[32m[I/SFUD] Warning: This flash device is not found or not support.[0m
[32m[I/SFUD] Error: gd25qxx flash device is initialize fail.[0m
[31m[E/SFUD] ERROR: SPI flash probe failed by SPI device spi00.[0m
periph_get_pll_clk:600000000
cpu_get_clk:408000000
ahb_get_clk:200000000
apb_get_clk:100000000
msh />(dev != RT_NULL) assertion failed at function:rt_dev
当编译烧录 后是这样的话 就证明成功了
离线
楼主能否详细讲解一下,如何在main.c里面添加一个LVGL自带的demo程序(或者最简单的GUI程序)吗?我只会单片机裸机开发,不懂RT系统。。。
我可以根据你讲解的demo例程,依葫芦画瓢的学习一下。
谢谢
最近编辑记录 sh200436 (2023-04-25 20:20:21)
离线
楼主能否详细讲解一下,如何在main.c里面添加一个LVGL自带的demo程序(或者最简单的GUI程序)吗?我只会单片机裸机开发,不懂RT系统。。。
我可以根据你讲解的demo例程,依葫芦画瓢的学习一下。
谢谢
想要跑一个完整的 LVGL显示出来 还是很多工作要做的 包括跟F1C200S的显示驱动配置,LVGL flush数据到显示缓冲区等 这些都完成后再main.c 或者自建文件都可以,例如我写的例子:
#include "rtthread.h"
#include "drv_clock.h"
#include <lvgl.h>
#include "drv_touch.h"
#include "lv_port_disp.h"
int main(int argc, char **argv)
{
rt_kprintf("periph_get_pll_clk:%d\n", periph_get_pll_clk());
rt_kprintf("cpu_get_clk:%d\n", cpu_get_clk());
rt_kprintf("ahb_get_clk:%d\n", ahb_get_clk());
rt_kprintf("apb_get_clk:%d\n", apb_get_clk());
return 0;
}
// lvgl 测试控件
void lv_border_style_test(){
static lv_style_t style;
lv_style_init(&style); // 初始化样式
lv_style_reset(&style); // 重置样式
lv_style_set_radius(&style, 10); // 设置样式圆角弧度
lv_style_set_bg_opa(&style, LV_OPA_COVER); // 设置样式背景的透明度,不透明
lv_style_set_bg_color(&style, lv_palette_lighten(LV_PALETTE_RED, 1)); // 设置样式的背景色为淡红色
lv_style_set_border_color(&style, lv_color_black()); // 设置样式边框颜色为黑色
lv_style_set_border_width(&style, 5); // 设置边框宽度
lv_style_set_border_opa(&style, LV_OPA_50); // 设置边框透明度
// 设置边框范围顶部、底部、右边、左边
lv_style_set_border_side(&style, LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_BOTTOM | LV_BORDER_SIDE_RIGHT | LV_BORDER_SIDE_LEFT);
lv_obj_t * obj = lv_obj_create(lv_scr_act()); // 基于屏幕创建对象
if (obj != NULL){
lv_obj_add_style(obj, &style, 0); // 给对象添加样式
lv_obj_set_size(obj, 200, 200);
lv_obj_center(obj); // 对象居中显示
}
}
//任务内容
static void lvgl_thread(void *parameter){
lv_init(); //LVGL 初始化
lv_port_disp_init(); //LVGL 显示初始化 需要去做配置
//lv_demo_widgets();
lv_border_style_test(); // 运行demo
rt_kprintf("\n ui_init \n");
while (1){
lv_task_handler(); //周期性调用事务处理器
rt_thread_mdelay(1);
}
}
// 初始化创建一个任务
static int lvgl_demo_init(void){
rt_thread_t tid;
tid = rt_thread_create("LVGL", lvgl_thread, RT_NULL, 4096,10, 10); //创建一个任务
if (tid == RT_NULL){
rt_kprintf("Fail to create 'LVGL' thread\n");
}
rt_thread_startup(tid);// 启动任务
return 0;
}
INIT_APP_EXPORT(lvgl_demo_init); //应用自动初始化 可以放在任意文件下 RTT 上电后会按顺序加载
编译烧录 串口打印一下内容就成功了 lvgl_demo_init 出现这个表示加载了demo ui_init 表示执行到了
[09:15:33.547]收←◆initialize rti_board_start:0 done
initialize rt_hw_spi_init:0 done
\ | /
- RT - Thread Operating System
/ | \ 4.1.0 build Apr 26 2023 08:59:55
2006 - 2022 Copyright by RT-Thread team
do components initialization.
initialize rti_board_end:0 done
initialize rt_mmcsd_core_init:0 done
initialize dfs_init:0 done
initialize rt_hw_spi_flash_with_sfud_init[33m[W/SFUD] [SFUD] Warning: The OS tick(100) is less than 1000. So the flash write will take more time.[0m
[32m[I/SFUD] Warning: Read SFDP parameter header information failed. The gd25qxx is not support JEDEC SFDP.[0m
[32m[I/SFUD] Warning: This flash device is not found or not support.[0m
[32m[I/SFUD] Error: gd25qxx flash device is initialize fail.[0m
[31m[E/SFUD] ERROR: SPI flash probe failed by SPI device spi00.[0m
:1 done
initialize rt_hw_lcd_init:0 done
initialize rt_hw_gpio_init:0 done
initialize elm_init:0 done
initialize lvgl_thread_init:0 done
initialize finsh_system_init:0 done
initialize tina_sdio_init:0 done
initialize lvgl_demo_init:0 done
periph_get_pll_clk:600000000
cpu_get_clk:408000000
ahb_get_clk:200000000
apb_get_clk:100000000
clk_divider_set_rate 29491216 198000000 0clk_divider_set_rate 2147024424 198000000 0
ui_init
[09:15:33.814]收←◆msh />
[09:15:34.157]收←◆[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 8 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 5 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 1 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 1 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 1 err[0m
显示效果
离线
谢谢楼主的指点!
今天把楼主的代码复制到main.c里,然后从LVGL网站下载并修改lvgl/examples/porting/lv_port_disp_template.c和.h文件,再添加到main.c同一个目录下,编译,然后出现了编译错误:
修改了半天也不知道是什么情况,就索性把该文件夹下的三个文件全部删除了。然后继续编译。。。。
终于,编译通过了!!哈哈哈!!!
编译的问题解决了,就相当于路子走通了,后面调试应该会容易许多。
等电路板做好后,准备下载一下试试。
非常感谢楼主的大力帮助,总算编译通过一个工程了。。。。
等后面点亮LCD屏幕后,再向楼主汇报,谢谢
离线
其实这个文件和main里做的是同一个事情,初始化lvgl 显示和触摸 user-gui 就是你自己的界面,因为你没这个函数 所以报错 ,删掉就行
离线
其实这个文件和main里做的是同一个事情,初始化lvgl 显示和触摸 user-gui 就是你自己的界面,因为你没这个函数 所以报错 ,删掉就行
我买了一块F1C100S的串口屏,拆掉了板子上的SPI-FLASH芯片,用TF-JTAG的转接板,把J-LINK下载器和板子连接起来。当下载程序时,出现了上面的错误信息。硬件接线和软件环境如下:
(1)J-LINK下载器使用TCK, TMS, TDI, TDO, VCC, GND,总计6根线和板子连接;
(2)拆掉了板子自带的SPI_FLASH芯片;
(3)电脑是Win7系统,RT-Studio整个编译软件,按照楼主的操作步骤,均采用最新的版本;
(4)RT-Studio调试配置里,下载地址为: 0x08000000
--根据错误信息,J-LINK下载器已经识别芯片了,就是不能下载,不知道问题出在了哪里。
请问楼主,我的配置方式,和你那边的配置方式,有什么不同吗?谢谢
离线
@sh200436
可能是rttstudio 不支持这个芯片调试吧,我是直接usb 下载的,串口看打印信息,而且程序需要引导的,不是这一个bin文件就能跑起来了,还需要一个boot.bin 很多帖子或gitee 里有这个bin 直接用就好了
离线
我换了好几台电脑,反复安装卸载RT-Studio后,还是提示错误信息,原来是这样啊。。。。[囧][囧][囧]
那我再把SPI_FLASH焊回去,先下载boot文件,再把APP文件烧进去试试看。
谢谢。。。
离线
链接: https://pan.baidu.com/s/1QVp65GaXa-v_Rmq_EEg2AQ 提取码: qvjq 复制这段内容后打开百度网盘手机App,操作更方便哦
这个是我做的一个烧录ram的 你双击bat就可以烧录了 前提是装好驱动啥的 rtt.bin 不一定显示 我也不知道是啥时候的版本了
离线
@tangloong
谢谢楼主,上班后我就试试。
手上没有工具,拆掉的SPI_FLASH芯片暂时没办法复原。。
离线
离线
大佬 ,我手头也有同样的开发板 ,贴的也是nandflash,有办法通过nandflash启动RTT的生成的BIN么?我看坑网里大佬们分享的有基于Linux的支持nand的方法
离线
大佬 ,我手头也有同样的开发板 ,贴的也是nandflash,有办法通过nandflash启动RTT的生成的BIN么?我看坑网里大佬们分享的有基于Linux的支持nand的方法
暂时 我也只是跑通了ram 和SD卡启动,flash没成功 你那边成功了还请告知一下,我自己画的板子 烧录linux到flash也不行,不知道是不是因为我用的华邦的flash跟开发板不一样导致的,flash的信息时可以读取的
离线
大佬 ,我手头也有同样的开发板 ,贴的也是nandflash,有办法通过nandflash启动RTT的生成的BIN么?我看坑网里大佬们分享的有基于Linux的支持nand的方法
试一下这个帖子的方法吧
https://whycan.com/p_89372.html#p89372
下载的工具我上传到网盘里了,有兴趣可以研究一下,反正我没成功 链接:https://pan.baidu.com/s/1H4btWD7jokvOQWa7nmcFhQ
提取码:hoke
离线
@tangloong
兄弟 我把板子换成了nor flash,用https://whycan.com/t_4907.html里大佬们的方法烧录启动成功了。
Nand我用xfel把spl烧录进去是可以启动的,但是nand容易有坏块,所以它是通过烧录到多个page,启动时会依次从0,32,64....寻找启动固件,而且BOOTROM是只从page中取1K的数据,用xfel spinand splwrite 1024 <address> <file> - Write file to spi nand flash with split support来烧录,参考https://whycan.com/t_4916.html。spl启动后我没有尝试了,后面的程序启动需要nand驱动和校验的支持,一般的应用程序又不大,没必要上nand。
附上我改的通过uart1打印调试信息的spl
boot.zip
#include <io.h>
void sys_uart_putc(char c)
{
uint32_t addr = 0x01c25400;
while((read32(addr + 0x7c) & (0x1 << 1)) == 0);
write32(addr + 0x00, c);
}
void sys_uart_init(void)
{
uint32_t addr;
uint32_t val;
/* Config GPIOA3 and GPIOA2 to txd1 and rxd1 */
addr = 0x01c20800 + 0x00;
val = read32(addr);
val &= ~(0xf << ((3 & 0x7) << 2));
val |= ((0x5 & 0x7) << ((3 & 0x7) << 2));
write32(addr, val);
val = read32(addr);
val &= ~(0xf << ((2 & 0x7) << 2));
val |= ((0x5 & 0x7) << ((2 & 0x7) << 2));
write32(addr, val);
/* Open the clock gate for uart1 */
addr = 0x01c20068;
val = read32(addr);
val |= 1 << 21;
write32(addr, val);
/* Deassert uart1 reset */
addr = 0x01c202d0;
val = read32(addr);
val |= 1 << 21;
write32(addr, val);
/* Config uart1 to 115200-8-1-0 */
addr = 0x01c25400;
write32(addr + 0x04, 0x0);
write32(addr + 0x08, 0xf7);
write32(addr + 0x10, 0x0);
val = read32(addr + 0x0c);
val |= (1 << 7);
write32(addr + 0x0c, val);
val = 54;
write32(addr + 0x00, val & 0xff);
write32(addr + 0x04, (val >> 8) & 0xff);
val = read32(addr + 0x0c);
val &= ~(1 << 7);
write32(addr + 0x0c, val);
val = read32(addr + 0x0c);
val &= ~0x1f;
val |= (0x3 << 0) | (0 << 2) | (0x0 << 3);
write32(addr + 0x0c, val);
sys_uart_putc('I');
sys_uart_putc('n');
sys_uart_putc('i');
sys_uart_putc('t');
sys_uart_putc(' ');
sys_uart_putc('O');
sys_uart_putc('K');
sys_uart_putc('\r');
sys_uart_putc('\n');
}
最近编辑记录 adigita (2023-05-24 10:52:38)
离线
楼主电脑模拟LVGL是怎么做的?用VS吗?
离线
@adigita
我发现不是boot 和 应用不行,原来是sunxi-fel 不认识板子上的1G flash
ubuntu18@ubuntu:~/Workspace/F1C200S/RTOS/f1c100s_rt-thread/tools/sunxi-tools$ ./sunxi-fel spiflash-info
ERROR: You don't have permission to access Allwinner USB FEL device
ubuntu18@ubuntu:~/Workspace/F1C200S/RTOS/f1c100s_rt-thread/tools/sunxi-tools$ sudo ./sunxi-fel spiflash-info
Manufacturer: Unknown (00h), model: C8h, size: 131072 bytes.
ubuntu18@ubuntu:~/Workspace/F1C200S/RTOS/f1c100s_rt-thread/tools/sunxi-tools$ sudo ./sunxi-fel spiflash-info
Manufacturer: Unknown (00h), model: EFh, size: 1024 bytes.
ubuntu18@ubuntu:~/Workspace/F1C200S/RTOS/f1c100s_rt-thread/tools/sunxi-tools$
我试了两块板子 都是1G的 读出来的容量都不对
正常人家读16MFlash 是这样的
如果MPi-R板背面是Winbond的W25Q128(16MB nor flash),那么就要用fel刷机。
查看芯片信息sunxi-fel ver
AWUSBFEX soc=00001663(F1C100s) 00000001 ver=0001 44 08 scratchpad=00007e00 00000000 00000000
显示spiflash的信息sunxi-fel spiflash-info
Manufacturer: Winbond (EFh), model: 40h, size: 16777216 bytes.
离线
牛牛,Mark一下,楼主是用的7" 40P的液晶屏吧,竟然是1024x600,切屏的时候效果怎样? 以前用200s跑awtk,800x480就差不多了
离线
@tangloong
用大佬xboot做的xfel可以识别nand的 https://whycan.com/t_7323.html
离线
楼主电脑模拟LVGL是怎么做的?用VS吗?
我用的codeblocks 和官网的 lv_port_win_visual_studio 工程做的
VS装C++ 太大了 就用了 codeblocks
都可以跑起来的
UI是用 SquareLine Studio设计的
模拟器只是验证一下,导入嵌入式没模拟器方便快捷
离线
牛牛,Mark一下,楼主是用的7" 40P的液晶屏吧,竟然是1024x600,切屏的时候效果怎样? 以前用200s跑awtk,800x480就差不多了
是的7寸40Pin 1024*600的屏幕,切换的时候流畅度还可以接受,只要不是全幅度动画效果,切个页面还是没压力的,但是我想做的应用是竖屏的 但是市面上RGB找不到竖屏,使用的是LVGL 软件转的方式,需要将所有数据拷贝一遍,这样在滑动的时候就显得不那么流畅了,还没想好是换带2D加速的主控还是就这样算了
离线
@adigita
换成 norflash 了,结果还是没启动成功,不知道是哪里的问题了
用的烧录命令
.\tools\sunxi-fel.exe -p spiflash-write 0x00000000 boot.bin
.\tools\sunxi-fel.exe -p spiflash-write 0x00010000 rtthread.bin
@pause
离线
@adigita
换了个boot
Boot to SPI mode
entry=00000000, sp=00009ff4, lr=ffff417c.
RTThread
Load 0x00024938 bytes @0x81b00000 FAIL.
Load again FAIL.
Load again FAIL.
Load again FAIL.
Load again FAIL.
...
离线