ART PI与RTThread
ART是基于STM32H750XB设计的一块板子,自带STLINK且将串口合并在同一个typeC口上,烧录和运行观察都很方便。而作为RTThread社区运营的产物,在RTT官方开发工具RT-Thread Studio里有专门的配套待遇。接下来就讲一下个人的使用体验。
PWM配置体验
拿到一块板子第一任务当然是点个灯,而在RT-Thread Studio里可以看到ART官方团队早就准备好了相关的预设配置,只需要点击或者手动去配置相关标志位定义即可使用
然而美中不足的是,尽管现在不需要再手动添加初始化的相关代码,但在stm32h7xx_hal_conf.h里的TIM相关定义没有随着设置开启而开启,还是处于注释状态,当时折腾了半天才发现没有启动TIM。
驱动LCD(ili9488)
ART官方推出了一款ili9488驱动的屏幕也是使用SPI驱动的,理论上只需要配置一下即可使用,且官方也推送了社区内相关适配文章。
按照文章作者的说法,使用ART配置LCD只需要简简单单的在设置中打开对应的开关即可使用,而在最新的1.3.0版本中,可以明显感觉到相比较文章发布时的使用有了一定程度的优化。
如SPI2的初始化代码官方配置好了,不需要再去cubeMX配置然后复制粘贴修改,以及当时官方的LCD默认打开是并口配置,与自家SPI屏幕冲突,现在的话,以及是对应的SPI而不是并口。
配置LVGL
配置完屏幕后,只是运行屏幕测试并不能满足,接着就需要进行进阶的配置。例如来个GUI,官方有专门配置好的LVGL设置,原本配置完屏幕这么顺利后,个人对接下来配置LVGL的预期就是跟上面一样打开开关编译下载查看即可。
但是跟着配置屏幕的博主进行同样的LVGL配置发现。
出现了“跑飞”的情况,而在LVGL移植文章中也有人遇到了类似的情况,一开始我的解决方向也是跟作者在下面评论区回答的分辨率问题,而在我多次修改后,问题并没有解决,在社区内寻找一番后,得到了作者当时的代码源码。
通过比较发现了当时的源码与最新版本代码的不同之处。运行旧版本的代码,屏幕顺利跑起来。
附上源码:
#include "littlevgl2rtt.h"
#include "lvgl.h"
static rt_device_t device;
static struct rt_device_graphic_info info;
static struct rt_messagequeue *input_mq;
static int _lv_init = 0;
static lv_disp_drv_t disp_drv;
static lv_disp_buf_t disp_buf;
static void color_to16_maybe(lv_color16_t *dst, lv_color_t *src)
{
#if (LV_COLOR_DEPTH == 16)
dst->full = src->full;
#else
dst->ch.blue = src->ch.blue;
dst->ch.green = src->ch.green;
dst->ch.red = src->ch.red;
#endif
}
/* Todo: add gpu */
static void lcd_fb_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p)
{
int x1, x2, y1, y2;
x1 = area->x1;
x2 = area->x2;
y1 = area->y1;
y2 = area->y2;
/*Return if the area is out the screen*/
if (x2 < 0)
return;
if (y2 < 0)
return;
if (x1 > info.width - 1)
return;
if (y1 > info.height - 1)
return;
/*Truncate the area to the screen*/
int32_t act_x1 = x1 < 0 ? 0 : x1;
int32_t act_y1 = y1 < 0 ? 0 : y1;
int32_t act_x2 = x2 > info.width - 1 ? info.width - 1 : x2;
int32_t act_y2 = y2 > info.height - 1 ? info.height - 1 : y2;
uint32_t x;
uint32_t y;
long int location = 0;
/* 8 bit per pixel */
if (info.bits_per_pixel == 8)
{
uint8_t *fbp8 = (uint8_t *)info.framebuffer;
//TODO color convert maybe
fo