3. 开发环境搭建:Keil/IAR环境配置、LVGL库移植、模拟器(SquareLine Studio)安装与使用

好,咱们直接进入正题。做充电桩的屏幕开发,环境搭不好,后面全是坑。我见过太多人卡在编译报错上,一查发现是工具链版本不对。所以这一章,咱们把地基打牢。

3.1 Keil MDK 环境配置

Keil 是我个人用得最多的 IDE,尤其是做 STM32 系列芯片时。说白了,它就是个集编辑、编译、调试于一体的工具。

3.1.1 安装步骤

  1. 下载安装包:去 Keil 官网下 MDK-ARM 版本。注意版本号,我建议用 5.38 或更新版,太老的版本对 LVGL 支持不好。
  2. 安装芯片包:装完主程序后,记得装对应的 Device Family Pack。比如你用 STM32F4,就搜 "STM32F4xx_DFP"。
  3. 破解:嗯,这个大家都懂。不破解的话代码限制 32KB,跑个 LVGL 都不够。
我曾经遇到过一个问题:装完 Keil 后死活找不到芯片。后来发现是 Pack 没装对。记住,Pack 版本要和 MDK 版本匹配。

3.1.2 工程配置要点

新建工程时,有几点要注意:

  • 晶振频率:一定要和你板子上的实际晶振一致。我见过有人设 8MHz,板子上焊的是 12MHz,结果串口乱码。
  • 优化等级:调试阶段用 -O0,发布时用 -O2。LVGL 对性能有要求,优化等级太低会卡。
  • 堆栈大小:LVGL 需要至少 8KB 的堆空间。我习惯设到 16KB,留点余量。

3.2 IAR Embedded Workbench 配置

IAR 的编译器优化比 Keil 强,但界面没那么友好。你想想看,做充电桩这种量产产品,代码体积和性能都很重要,IAR 是个好选择。

3.2.1 安装与破解

IAR 的安装流程和 Keil 类似,但有个坑:许可证管理。IAR 用 License Manager,有时候网络不好会激活失败。我的建议是:下载离线激活包,一次搞定。

3.2.2 工程配置差异

配置项 Keil IAR
链接脚本 .sct 文件 .icf 文件
优化选项 Level 0-3 High/Medium/Low
调试器 ULINK/J-Link J-Link/I-jet
我个人习惯:用 IAR 时,把 C-Runtime 库选为 "Normal",别用 "Small",否则 printf 会出问题。

3.3 LVGL 库移植

LVGL 移植,说白了就是把它的源码放到你的工程里,然后配好显示驱动和触摸驱动。我刚开始移植时,花了整整两天才点亮屏幕。

3.3.1 获取源码

去 LVGL 的 GitHub 仓库下载。我建议用 v8.3.x 版本,稳定且文档全。v9 虽然新,但 API 变化大,坑多。

3.3.2 文件结构

把源码解压后,你需要关注这几个文件夹:

  • lvgl/src:核心源码,全部要加进工程
  • lvgl/examples:示例代码,调试时有用
  • lvgl/demos:演示程序,移植成功后可以跑跑看

3.3.3 配置 lv_conf.h

这是最关键的一步。打开 lv_conf.h,修改以下宏:

#define LV_COLOR_DEPTH     16    // 16位色,大多数屏幕都支持
#define LV_HOR_RES_MAX     480   // 屏幕宽度
#define LV_VER_RES_MAX     320   // 屏幕高度
#define LV_USE_DEMO_WIDGETS 1    // 打开示例,方便测试
#define LV_MEM_SIZE        (32U * 1024U)  // 分配32KB内存给LVGL
注意:LV_MEM_SIZE 不能设太小。我在一个项目里设了 8KB,结果界面稍微复杂点就死机。后来改成 32KB,稳如老狗。

3.3.4 显示驱动接口

你需要实现两个函数:

// 初始化屏幕
void my_disp_init(void) {
    // 初始化SPI或并行接口
    // 设置屏幕参数
}

// 刷新一块区域
void my_disp_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_p) {
    // 将color_p中的数据发送到屏幕
    // 发送完成后调用 lv_disp_flush_ready(drv);
}

3.3.5 触摸驱动接口

// 读取触摸点
void my_touch_read(lv_indev_drv_t *drv, lv_indev_data_t *data) {
    // 读取触摸芯片的坐标
    // 赋值给 data->point.x 和 data->point.y
    // 如果触摸按下,data->state = LV_INDEV_STATE_PR;
}

3.4 SquareLine Studio 安装与使用

SquareLine Studio 是个可视化 UI 设计工具。说白了,你拖拽控件,它自动生成 C 代码。这玩意儿能省 80% 的开发时间。

3.4.1 安装

去官网下载安装包。注意:免费版只能导出 5 个屏幕,做充电桩够用了。如果你要商用,得买授权。

3.4.2 创建项目

  1. 打开 SquareLine Studio,点 "New Project"
  2. 选择屏幕分辨率,比如 480x320
  3. 选择 LVGL 版本,要和你的工程一致
  4. 点 "Create"

3.4.3 设计界面

左侧是控件面板,右侧是属性面板。你拖一个按钮到画布上,然后在右侧改文字、颜色、大小。就这么简单。

我建议:先画个简单的界面,比如一个按钮加一个标签。导出代码后,看看生成的 C 文件结构,理解它的组织方式。

3.4.4 导出与集成

设计完成后,点 "Export":

  • 选择 "Export for LVGL"
  • 选择输出路径
  • 把生成的 ui.cui.h 复制到你的工程里
  • 在 main 函数中调用 ui_init()
#include "ui.h"

int main(void) {
    lv_init();
    my_disp_init();
    my_touch_init();
    
    ui_init();  // 加载 SquareLine Studio 设计的界面
    
    while(1) {
        lv_timer_handler();  // 处理LVGL任务
        delay(5);            // 适当延时
    }
}

3.5 常见问题与避坑

最后,分享几个我踩过的坑:

  • 屏幕不亮:检查背光引脚和复位时序。我曾经因为复位信号没拉高,折腾了一下午。
  • 触摸不准:多半是坐标转换没做。触摸芯片的坐标范围和屏幕分辨率不一定一样,需要做线性映射。
  • 编译报错:检查 lv_conf.h 是否被正确包含。我习惯把它放在工程根目录,然后在编译器里添加包含路径。

好了,环境搭建就讲到这里。下一章咱们开始写第一个充电桩界面——一个带充电进度条的简单屏幕。到时候你就知道,前面这些配置工作有多值了。