衡山派LVGL注意点
-
- [4移植sdk后的配置scons --menuconfig](#4移植sdk后的配置scons --menuconfig)
- 4*控件交互
-
- 按键控件控制板载LED--PE17
-
- [第一处:修改 custom.c](#第一处:修改 custom.c)
- [第二处:修改 pinmux.c](#第二处:修改 pinmux.c)
- 举一反三
- **你下次可以直接用这个提示词:**
前言:本文是我在实际使用中遇到的一些问题,然后记录下来了,分享给大家,要是大家发现什么问题麻烦在评论区指正,如果对你有帮助希望能给主播点个赞

开发软件的下载地址在:立创·衡山派D133EBS开发板资料_免费高速下载|百度网盘-分享无限制

4移植sdk后的配置scons --menuconfig
参考文档:【立创·衡山派D133EBS开发板】AiUIBuilder | 立创开发板技术文档中心
可以打开他的上位机ui耍耍


然后后面就跟教程文档就行,到下面这里要注意

用 scons --menuconfig 进入后按/的时候要注意

1)启用freetype
搜索freetype然后按下回车



2)对接LVGL路径







注意文档里我们一些代码是写在lvgl8的文件夹下的,所以我们要选lvgl8


完成这些配置即可开始编译
然后要是编译有问题我们可以把报错发送给ai,然后让ai帮我们看看哪里有问题(有AI就是好用)
4*控件交互
按键控件控制板载LED--PE17
操作过一两次这个ui后,大家肯定能熟悉如何添加自己想添加的控件以及显示在屏幕上了,但我们光看屏幕显示肯定不够玩的,肯定要来点交互才行,所以下面就让我们研究一下怎么交互把【现在已经是ai的时代了,所以我们有时候也要会合理的借助ai】

比如我想实现这个功能:我想按下这个按钮button_1然后让板载led亮--即PE17给高电平,再按一下再让他灭,依次往复
我们的前置工作是先把这个ui生成好,然后按照官方的文档添加到我们的工程中
然后我们在外面的工程文件夹中召唤codex
跟他发:
我刚刚已经重新配置了一下ui,并且把sdk成功移植了,现在应该是有button_1这个控件了,现在请你先大概看看我的工程的内容,然
后告诉我假设我想实现--我想按下这个按钮button_1然后让板载led亮--即PE17给高电平,再按一下再让他灭,依次往复 请问我应
该在哪些地方添加或者修改什么代码,请你指导我进行修改,告诉我怎么改,然后让我来改
然后聪明的ai就会告诉你在那里改以及改什么内容
我看过你现在的工程了,结论是:button_1 已经生成到 SDK 里了,而且已经是 Clickable,你现在只需要改两个地方。
1. **改 UI 事件逻辑:**
/E:/Study_Note/BigThree/HengShan_Pi_D133EBS/luban-lite/packages/artinchip/lvgl-ui/aic_demo/ui_builder/custom/
custom.c:1
2. **配置 PE17 为 GPIO:**
/E:/Study_Note/BigThree/HengShan_Pi_D133EBS/luban-lite/target/d13x/JLC/pinmux.c:1
我确认到这些状态:
- button_1 已存在于 ui_objects.h
- screen.c 里已经有 lv_obj_add_flag(scr->button_1, LV_OBJ_FLAG_CLICKABLE);
- ui_init.c 里已经在创建界面后调用 custom_init();
- custom.c 现在还是空的,正好用来写你的用户逻辑
- 当前 pinmux.c 里还没有配置 "PE.17"
第一处:修改 custom.c
把 /E:/Study_Note/BigThree/HengShan_Pi_D133EBS/luban-lite/packages/artinchip/lvgl-ui/aic_demo/ui_builder/custom/
custom.c:1 改成下面这样:
c
#include <rtthread.h>
#include <rtdevice.h>
#include "lvgl.h"
#include "custom.h"
#include "../ui_objects.h"
static rt_base_t board_led_pin = -1;
static rt_bool_t board_led_on = RT_FALSE;
static void board_led_init(void)
{
board_led_pin = rt_pin_get("PE.17");
if (board_led_pin < 0)
{
rt_kprintf("Failed to get PE.17\n");
return;
}
rt_pin_mode(board_led_pin, PIN_MODE_OUTPUT);
board_led_on = RT_FALSE;
rt_pin_write(board_led_pin, PIN_LOW);
}
static void button_1_event_cb(lv_event_t *e)
{
if (lv_event_get_code(e) != LV_EVENT_CLICKED) {
return;
}
if (board_led_pin < 0) {
return;
}
board_led_on = !board_led_on;
if (board_led_on) {
rt_pin_write(board_led_pin, PIN_HIGH);
lv_led_on(screen_get(&ui_manager)->led_1);
} else {
rt_pin_write(board_led_pin, PIN_LOW);
lv_led_off(screen_get(&ui_manager)->led_1);
}
rt_kprintf("button_1 clicked, led_on = %d\n", board_led_on);
}
void custom_init()
{
screen_t *screen = screen_get(&ui_manager);
board_led_init();
lv_obj_add_event_cb(screen->button_1, button_1_event_cb, LV_EVENT_CLICKED, NULL);
}
这里的逻辑是:
系统启动 UI
-> ui_init()
-> 创建 screen 和 button_1
-> 调用 custom_init()
-> 初始化 PE17
-> 给 button_1 绑定点击回调
-> 每次点击 button_1,PE17 高低电平切换
我顺手把界面里的 led_1 也同步亮灭了。如果你只想控制板载 LED,不想动屏幕上的 led_1,可以删掉这两行:
lv_led_on(screen_get(&ui_manager)->led_1);
lv_led_off(screen_get(&ui_manager)->led_1);
第二处:修改 pinmux.c
打开 /E:/Study_Note/BigThree/HengShan_Pi_D133EBS/luban-lite/target/d13x/JLC/pinmux.c:125 ,在 aic_pinmux_config[] 数组
里加一行 PE17 GPIO 配置。
建议放在这里附近:
c
ifdef AIC_PANEL_ENABLE_GPIO
{1, PIN_PULL_DIS, 3, AIC_PANEL_ENABLE_GPIO},
endif
{1, PIN_PULL_DIS, 3, "PE.17"},
ifdef AIC_PRGB_16BIT_LD
{1, PIN_PULL_DIS, 3, "PE.17"} 里面第一个 1 表示 GPIO 功能。
你说的是 PE17 给高电平 LED 亮,所以上面的代码就是:
第一次点 button_1 -> PE17 = PIN_HIGH -> LED 亮
第二次点 button_1 -> PE17 = PIN_LOW -> LED 灭
第三次点 button_1 -> PE17 = PIN_HIGH -> LED 亮
如果烧录后发现实际是低电平亮,就把 PIN_HIGH 和 PIN_LOW 对调即可。
改完后重新编译、烧录。若编译报 button_1 找不到,说明 SDK 里的 ui_builder 又被旧代码覆盖了;如果编译过但 LED 不动,优先
检查 pinmux.c 是否生效、PE17 是否真的连板载 LED、以及 LED 是否低电平有效。
改好了后再去编译,有什么问题就把报错丢给ai,让他分析一下是哪里有问题
举一反三
谢谢你我成功了,请问以后要是操控控件再让单片机控制gpio基本上就是这样的方法是吗,可不可以请你再给我拓展的讲一点,然后
当我下一次想按屏幕上的控件然后让单片机实现一个功能 我是不是现在我的工程目录下打开终端召唤你,然后 我提前把屏幕的sdk
移植好,让你先看看,然后跟你描述一下功能,是这样吗,请你给我一个提示词,让我下次有什么想实现的功能可以基于这个提示词
然后改改发你
对,以后基本就是这套方法。
你的这个项目里可以记成一个固定套路:
AiUIBuilder 画控件并开启 Clickable
-> 重新生成并移植 ui_builder 到 SDK
-> 在 ui_objects.h 确认控件名字
-> 在 custom.c 的 custom_init() 里绑定事件
-> 在事件回调里调用 GPIO / UART / PWM / I2C / 业务函数
-> 如果用 GPIO,先在 pinmux.c 里配置引脚功能
比如这次就是:
button_1 被点击
-> LV_EVENT_CLICKED
-> button_1_event_cb()
-> rt_pin_write("PE.17", HIGH/LOW)
以后换成别的功能也一样。比如:
按钮点击 -> 控制继电器 GPIO
开关切换 -> 打开/关闭风扇
滑条变化 -> 改 PWM 占空比
复选框选中 -> 改某个模式变量
下拉框选择 -> 切换工作模式
文本框输入 -> 保存参数
常用事件大概这样记:
LV_EVENT_CLICKED // 点击一下,按钮常用
LV_EVENT_PRESSED // 按下瞬间
LV_EVENT_RELEASED // 松开
LV_EVENT_VALUE_CHANGED // 值变化,开关/复选框/滑条/下拉框常用
LV_EVENT_LONG_PRESSED // 长按
常用读取方式:
// 按钮、普通点击:直接在回调里做事
// 复选框 / 开关
bool checked = lv_obj_has_state(obj, LV_STATE_CHECKED);
// 滑条
int32_t value = lv_slider_get_value(screen->slider_1);
// 文本框
const char *text = lv_textarea_get_text(screen->textarea_1);
// 下拉框
uint16_t selected = lv_dropdown_get_selected(screen->dropdown_1);
有一个重要经验:LVGL 回调里尽量不要做很耗时的事情。像 rt_pin_write() 这种很快的操作可以直接写;如果以后要联网、读大文
件、等待传感器、复杂计算,最好在回调里只设置标志位或者发送消息,让另一个线程去做。
你下次的使用流程可以这样:
1. 先在 AiUIBuilder 里把界面画好。
2. 给需要点击的控件加 Clickable。
3. 生成代码并移植到 SDK。
4. 确认能正常编译一次。
5. 在项目目录打开终端再找我。
建议你在这个目录启动我:
E:\Study_Note\BigThree\HengShan_Pi_D133EBS
这样我能同时看到 luban-lite 和 ui_demo。如果你只在 luban-lite 里启动也可以,但我看 AiUIBuilder 原工程会稍微不方便。
你下次可以直接用这个提示词:
请你先检查一下我当前的衡山派 D133EBS 工程结构,重点看 luban-lite 里的 AiUIBuilder 生成代码、ui_objects.h、screen.c、
custom.c、ui_init.c、当前板级 pinmux.c。
我已经在 AiUIBuilder 里做好界面并移植到 SDK 了。现在我想实现这个功能:
【这里写你的功能,比如:点击 button_2 后让 PE18 输出高电平,再点一次输出低电平】
请你不要直接改代码,先告诉我:
1. 相关控件在代码里叫什么;
2. 应该改哪些文件;
3. 每个文件具体加什么代码;
4. 如果涉及 GPIO,需要在 pinmux.c 里怎么配置;
5. 编译后如果失败,我应该重点看哪些错误。
如果你愿意让我直接帮你改,就把最后一段改成:
请你检查后直接帮我修改代码,并告诉我改了哪些文件。
你现在已经把最关键的一步跑通了。后面控制 GPIO、本地变量、串口发送、PWM 调光,本质上都是在这个框架上换业务代码。