面向轻薄键盘、折叠键盘与触控键盘,围绕 CMS32W413/CMS32W414 构建 BLE HID、矩阵扫描、电池检测与低功耗控制。本文按工程案例组织方案框图、电路逻辑、开发套件 PCB、固件框架、逻辑引脚规划、参考 BOM、低功耗状态机、编译烧录流程与验证计划。
一 方案定位
移动办公键盘需要在体积、续航和连接可靠性之间取得平衡。CMS32W41x 将 Arm Cortex-M0+ 控制内核与 BLE 无线能力集中于一颗 SoC,可承担按键矩阵扫描、HID 报告生成、无线传输、电量检测以及触摸板、显示屏和状态灯等扩展任务。
二 中微半导低功耗蓝牙键盘方案框图
官方方案框图以 CMS32W41x 为核心:3.6 V 输入经 3.3 V LDO 接入 VBAT;GPIO 连接按键矩阵,ADC 负责电池电压检测;RF 完成 HID 数据收发,IIC、SPI 和 GPIO 分别扩展触摸板、LCD 显示屏与指示灯,UART 用于日志打印。
三 参考电路逻辑说明
电源与去耦
3.6 V 锂电池先进入保护与充电电路,再经 3.3 V LDO 向 VBAT/VDD 供电。LDO 输入端和输出端电容按器件手册选值,SoC 每个电源脚旁布置就近去耦电容。电源回路应短而宽,数字负载与射频部分避免共用狭长回流路径。
按键矩阵扫描
行线由 GPIO 依次输出有效电平,列线作为带上拉的输入。按键闭合后,对应行列形成导通关系;固件以固定周期扫描,并在 10–20 ms 稳定窗口后确认按下或释放。对于可能同时按下多个按键的产品,应根据无冲需求决定是否为矩阵增加隔离二极管。
电池电压采样
电池通过高阻分压接入 ADC,分压下端可并联小电容抑制噪声。为降低分压支路的长期耗电,可用 GPIO 或 MOS 管控制采样通路,仅在测量时导通。分压比例必须保证最高电池电压不会超过 ADC 输入范围。
RF 与天线
RF 引脚经预留 π 型匹配网络接入 50 Ω 馈线,再连接板载天线或外置天线座。天线应位于 PCB 边缘,天线及其前方净空区域不铺铜、不走线、不放器件。最终匹配值需要结合板材、外壳和整机环境实测调整。
扩展与调试接口
触摸板可通过 IIC 连接,SCL/SDA 配置合适的上拉;LCD 可使用 SPI,并预留 CS、DC 和 RESET 控制脚;状态灯或背光由 GPIO/PWM 驱动。SWD 和 UART 建议引出测试点,便于烧录、在线调试和量产日志检查。
四 蓝牙键盘开发套件 PCB
中微半导蓝牙键盘开发套件采用长条异形 PCB,右侧为加宽的主控与安装区域,板上配置主控芯片、晶振、电源器件、调试焊盘和多个结构孔位。长条板形便于贴合键盘内部的狭长空间,也让信号接口沿板边分布。实际设计应以官方开发套件资料和对应型号原理图为准。
| 区域 | 布局重点 | 检查项 |
|---|---|---|
| RF 与天线 | 靠板边、馈线短、预留匹配位 | 50 Ω 阻抗、净空、外壳影响 |
| SoC 与去耦 | 去耦电容贴近电源脚,地回路最短 | 电容值、回流路径、测试点 |
| 键盘矩阵 | 行列线成组引出,避免靠近天线和晶振 | 串扰、ESD、连接器定义 |
| 电源与充电 | 远离天线,热源与敏感模拟线分隔 | 压降、纹波、温升、电池保护 |
| 下载与日志 | 测试点便于探针接触,不占天线净空 | SWD/UART/RESET/GND/3V3 完整 |
五 固件代码参考框架
下面的 C 代码展示“矩阵扫描 → 消抖 → HID 报告 → BLE 发送 → 空闲休眠”的主流程。为了避免混淆,所有硬件和协议接口都以 board_*、ble_hid_* 适配函数表示;接入项目时,应使用中微官方 SDK 中与具体芯片、协议栈版本对应的接口实现这些函数,并补充实际键值表 keymap。
/* CMS32W41x 蓝牙键盘应用框架
* board_* / ble_hid_* 由中微 SDK 与实际 PCB 适配层实现。
*/
#include
#include
#include
#define ROWS 6
#define COLS 10
#define DEBOUNCE_MS 12
#define IDLE_SLEEP_MS 30000U
typedef struct {
uint8_t modifier;
uint8_t reserved;
uint8_t keycode[6];
} hid_keyboard_report_t;
extern void board_init(void);
extern void board_select_row(uint8_t row);
extern uint16_t board_read_columns(void);
extern void board_delay_us(uint32_t us);
extern uint32_t board_millis(void);
extern uint16_t board_battery_adc_mv(void);
extern void board_prepare_sleep(void);
extern void board_enter_deep_sleep(void);
extern bool ble_hid_connected(void);
extern bool ble_hid_send(const hid_keyboard_report_t *report);
extern void ble_process(void);
extern const uint8_t keymap[ROWS][COLS];
static uint16_t stable[ROWS];
static uint16_t candidate[ROWS];
static uint32_t changed_at[ROWS];
static uint32_t last_activity;
static void matrix_scan(uint16_t raw[ROWS])
{
for (uint8_t row = 0; row < ROWS; ++row) {
board_select_row(row);
board_delay_us(30); /* 等待 GPIO 与矩阵线稳定 */
raw[row] = board_read_columns();
}
}
static bool debounce_update(const uint16_t raw[ROWS], uint32_t now)
{
bool changed = false;
for (uint8_t row = 0; row < ROWS; ++row) {
if (raw[row] != candidate[row]) {
candidate[row] = raw[row];
changed_at[row] = now;
} else if (stable[row] != candidate[row] &&
now - changed_at[row] >= DEBOUNCE_MS) {
stable[row] = candidate[row];
changed = true;
}
}
return changed;
}
static hid_keyboard_report_t build_report(void)
{
hid_keyboard_report_t report = {0};
uint8_t count = 0;
for (uint8_t row = 0; row < ROWS && count < 6; ++row) {
for (uint8_t col = 0; col < COLS && count < 6; ++col) {
if (stable[row] & (1U << col)) {
report.keycode[count++] = keymap[row][col];
}
}
}
return report;
}
int main(void)
{
uint16_t raw[ROWS] = {0};
hid_keyboard_report_t last = {0};
board_init();
last_activity = board_millis();
for (;;) {
uint32_t now = board_millis();
matrix_scan(raw);
if (debounce_update(raw, now)) {
hid_keyboard_report_t current = build_report();
if (ble_hid_connected() &&
memcmp(¤t, &last, sizeof current) != 0 &&
ble_hid_send(¤t)) {
last = current;
}
last_activity = now;
}
ble_process();
if (now - last_activity >= IDLE_SLEEP_MS) {
board_prepare_sleep(); /* 配置矩阵按键唤醒和外设低功耗状态 */
board_enter_deep_sleep();
last_activity = board_millis();
}
}
}
示例按 6×10 矩阵设计,可覆盖最多 60 个按键并占用 16 路 GPIO,符合原文“最多 17 个 GPIO”的资源边界。若还要同时连接触摸板、LCD 或更多按键,需要调整矩阵结构、选择其他封装资源,或增加 I/O 扩展器。有效电平、GPIO 上拉、键值表、BLE 参数和睡眠唤醒源必须按实际硬件修改。
六 芯片资源与开发落地
| 项目 | 公开方案信息 | 应用价值 |
|---|---|---|
| 内核 | Arm Cortex-M0+,最高 64 MHz | 完成矩阵扫描、HID 与外设控制 |
| 存储 | Flash 256 KB–512 KB,SRAM 56 KB | 容纳应用、协议功能与升级空间 |
| 电压与温度 | 1.7–5.5 V,−40–85 ℃ | 覆盖便携设备常见供电与环境范围 |
| 接口 | 最多 17 个 GPIO,5 通道 12 位 GPADC | 连接矩阵、电池检测和扩展外设 |
| 安全 | 硬件 AES-128 加密/解密 | 为安全功能提供硬件基础 |
| 维护 | 支持 OTA 无线升级 | 支持固件维护和功能更新 |
中微半导面向该方案提供样品、开发套件、技术文档、SDK 和本地化技术支持。正式立项时,应先确定具体型号与封装,再根据官方数据手册完成引脚、电源、RF 参考设计和 SDK 版本核对,随后进行整机功耗、兼容性、射频性能、ESD 与量产测试。
七 参考项目需求与资源预算
| 项目 | 参考目标 | 工程说明 |
|---|---|---|
| 目标产品 | 60 键以内的便携或折叠蓝牙键盘 | 示例采用 6×10 按键矩阵 |
| 无线协议 | BLE HID,兼容 Windows、Android、iOS | 实际兼容范围需按终端版本测试 |
| 供电 | 单节锂电池,参考框图为 3.6 V 经 3.3 V LDO | 充电、保护和 LDO 按电池规格选型 |
| 低功耗 | 以官方广播、连接与休眠指标为设计基线 | 整机功耗还包含 LDO、分压、LED 与外设 |
| 维护 | 支持日志、SWD 烧录和 OTA | 量产版本需关闭或限制调试入口 |
| 扩展 | 电量显示、多媒体键;触摸板/LCD 选配 | 扩展功能必须重新核算 GPIO 和功耗 |
逻辑引脚规划
| 逻辑信号 | 数量 | 方向与配置 | 物理引脚状态 |
|---|---|---|---|
| ROW0–ROW5 | 6 | GPIO 输出,逐行扫描;休眠时配置为安全电平 | 待具体型号、封装和 PCB 原理图确认 |
| COL0–COL9 | 10 | GPIO 输入,上拉;至少一列配置按键唤醒 | 待具体型号、封装和 PCB 原理图确认 |
| BAT_ADC | 1 | GPADC 输入,经高阻分压采样 | 待 ADC 通道与输入范围确认 |
| RF | 1 | 射频专用脚,经匹配网络连接天线 | 严格采用官方射频参考设计 |
| SWD / UART | 按 SDK 要求 | 烧录、调试和日志 | 待官方开发套件文档确认 |
| IIC / SPI | 选配 | 连接触摸板或 LCD | 6×10 矩阵已占 16 GPIO,需先解决资源冲突 |
此表是逻辑网络规划,不是芯片真实管脚表。没有 CMS32W413/CMS32W414 对应封装的数据手册和官方开发板原理图时,不应填写具体管脚号。
八 参考 BOM 与选型约束
| 位号/模块 | 建议规格 | 数量 | 确认依据 |
|---|---|---|---|
| U1 主控 | CMS32W413 或 CMS32W414,封装与容量按项目确定 | 1 | 官方选型手册和供货情况 |
| U2 LDO | 3.3 V 输出、低静态电流、满足峰值电流 | 1 | 输入范围、压差、稳定电容与休眠电流 |
| 电池保护/充电 | 匹配单节锂电池规格 | 1 组 | 充电电流、温升、安全认证 |
| 晶振/时钟器件 | 频率、负载电容按官方参考设计 | 按方案 | SDK 时钟配置与芯片数据手册 |
| RF 匹配网络 | 预留 π 型 L/C 位,初始值按官方参考 | 1 组 | 整机网络分析仪测试后定值 |
| 电源去耦 | 每个电源脚就近配置,容量按手册 | 若干 | 芯片和 LDO 数据手册 |
| 电池分压 | 高阻电阻加滤波电容,可选受控采样 | 1 组 | ADC 最大输入、误差与待机损耗计算 |
| 矩阵二极管 | 按无冲键需求选配 | 每键或不装 | 目标键盘的多键并发要求 |
| ESD 保护 | 低电容器件,靠近外部接口 | 按接口 | ESD 等级与接口信号带宽 |
正式 BOM 还应包含制造商料号、封装、精度、额定值、生命周期、替代料和成本。表中不填写未经官方资料确认的晶振频率、RF 匹配值和主控管脚,避免把参考原则误当成可投产参数。
九 低功耗状态机
| 状态 | 主要任务 | 功耗控制 | 退出条件 |
|---|---|---|---|
| 广播等待 | 发送可连接广播,等待主机建立连接 | 根据响应速度设置广播间隔,关闭未用外设 | 连接成功或广播超时 |
| 已连接空闲 | 保持 BLE 连接并低频扫描矩阵 | 协商合适连接间隔,减少无变化报告 | 按键、断线或空闲超时 |
| 活动发送 | 消抖、生成并发送 HID 报告 | 发送完成立即返回空闲状态 | 报告确认或发送失败处理 |
| 深度休眠 | 保留必要状态,等待矩阵唤醒 | 关闭日志、ADC、显示与不必要时钟 | 按键或规定的外部唤醒事件 |
| 断线处理 | 清理连接状态并决定是否重广播 | 限制快速重试次数,避免持续高占空比 | 进入广播或休眠 |
十 固件工程结构与编译烧录
| 建议文件 | 职责 |
|---|---|
app_keyboard.c |
应用状态机、矩阵事件和 HID 报告调度 |
board_cms32w41x.c |
GPIO、ADC、时钟、按键唤醒、UART 和 SWD 适配 |
keymap.c |
行列坐标到 HID Usage ID、修饰键和多媒体键的映射 |
hid_report_map.c |
键盘、消费者控制及可选电量服务描述 |
power_manager.c |
空闲判断、外设关断、深度休眠与唤醒恢复 |
ota_service.c |
升级包校验、写入、切换与失败回退 |
- 从中微半导获取与 CMS32W413/CMS32W414 对应的 SDK、编译工具链、示例工程和下载工具。
- 以官方 BLE HID 示例为基线创建工程,记录 SDK、协议栈、编译器和芯片封装版本。
- 根据最终原理图实现代码中的
board_*适配层,并完成 GPIO、ADC、UART 和唤醒源配置。 - 填写
keymap与 HID Report Map,核对普通键、修饰键、多媒体键、按下和释放报告。 - 连接开发套件的 SWD、GND、3V3 和 RESET,先烧录无休眠调试版本,再逐步启用低功耗。
- 量产固件关闭高频日志,固定版本号、校验值、烧录地址和配置区保护策略。
目前页面无法给出真实 SDK 工程名称、下载器型号、Flash 地址和官方 API,因为原软文未包含这些资料。取得官方 SDK 后,应把占位适配函数替换为真实接口,并用一次完整编译和开发板烧录结果作为工程基线。
十一 验证计划与测试记录
| 测试项 | 测试条件 | 记录内容 | 判定 |
|---|---|---|---|
| 矩阵功能 | 逐键、组合键、长按、快速连击 | 漏键、重复键、鬼键和消抖时间 | 按产品键位和无冲规格 |
| 系统兼容 | Windows、Android、iOS 代表机型 | 首次配对、重连、休眠唤醒、多媒体键 | 全部目标系统通过 |
| 连接稳定性 | 近距离、目标距离、复杂 2.4 GHz 环境 | 丢包、断线、重连时间和输入延迟 | 按产品需求书 |
| 功耗 | 关机、深睡、广播、连接空闲、持续输入 | 平均值、峰值、连接参数、测试时长 | 官方指标作芯片基线,整机另行验收 |
| 电池检测 | 满电到欠压的多个电压点 | ADC 原始值、换算误差和电量显示 | 校准后满足产品精度 |
| RF | 裸板及装入最终外壳 | 回波损耗、发射功率、接收灵敏度 | 满足法规与产品指标 |
| 环境与可靠性 | 高低温、静电、跌落、充放电循环 | 复位、死机、误触发和结构损伤 | 按认证及企业标准 |
| OTA | 正常升级、断电、错误包、重复升级 | 成功率、回退与设备可恢复性 | 失败后设备不可变砖 |
十二 工程交付清单与当前边界
| 交付物 | 本案例当前状态 | 进入打样前的要求 |
|---|---|---|
| 方案框图与逻辑说明 | 已提供 | 结合官方原理图复核 |
| PCB 实物参考 | 已提供开发套件图片 | 获取尺寸图、层叠和源文件 |
| 固件框架 | 已提供主流程参考代码 | 替换为真实 SDK API 并编译烧录 |
| 真实原理图和引脚表 | 缺少官方资料,未虚构 | 必须获取并完成 ERC 审查 |
| BOM | 已提供模块级参考表 | 补齐料号、数值、封装和替代料 |
| PCB 生产资料 | 尚无 Gerber、钻孔、坐标和钢网文件 | 完成 DRC、阻抗和可制造性审查 |
| 测试报告 | 已提供验证计划,尚无实测数据 | 在真实样机上记录仪器、条件和结果 |
| 量产资料 | 尚无产测程序和工装定义 | 建立烧录、射频、按键与功耗产测流程 |
因此,这份页面现在可以作为立项评审、方案讲解和开发任务拆分的参考工程案例;在取得官方数据手册、开发板原理图与 SDK,并补齐真实测试数据之前,它仍不能直接用于 PCB 投产。
技术指标及方案框图来源:中微半导低功耗蓝牙键盘方案。量产设计请以 CMS32W413/CMS32W414 数据手册、官方原理图及匹配的 SDK 为准。