任务介绍
本项目实现了Funpack活动PIC32CM LS00 Curiosity Nano + Touch Evaluation Kit板卡的自命题任务,基于PIC32CM LS00开发板的板载PTC触摸按键,结合TCC0定时器的PWM输出功能,实现了对板载LED灯的开关控制与亮度调节。用户可通过短按触摸键切换LED开关状态,长按触摸键则触发亮度自动渐变调节,串口同步输出当前操作日志。
硬件平台
本次使用Microchip推出的PIC32CM LS00 Curiosity Nano + Touch Evaluation Kit开发板,是一款面向低功耗安全嵌入式开发的综合评估平台。该开发板搭载了基于ARM Cortex-M23内核的PIC32CM LS00系列MCU,具备TrustZone安全隔离特性,片上集成PTC(外设触摸控制器)、TCC定时器/计数器、RTC实时时钟、SERCOM多功能串行接口等丰富外设,非常适合用于触摸交互与低功耗控制场景的原型开发。开发板集成了板载调试器(PKOB Nano)、USB接口、用户可编程LED与PTC触摸电极,便于快速验证触摸感应与PWM驱动功能。
在软件方面,本项目基于MPLAB Harmony v3框架进行开发,使用MCC(MPLAB Code Configurator)完成外设图形化配置,并在裸机(Bare-metal)环境下实现主循环驱动的触摸检测与PWM亮度控制。

主控设备:Microchip PIC32CM LS00 Curiosity Nano开发板
- 搭载PIC32CM LS00 MCU(ARM Cortex-M23,支持TrustZone)
- 集成板载PKOB Nano调试器与USB接口
- 板载用户可编程LED(PA15,由TCC0 WO5驱动)
- 板载PTC触摸电极(PA22,Y16信号)
- 支持Harmony v3 + MCC图形化外设配置
核心外设资源
- TCC0:PWM模式,驱动LED亮度控制,PWM频率2500 Hz
- PTC:外设触摸控制器,采集触摸按键状态
- RTC:为Touch Library提供定时基准
- SERCOM3:UART模式,用于串口调试输出
任务分析与实现
本系统实现了基于PTC触摸感应与TCC0 PWM输出的LED调光控制平台,主要功能包括:
两路交互通道:
- 触摸输入采集
- 触摸扫描周期:2ms轮询(主循环节拍)
- 支持短按(开关)与长按(调光)两种操作模式
- 长按判定阈值:500个扫描周期(约1秒)
- LED PWM亮度控制
- PWM频率:2500 Hz,周期值:2400(代码中
PWM_PERIOD_VALUE = 2399u) - 亮度调节步进:5%,调节间隔:20个扫描周期
- 亮度范围:0%(熄灭)~100%(全亮),支持自动往返渐变
- PWM频率:2500 Hz,周期值:2400(代码中
方案框图:
工程配置过程
本项目基于MPLAB Harmony v3框架,借助MCC(MPLAB Code Configurator)完成所有外设的图形化配置,以下详细描述关键配置流程与核心要点。
一、外设配置前的准备
1. 硬件环境
- 主控芯片:Microchip PIC32CM LS00(ARM Cortex-M23,TrustZone)
- 开发板:PIC32CM LS00 Curiosity Nano + Touch Evaluation Kit
- 外设资源:
- TCC0 PWM通道(TCC0_WO5,PA15)用于驱动板载LED
- PTC触摸控制器(PA22,Y16)采集触摸输入
- SERCOM3 UART用于串口调试输出
- RTC为Touch Library提供定时基准
2. 软件环境
- 开发框架:MPLAB Harmony v3
- 配置工具:MPLAB Code Configurator(MCC)
- 编译工具链:XC32编译器
- IDE:MPLAB X IDE
二、MCC外设图形化配置
1. Project Graph 总览
在MCC的Project Graph中完成所有外设模块的连接与配置。本项目使用的核心外设连接关系如下图所示:
- SERCOM3 的UART接口连接至 Secure STDIO,实现串口调试输出
- TCC0 配置为PWM模式,同时提供PWM与TMR两路输出,用于LED亮度控制
- PTC(Acq_Engine)与 RTC(TMR)分别连接至 Touch Library(Peripheral Touch Controller),为触摸检测提供采集引擎和定时基准

上图为MCC Project Graph配置界面,清晰展示了SERCOM3→Secure STDIO、TCC0 PWM、PTC+RTC→Touch Library的外设连接拓扑。
2. TCC0 PWM参数配置
TCC0是驱动板载LED的核心定时器外设,在MCC中将其Operating Mode设置为PWM模式,关键参数配置如下:
- Select PWM Type:DSTOP
- Period Value:2,400(对应代码中
PWM_PERIOD_VALUE = 2399u,即周期计数值) - PWM频率:由MCC自动计算显示为 2500 Hz
- 预分频:No division(不分频,直接使用系统时钟)

上图为TCC0外设配置界面,PWM Type选择DSTOP,Period Value设为2400,MCC实时计算并提示PWM频率为2500 Hz,与代码中PWM_PERIOD_VALUE宏定义保持一致。
在代码中,PWM占空比的换算公式为:
uint32_t compare_value = ((uint32_t)PWM_PERIOD_VALUE * duty_percent) / 100u;
TCC0_PWM24bitDutySet(TCC0_CHANNEL1, compare_value);
通过将亮度百分比(0~100)线性映射至比较寄存器值,实现精确的亮度控制。
3. PTC 触摸按键配置
在MCC的Touch Configuration工具中完成PTC触摸传感器的配置。在Configure → Sensor Pins页面中,为Button 0分配Y信号引脚:
- Sensor:Button 0
- Y-Signals:Y16(PA22)

上图为Touch Configuration工具的Sensor Pins配置界面,Button 0对应的Y信号被分配至Y16(PA22),与开发板Touch Evaluation Kit扩展板的触摸电极物理连接一致。
4. 引脚复用配置(Pin Configuration)
在MCC的引脚配置表中完成关键引脚的功能复用分配:
- PA15(第24号引脚):命名为
LED1_PWM,功能复用为TCC0_WO5,作为PWM输出驱动板载LED - PA22(第31号引脚):功能复用为
PTC_X16/Y16,配置为Analog模式,作为触摸感应输入

上图为引脚配置表,PA15被分配为TCC0_WO5的PWM输出引脚(标注为LED1_PWM),PA22被配置为PTC模拟输入引脚(PTC_X16/Y16),两处引脚复用配置是硬件功能正常运行的基础。
三、软件架构设计
1. 触摸按键有限状态机(touch_key.c)
触摸按键处理模块基于四状态FSM(有限状态机)实现,状态定义如下:
typedef enum {
KEY_IDLE, // 空闲,等待触摸
KEY_PRESSED, // 已按下,判断长短按
KEY_LONG_PRESSING, // 长按持续中,执行调光
KEY_WAIT_RELEASE // 等待释放
} KEY_FSM_STATE;
关键时序参数:
参数 | 宏定义 | 数值 |
长按判定阈值 |
| 500个周期(≈1s) |
调光步进间隔 |
| 20个周期(≈40ms/步) |
短按触发LED_PWM_Toggle(),切换LED开关状态;长按进入KEY_LONG_PRESSING状态,周期性调用LED_PWM_AdjustBrightness(),实现亮度自动往返渐变。
触摸状态通过读取get_sensor_state(0)返回值的最高位(KEY_TOUCHED_MASK = 0x80)判断是否被触摸:
static uint8_t Touch_Key_IsTouched(void)
{
uint8_t state = get_sensor_state(0);
return (state & KEY_TOUCHED_MASK) ? 1u : 0u;
}
2. LED PWM控制模块(led_pwm.c)
LED状态通过结构体LED_STATE集中管理:
typedef struct {
LED_POWER_STATE power; // LED开关状态(LED_ON / LED_OFF)
uint8_t brightness; // 当前亮度百分比(0~100)
BRIGHTNESS_DIR direction; // 调光方向(DIR_UP / DIR_DOWN)
} LED_STATE;
亮度渐变逻辑(LED_PWM_AdjustBrightness())实现了自动往返效果:当亮度递增至BRIGHTNESS_MAX(100%)时,方向切换为DIR_DOWN;递减至BRIGHTNESS_MIN(0%)时,方向切换回DIR_UP,步进幅度为BRIGHTNESS_STEP = 5%。
3. 主循环(main.c)
系统主循环以2ms为节拍,依次执行触摸数据采集与按键状态处理:
while (true)
{
SYSTICK_DelayMs(2);
touch_process(); // PTC触摸数据采集与处理
Touch_Key_Process(); // 触摸按键FSM处理与LED控制
}
系统启动后串口输出操作提示:
================================
PIC32CM LS00 Touch Dimmer
Short press : LED ON/OFF
Long press : Adjust brightness
================================
4. 软件流程图
效果展示

系统上电后,串口终端显示初始化日志,LED默认熄灭。单次轻触板载PTC触摸电极,LED以满亮度(100%)点亮,再次短按则熄灭;持续按压触摸电极超过约1秒后,LED亮度开始以5%为步进自动往返渐变,松开手指后亮度保持在当前值,串口同步打印每次操作的状态信息。
串口输出

遇到的难题与解决办法
问题:PTC触摸检测抖动,短按偶尔被误判为长按
解法
在触摸检测与按键处理过程中,需重点关注以下几点:
- 主循环节拍与Touch Library扫描周期的匹配,本项目将
SYSTICK_DelayMs(2)作为统一节拍,确保touch_process()调用频率稳定 LONG_PRESS_THRESHOLD(500)与BRIGHTNESS_STEP_INTERVAL(20)两个时序参数需根据实际扫描周期综合调整,避免触摸灵敏度与响应延迟之间的矛盾- TCC0 PWM的Period Value与代码中
PWM_PERIOD_VALUE宏定义需保持严格一致(MCC配置2400,代码中2399u),两者差1是因为计数器从0开始,需特别注意
活动感想
通过本项目实践,深入掌握了Microchip PIC32CM LS00平台上PTC触摸控制器与TCC0 PWM外设的联合应用方法,熟悉了MPLAB Harmony v3框架下MCC图形化配置工具的完整使用流程,包括Project Graph外设连接、触摸传感器引脚分配、PWM参数计算以及引脚复用配置。PIC32CM LS00开发板集成的PTC触摸控制器免去了外部触摸IC的成本,配合Touch Library可以快速实现高可靠性的触摸交互功能,令人印象深刻。整个项目过程中,体会到嵌入式系统中硬件配置、底层驱动与应用逻辑需要紧密协作,每一个参数的精细调整都能显著影响用户的实际交互体验。
再次感谢硬禾学堂和得捷电子联合举办的Funpack活动,祝硬禾的活动越办越好!