基于 PIC32CM LS00 的触摸输入与 LED 控制项目总结报告
一、项目介绍
本项目基于 Microchip Technology 推出的 EV41C56A(PIC32CM LS00 Curiosity Nano+ Touch Evaluation Kit)开发板,完成一个最基础但具有代表性的触摸交互应用:通过板载电容式触摸按键控制 LED 的点亮与熄灭。
项目目标如下:
- 实现单次触摸 → LED 点亮
- 再次触摸 → LED 熄灭
- 确保触摸输入稳定,无误触发
- 正确初始化触摸模块(PTC)
虽然功能看似简单,但该项目完整覆盖了触摸外设(PTC)、时钟依赖、GPIO 控制以及 Harmony/MCC 工具链的使用,对于初学者理解 Microchip 触摸方案具有较高实践价值。
二、硬件介绍
本项目主要使用以下硬件资源:
1. 主控开发板:EV41C56A
- MCU:PIC32CM5164LS00048(基于 ARM Cortex-M23 内核)
- 内置 PTC(Peripheral Touch Controller)触摸控制器
- 支持 TrustZone 安全架构
- 低功耗设计
2. 板载资源
- 电容触摸按键(连接至 PA22)
- LED 指示灯(连接至 PA15)
- USB 调试接口(Curiosity Nano)
3. 关键外设说明
PTC(触摸控制器)
PTC 是 Microchip 提供的硬件级电容触摸解决方案,能够实现:
- 按键(Button)
- 滑条(Slider)
- 滚轮(Wheel)
本项目仅使用单个 Button。
RTC(实时时钟)
触摸模块依赖 RTC 作为时间基准(用于采样周期),这一点是本项目调试的关键难点之一。
三、方案设计与整体架构
1. 系统框图
+----------------------+
| PIC32CM MCU |
| |
| +---------------+ |
Touch->| | PTC模块 | |
(PA22) | +---------------+ |
| | |
| touch_process() |
| | |
| get_sensor_state() |
| | |
| 控制逻辑判断 |
| | |
| +---------------+ |
| | GPIO控制LED | |
| +---------------+ |
| (PA15) |
+----------------------+
2. 设计思路
系统采用典型的“输入-处理-输出”模型:
- 输入:触摸按键(PTC采样)
- 处理:触摸状态判断
- 输出:LED 控制
核心逻辑流程:
- 初始化系统(包含 RTC + PTC + GPIO)
- 周期调用
touch_process()更新触摸状态 - 读取触摸状态
- 控制 LED 开关
四、软件设计与开发过程
1. 开发工具
- MPLAB X IDE
- MPLAB Harmony v3
- MCC(Microchip Code Configurator)
2. 软件配置流程
(1)添加 Touch Library
通过 MCC 添加:
- 选择 Touch Library
- 启用 Touch Configuration 插件

(2)配置触摸按键
- 类型:Button

- 引脚:PA22(根据原理图)

(3)配置 LED 引脚
- GPIO:PA15
- 命名:LED
⚠️ 注意:触摸引脚已由 Touch Library 接管,不能重复配置。

3. 关键问题:RTC 初始化顺序
在调试过程中遇到一个关键问题:
👉 触摸功能始终无法正常工作
最终定位原因:
MCC 自动生成代码中,RTC 初始化在
touch_init()之后执行
但实际情况是:
Touch 模块依赖 RTC 提供时间基准
解决方案:
手动调整初始化顺序:
RTC_Initialize();
touch_init();
这个问题卡了较长时间,最终通过社区交流解决。
4. 主程序流程
主程序结构如下:
uint8_t key_status0 = 0;
uint8_t key_down_flag = 0u;
uint8_t key_updata_flag = 0u;
while (true)
{
touch_process(); // update touch state
if(measurement_done_touch == 1u) {
measurement_done_touch = 0u;
key_status0 = get_sensor_state(0) & 0x80;
if (0u != key_status0) {
if (key_updata_flag == 0) key_down_flag = 1;
} else {
if (key_down_flag == 1) {
key_down_flag = 0;
key_updata_flag = 1;
}
}
}
if (key_updata_flag == 1) {
key_updata_flag = 0;
GPIO_PA15_Toggle(); // toggle LED on a new touch press
}
}
5. 软件流程图
系统启动
↓
SYS_Initialize()
↓
RTC 初始化(手动调整)
↓
Touch 初始化
↓
进入主循环
↓
touch_process()
↓
读取触摸状态
↓
是否被触摸?
↓
翻转LED
↓
循环执行
五、功能展示与效果说明
1. 功能表现
操作 | LED 状态 |
|---|---|
初始状态 | 熄灭 |
手指触摸 | 点亮 |
再次触摸 | 熄灭 |
2. 实际效果
- 响应迅速(毫秒级)
- 无明显抖动
- 无误触发
- 触摸体验良好

六、项目难点与解决方法
难点一:触摸无响应
现象:
- LED 无法响应触摸
原因:
- RTC 初始化顺序错误
解决:
- 手动调整 RTC 初始化顺序
七、优化方向
1. 增加去抖处理
- 软件滤波
- 状态机处理
1. 低功耗优化
- 使用 sleep 模式
- 触摸唤醒
八、心得体会
1. 工具不是万能的
MCC 虽然大大提高开发效率,但:
- 自动生成代码不一定正确
- 必须理解底层原理
👉 这次 RTC 初始化问题就是典型案例
2. 多查资料 + 多交流
本次问题最终通过社区解决:
- 群友经验非常重要
- 官方 demo 也很关键
3. 触摸方案比想象复杂
原本以为触摸只是“读取一个IO”,但实际涉及:
- 电容采样
- 时间基准(RTC)
- 滤波算法
4. Microchip 生态特点
优点:
- 工具链完整(MCC + Harmony)
- 触摸方案成熟
缺点:
- 学习曲线较陡
- 自动生成代码“黑盒”较多
九、总结
本项目成功实现了:
✅ 触摸按键控制 LED
✅ 正确初始化 PTC 模块
✅ 系统稳定运行,无误触发
并解决了关键问题:
👉 RTC 与 Touch 初始化依赖问题
该项目虽然简单,但完整覆盖了:
- 外设初始化
- 工具链使用
- 调试分析能力
对于后续开发更复杂触摸应用(滑条、UI交互)具有良好的基础。