学习笔记 · Obsidian
用 BSP 逐步认识 CoreS3 板载外设
BSP 做了哪些准备
应用需要一块能工作的屏幕,但板卡启动时还要处理供电、IO 扩展、总线和驱动。BSP 把这些板级细节封装成入口,之后由 LVGL 等图形库管理控件。M5 BSP 教程
第一轮实验从所选 BSP 版本的显示例子开始。先理解“初始化 → 打开背光 → 获得绘图访问权 → 修改控件 → 释放访问权”。具体调用和错误返回值对照 BSP API 与已锁定版本头文件。
不要同时让自己的驱动和 BSP 各初始化一套相同外设。应用应通过单一所有者使用设备资源。
把官方显示例子改成自己的状态面板
按下列顺序逐项验收,每次只改变一个行为:
| 实验 | 改什么 | 预期 | 失败时先看 |
|---|---|---|---|
| D1 显示 | 把例子中的内容换成固定标题与运行秒数 | 重启后可显示;秒数更新 | 电源、背光、初始化返回值、版本 |
| D2 触摸 | 加一个触摸计数按钮 | 每次有效点击计数一次 | 输入驱动、坐标、事件类型、控件状态 |
| D3 采样 | 显示一个已支持传感器读数 | 正常数据与无效数据可区分 | 传感器初始化、总线、返回码 |
| D4 解耦 | UI 从队列接收最新快照 | 采样变慢时界面仍能响应 | UI 线程、锁、队列策略 |
| D5 恢复 | 模拟读传感器失败 | 展示错误与数据年龄,恢复后刷新 | 失败值是否被误当零、旧数据是否冒充新数据 |
这是本课程的实验设计,尚未在实物执行。板卡例子能运行,只证明例子覆盖的路径通过。
为什么锁住绘图不等于锁住整个程序
访问 LVGL 对象时遵循 BSP 提供的显示锁/线程约定;取得失败时不要继续修改对象。锁内只做短的界面修改,采样和 HTTP 请求在锁外完成。BSP display API
例如网络请求花了 5 秒,如果一直持有显示锁,触摸与刷新可能一起停住。先在网络任务生成结果,再把显示需要的小快照交给 UI,是本项目采用的组织方式。
后续外设按资源成本展开
- IMU、RTC:先识别测量单位、采样率、校准和无效读数,避免只看“有数字”。
- microSD:分别处理未插卡、挂载失败、读写失败和空间不足;写日志使用有限缓存和保留策略。
- 扬声器、麦克风:先对齐采样率、位宽和通道,再检查缓冲区耗尽、欠载与溢出。
- 摄像头:先单帧,再连续采集;每一帧明确何时借出、显示、归还。
BSP 支持项和示例随版本变化,使用 CoreS3 BSP examples 所列入口检查,不假定板上有某芯片就一定有当前库的完整支持。
算一笔缓冲区账
如果按 320 × 240、RGB565、每像素 2 字节保存完整画面,一帧为 153600 字节,双缓冲为 307200 字节。这是格式和尺寸得出的理论像素数据量,不包括控件、对齐、驱动和其他内存。
降低刷新区域、使用合适缓冲策略往往比直接提高任务优先级更有效。摄像头帧尺寸和像素格式变化时,需要重新计算。
过关标准:能解释一帧数据从谁那里产生、由谁持有、经什么总线发送、何时允许复用;能描述显示失败与传感器失败的不同表现。