把“软控”和“设计工具”放到同一张工作台上,乍看有点混搭。软控对应设备里的逻辑和状态,设计工具对应外观、交互和硬件结构,但它们实际是一枚硬币的两面:任何产品想落地,都逃不开“程序怎么控制”和“界面怎么呈现”这两件事。这篇文章盘点我这些年实际用过的软控和设计工具,覆盖嵌入式UI、免费UI设计、LVGL设计工具、NFC圆形天线设计工具等角度,适合电子工程师、嵌入式开发者、硬件创业者以及刚接触产品原型的人参考。我尽量把工具背后的适用场景、实操步骤、常见坑都讲透,内容偏“百科向”,但每一条都会落到能直接下手干的程度。
1. 先把“软控”和“设计工具”放到同一张工作台
1.1 软控到底是什么,我做项目时怎么理解它
“软控”这个词在不同行业里的含义其实不太一样。在工业自动化里,软控可能指软件控制系统,比如PLC程序、HMI运行逻辑;在嵌入式消费电子产品里,软控通常是你写在单片机里的那层控制代码;在一些联网设备里,软控甚至可以指设备端程序与后台下发策略之间的调度逻辑。但拆到最底层,软控解决的就三件事:输入怎么读、状态怎么切、输出怎么动。
我做过一个共享充电桩的控制器,按键、刷卡模块、本地继电器都挂在一颗主控上,软控部分就是每秒轮询按键状态、读取射频卡片序列号、判断充电流程处于空闲、插枪、充电还是结算,再决定点亮哪颗灯、鸣不鸣蜂鸣器。这一类逻辑用流程图能画清楚,但落到代码里就绕不开状态机设计。所以你会看到很多成熟的嵌入式项目里其实都内置了一套“软控”思想:事件驱动、状态转移、超时保护,而不是一串堆在一起的if-else。
“软控”还有一个很容易被忽略的层面:它不只是代码,还包括调试和验证手段。程序烧进芯片之前,很多人习惯用仿真器、串口打印、逻辑分析仪去看内部状态,这些都是软控工具链的一部分。开源的LVGL模拟器、QEMU软件仿真、串口网络调试助手,都属于我能实际跑起来的软控工具。别小看这些工具,它们能省下大量反复烧录固件的笨功夫。
1.2 为什么盘点要有“设计工具”的位置
软控再灵活,最后都要通过界面、结构、天线的形式跟人或者跟外部环境交互。这就轮到设计工具出场。我在实际项目里最深的体会是:软控和设计的边界永远切不干净,你改了界面布局,代码里的坐标、尺寸、事件绑定可能全要动一遍;你调整了天线参数,匹配电路和软控读卡时序又要重新适配。
所以这篇文章的盘点逻辑不是“先软控再设计工具”,而是把它们放进同一条工作流里:先用免费UI设计工具把交互稿画出来,再用LVGL设计工具把界面转成嵌入式工程,最后用NFC圆形天线设计工具把硬件链路也闭环。不同行业的从业者可以按需取走自己需要的那一段,但整套流程连起来看,你才会明白一个产品从概念到能跑,到底要经历多少层工具配合。
2. 免费UI设计工具盘点:从画板到交付的完整链路
2.1 免费工具横向对比,不只看价格
UI设计工具这几年迭代非常快,我最早用Photoshop切图切到怀疑人生,后来转向可以自动标注、共享链接的在线设计工具,效率至少翻了一倍。现在大家用得比较多的免费UI设计工具,最典型的一档是Figma。Figma免费版最吸引人的地方是多人实时协作,产品经理、设计师、开发在同一个画板上对着看,版本历史也方便回滚。它的社区和插件生态非常庞大,很多图标包、设计系统模板都能直接复用,适合作为界面原型的起点。
Penpot是另一个值得关注的免费工具,它最大的卖点是开源和可私有化部署。如果团队对数据出网有要求,或者你希望把设计资产保存在自己的服务器上,Penpot会是比Figma更合适的选择。它的交互、组件、自动布局能力已经够用,文件格式也很友好,配合Git管理设计稿反而比在线SaaS省心。国内团队还会常用即时设计这类本土化工具,中文支持、字体资源、交付标注做得顺手,免费额度对个人开发者几乎够用。
如果只是做嵌入式设备的小屏幕界面,几百块钱的订阅费未必值得花。我的建议是先选一款免费工具把界面原型跑通,等确实需要复杂组件库、多人权限、开发交付协作,再考虑升级或换商业方案。免费的边界不在工具本身,而在于你的项目复杂度和协作人数。
2.2 真正好用和真正够用的差异在哪里
很多时候我们会被免费工具的丰富功能带跑。明明只是做一个320×240的LCD菜单,有人却在Figma里搭了一整套设计系统,光颜色变量就几十个。我个人经验是:够用比强大重要,尤其是面向嵌入式屏幕的UI设计。
嵌入式小屏有几个明显特征:分辨率低、色彩数少、控件尺寸受触控精度限制。设计工具里好看的大字号、圆角投影、半透明分层,在单片机上可能根本跑不动,甚至色彩深度一压缩就出现严重色带。所以我在设计阶段就会提前做减法:先确认屏幕分辨率、色彩位数和触控方式,再限定画板尺寸和可用颜色。比如TFT屏幕最常见的是RGB565,意味着每种颜色只能表达6位红色、6位绿色、5位蓝色,很多细腻渐变在手机屏上看着高级,到了RGB565屏幕上就会变成一圈一圈的断层。
真正好用的工作流,是设计工具里交出来的产物能被下游直接消费。对嵌入式界面来说,这意味着你要在Figma或Penpot里管理好资源切图,导出时需要明确图片模式、压缩格式和尺寸倍率。按钮背景、图标、字体资源最好单独整理成目录,命名规则统一,这样后面交给LVGL设计工具或手写代码时,才能减少来回沟通成本。
3. LVGL设计工具:从拖拽界面到单片机工程的桥梁
3.1 LVGL生态里,设计器各自站在什么位置
LVGL是目前嵌入式领域占有率很高的开源图形库,它可以在不带操作系统的裸机环境里跑,也适配RT-Thread、FreeRTOS、Zephyr等系统。控件比较丰富,从按钮、标签、列表,到圆弧、图表、键盘都齐。但纯手写界面代码还是太慢,尤其当你同时要处理几十个屏幕、几百个控件的时候,坐标和层级关系会把人逼疯。于是LVGL配套的设计工具就变得非常重要。
目前常见的设计工具有两类。一类是官方联合生态推出的可视化编辑器,比如SquareLine Studio,它支持拖拽式布局、样式编辑、事件配置,还能直接导出LVGL的C代码工程。另一类是NXP出品的GUI Guider,它跟MCUXpresso生态绑定得更紧,适合基于NXP芯片做HMI项目的团队。抛开厂家偏好不谈,这两类工具的核心逻辑是一致的:你像做PPT一样把界面搭出来,工具帮你生成控件创建、布局、回调函数的骨架代码,再拿到工程里编译烧录。
还有一条路线是用模拟器在PC上跑“软控”逻辑,这里专门说一句:LVGL官网其实提供了基于SDL或浏览器模拟器的方案。你完全可以在电脑上把界面逻辑调通,再移植到板子,避免“每改一个坐标就烧一次固件”的低效循环。这一点很多人容易忽略,但它其实是最应该放进工作流里的软控工具。
3.2 手把手建一个320×240的LVGL界面工程
我来拆解一个真实的小项目:在一块320×240分辨率的屏幕上,做一个带开机页、主菜单、设置页的三屏界面。前提是你已经把LVGL源码放进工程,并且能正常在板子上显示一个空背景。
第一步是打开设计工具,新建项目时选好分辨率和色彩格式。这里建议直接按目标硬件的实际值填,很多问题的根源就是画板分辨率比屏幕大,代码生成后画布溢出,显示内容被截断。色彩格式选RGB565还是ARGB8888,要看主控是否支持对应帧缓冲格式,别贪图高色彩精度,内存不够时会直接卡死。
第二步是创建开机页。放一张Logo图片、一个滑动条做加载动画。设计工具里通常有动画属性,可以设置透明度渐变或者坐标位移,生成代码时会自动注册相应的动画回调。我一般会把开机页动画时长控制在1到2秒,太长用户会以为设备卡死,太短则起不到品牌展示作用。
第三步是搭主菜单,这里推荐用网格布局或列表控件。如果你要放四个功能入口,在工具里放四个按钮,再逐个绑定点击事件。事件回调是设计工具自动生成的,你只需要在生成的函数体里补入真正的跳转逻辑。这一步也是软控重点:界面切换要定义好状态,避免连续点击时重复创建屏幕导致内存泄漏。
第四步是设置页,用滑块、开关、下拉框这类控件。设计工具都支持把这些控件值绑定到变量。我习惯在回调函数里把参数直接写回一个结构体,这样底层控制逻辑读取时非常干净。比如一个温度阈值滑块,把值写进settings.temp_limit,控制程序就只需要读这个字段。
全部搭完后,选择“导出源码”。产物通常是一个ui.c、ui.h和一组资源文件。把这两个文件放进工程,调用ui_init()初始界面,再在定时器或主循环里调用LVGL心跳函数,界面就能跑起来。
3.3 导入和使用时最容易犯的三种错
导出LVGL工程后,第一类容易踩的坑是资源文件路径。图片、字体资源默认以数组甚至文件系统方式引用,如果你的工程开启了文件系统驱动,就必须确保资源和板载Flash或SD卡路径完全匹配。我自己遇到过图片不显示,排查半天,结果是路径里多了一个斜杠。
第二类坑是内存分配不合理。LVGL默认需要配置LV_MEM_SIZE,界面控件越多、图片越大,所需内存越高。设计工具生成的大图如果超过可用内存,程序会在初始化时死掉。做法是先看Excel或可执行文件大小,极端情况下把图片转成8位调色板格式,或者改成直接调用外部Flash中的流式资源。
第三类坑是回调函数里误用阻塞操作。设计工具生成的按钮回调,默认运行在LVGL的线程上下文里,如果你在回调中执行延时、等待硬件外设响应,会阻塞整个UI刷新。正确姿势是回调只设置标志位或把参数写入队列,真正的业务逻辑放到后台任务里处理。这个习惯往大了说,就是软控和UI解耦,往小了说,能避免界面卡到像死机一样。
4. NFC圆形天线设计工具:让硬件也“可设计”
4.1 为什么NFC天线要专门用设计工具
NFC工作在13.56MHz频段,天线形态一般是PCB上的线圈天线。别看它只是一圈一圈的铜箔,设计好坏直接影响读卡距离、通信稳定性和EMC表现。我最早手工绕圆形线圈做NFC天线时,完全靠试:漆包线绕了几圈,接上NFC控制器,读卡距离只有一两厘米,后来才知道是天线电感和谐振电容没有匹配到读写器的工作频率。
所以现在的NFC天线设计几乎都要依赖工具。很多半导体厂商都提供免费在线设计工具,比如恩智浦的NFC天线设计和天线的阻抗匹配工具,意法半导体也有一些配套软件,能够根据天线直径、线宽、匝数、PCB叠层自动估算电感值,并给出匹配电容和电阻建议。一些更专业的电磁仿真工具也能做全波仿真,但免费工具对绝大多数原型验证已经足够,至少能把“能不能用”这个问题从玄学变成工程问题。
“软控”在这条链路里也不是消失的:NFC控制器的寄存器配置、射频场使能、读卡轮询逻辑,都需要和天线参数配合。比如天线Q值调得太高,读卡距离可能变远,但带宽变窄,对频率漂移更敏感;Q值太低,读卡距离短但更稳定。这个权衡就需要软控里设置不同发射功率级别来配合调试。
4.2 圆形天线设计流程与参数计算
正常做一枚圆形NFC天线,第一步先估算线圈电感。圆形PCB天线可以看成平面螺旋线圈,电感量主要由平均直径、匝数、线宽和线间距决定。工程上常用近似公式:
单圈圆环的电感约等于L ≈ μ₀ × r × (ln(8r / a) - 2),其中μ₀是真空磁导率,r是环形天线半径,a是导线等效半径。举例来说,如果天线环形半径取15毫米,导线等效半径取0.25毫米,算下来单圈电感大约在几十纳亨级别,多圈以后由于匝间互感叠加,总电感会显著上升。这个公式的精度对工程预估够用,真正落地时还是要交给厂商在线工具或仿真软件去校准。
第二步是确定目标频率和匹配网络。NFC天线通常要调谐到13.56MHz附近,常见做法是并联一个谐振电容,再串一个电阻来调整Q值。匹配网络的目标是让天线从NFC控制器引脚看进去的阻抗接近50欧姆,并把谐振频率调到工作频点。设计工具一般会输出一组推荐值,比如某直径、某匝数对应的并联电容值为pF级,串联电阻为几欧姆到几十欧姆。
第三步是画板验证。圆形天线在PCB上的走线宽度和间距会影响寄生电容,所以布局阶段最好让天线区域周边少布地铜,尤其不能有完整的金属地平面直接覆盖在辐射区下方,否则射频能量会被屏蔽掉。打过板之后,用网络分析仪看S11参数,如果谐振点偏移,就微调并联电容。没有网分时,一个简陋但实用的办法是反复改变读取距离和方位,看读卡成功率变化趋势,大致判断天线是否失谐。
4.3 从计算到仿真,圆形天线有几个关键优化点
实际设计一枚圆形天线时,几个参数需要反复权衡。直径大,电感高、辐射能力强,但占板面积也大;匝数多,电感近似按匝数的平方增长,但线间寄生电容也增加,导致自谐振频率降低;线宽太宽会降低直流电阻,但也减少可绕匝数,线太细则损耗高、Q值不稳定。
我还会关注天线Q值。Q值代表天线的选择性,也就是在13.56MHz附近能量集中程度。NFC应用中,太高的Q会让信号衰减快、带宽窄,容易受温度和邻近金属物体的影响;太低则能量分散,读卡距离变短。一般匹配电路里可以通过串联电阻来降低Q值。设计工具输出建议值后,我通常会在预留0欧电阻的地方多贴几种阻值,实测时再决定最优值。
优化过程中还可以借助电磁仿真,它会把你画好的PCB图形直接导入,做全波求解,能看出天线周围的磁场分布。不过这类仿真软件学习曲线比较陡,对快捷原型验证,我建议先用厂商免费工具定匹配参数,再在真实板子上用网分和读卡实验联合验证。把仿真、实测、软控读卡结果三者对照,定位问题会比盲目调匝数快得多。
5. 实操记录:一套合理开发流程的完整闭环
5.1 从UI稿到代码生成的具体工作流
我第一次体会“设计到代码全链路跑通”,是在做一款带触摸屏的温控面板项目里。整体流程是这样的:产品经理先在Figma里画了一版界面,我把它转到一个LVGL设计工具里重新搭结构,再导出C代码,烧进STM32主控。
这里有个重要教训:不要指望Figma的像素级设计稿能直接变成LVGL内容。LVGL的布局模型是“容器+控件+样式”,Figma里的绝对定位、布尔运算、文本样式,很多无法一一对应。更合理的做法是把Figma当作交互与视觉参考,然后在LVGL设计工具里重新用原生控件还原。这个过程看似多了一步,实际上避免了生成代码后的手工修补。
我在还原界面时会先把静态布局画出来,再处理图片资源。Logo和图标如果是矢量的,最好导出成合适尺寸的PNG或者使用LVGL兼容的二进制字体工具。图片格式建议直接选用支持透明通道的PNG,再通过LVGL图像转换工具生成C数组。大尺寸图片则尽可能压缩,能用8位索引色就尽量用。
界面跑通后,再对接软控逻辑。温控面板里的目标温度设置、定时器开关、温湿度数据显示,全部通过回调写入变量,显示刷新采用LVGL定时器和数据绑定机制,而不写死坐标更新。这样改界面布局时,控制逻辑几乎不用动,非常省事。
5.2 把天线设计与主控匹配串起来的经验
在另一个带NFC刷卡功能的门锁项目里,我利用在线NFC天线设计工具先输入了一个圆形天线目标:直径30毫米,线宽0.5毫米,计划绕4圈。设计工具估算出电感匹配电容值,我照着做了几块不同匝数的小板子,实测后发现4圈的电感偏大,谐振频率跑到了11MHz左右,读卡距离很短。
问题的根源是PCB板材的介电常数、铜箔厚度、焊盘寄生电容导致实际电感与理论估算差异较大。后来我直接保留设计工具中的电容预留位,把并联电容换成可调电容,在频谱仪和网分辅助下调到13.56MHz。这个过程中软控部分也在配合:读卡轮询间隔、抗碰撞处理都做了参数化配置,调试时不用重新编译固件,省了我大量时间。
这次以后,我形成了一个固定习惯:天线匹配网络预留可调电阻、电容的位置,PCB上标注好串并联位置,首版验证通过后再根据实测值换成固定器件。即便免费设计工具给的值不完全准确,也能在打样板阶段快速修正,不至于一版就废。
5.3 版本管理与交付协作的实用规范
小团队做产品时,版本管理很容易被忽视。尤其涉及到设计工具生成的代码,一遍遍手工复制粘贴,迟早会出错。我现在习惯把LVGL设计工具的项目源文件、导出的ui.c、ui.h、资源目录全部纳入Git仓库,节点命名按“硬件版本+界面版本”组合,比如v1.0_ui_rev2。
设计协作上,无论用Figma还是Penpot,我都建议在交付前做一次“设计稿走查”:屏幕尺寸、字体字号、主要状态(空状态、加载状态、错误状态)都要画出来。交付资源时,标明清楚哪些是可直接生成代码的源文件、哪些是提供素材用的参考图。团队里如果没有专职UI设计,也可以让嵌入式工程师直接上手LVGL设计工具,虽然交出来的效果没那么出彩,但胜在一手代码一手界面,沟通成本降到最低。
NFC天线相关的工程文件也是一样,匹配元件值、天线几何参数、实测谐振频率最好记录在同一份表格里,PCB版本升级后可以对照前后差异。很多时候问题不是“设计不出来”,而是“不知道哪个版本是哪套参数”。
6. 问题排查与避坑速查表(实践经验的精华)
6.1 设计工具常见问题速查
遇到界面在PC模拟器正常、上板就不正常的情况,优先检查三件事:分辨率和颜色格式是否与硬件一致;帧缓冲大小是否足够;LVGL内存池是否满足当前控件树需求。如果显示花屏,多半是RGB字节序配置和屏驱动不一致,在lv_conf.h里调LV_COLOR_16_SWAP或其他字节序宏试试。
LVGL设计工具导出代码后编译报未定义符号,也经常遇到。起因多是工程里没有加入合适的LVGL版本,或没有打开对应控件模块宏。比如你用到了图表控件,但lv_conf.h里把图表相关宏关了,链接就会失败。解决思路是逐个检查设计工具工程版本与固件里LVGL版本的一致性,尽量要求两者主版本号一致,避免API漂移。
表格化总结如下:
| 现象 | 可能原因 | 快速处理 |
|---|---|---|
| 模拟器正常、板子花屏 | 分辨率/色彩格式不符 | 检查画板与屏参,调整字节序 |
| 界面启动后死机 | LV_MEM_SIZE太小 | 增大内存池或压缩图片 |
| 图片或字体不显示 | 资源路径或文件系统未挂载 | 核对路径,确认驱动挂载 |
| 按钮无反应 | 回调没绑定或事件被阻塞 | 检查事件回调,避免延迟函数 |
6.2 天线匹配的常见问题速查
NFC天线调试阶段的坑,集中在谐振偏频和感量偏差上。用网络分析仪能直接看到天线阻抗圆图,如果谐振点明显偏移,就调整并联电容值。没有网分仪时,可以观察读卡距离的变化规律:距离很近能读、稍微拉开就不行,基本是能量辐射不足;原地反复抽卡偶尔成功,则要考虑波形过冲或Q值过高。
匹配电阻建议从低到高分几个档位去试,不要一上来就照着理论值焊死。板子上的地铜接近天线辐射区时,效率通常会下降,必要时在天线外圈做禁布区,并保持天线区域干净。软控层面也容易出现“天线明明设计对了,但读卡成功率低”的情况,这时检查NFC控制器的驱动配置,尤其是射频场开启时间和轮询周期,让发送窗口与读写器命令时序对齐。
6.3 我踩过几次坑后留下的检查单
每次接手新的软控和设计工具任务时,我一定会把下面这份检查单过一遍:第一步,硬件规格书和屏幕接口先看全,确认分辨率、色彩、字体渲染方式;第二步,跑通最小显示程序,哪怕是只显示一个空白背景,也要先把底层的显示链路做扎实;第三步,再进入界面设计工具搭建复杂页面,每加一个页面就烧录验证一次,不要攒到最后一起调。
对NFC天线项目,检查单上必须包括匹配元件是否预留调试点、天线区域是否清空地铜、是否做了尺寸标注和实测记录。天线设计工具计算只是个起点,最终以实测为准,每一次调整参数都要记档,方便复盘。
个人经验里最值钱的一句话是:软控和设计工具本来就不该各自为战。把界面设计、代码生成、天线匹配、软控调试排进同一条流程里做,产品迭代速度会快非常多。你可以刘不完成整套链路,但至少要在心里有一条完整的地图,知道每个工具从入口到最后交付的数据长什么样。这样踩过的每一个坑,都会变成下一次设计时真正有用的判断依据。