Funpack5-2 - 基于EV41C56A实现触摸控制LED
该项目使用了EV41C56A,实现了触摸输入与LED控制的设计,它的主要功能为:触摸输入与LED控制。
标签
嵌入式系统
Funpack活动
开发板
电子烂人
更新2026-06-30
13



PIC32CM5164 TrustZone 安全触摸项目

1. 项目介绍

本项目是基于 Microchip PIC32CM5164LS00048 微控制器的 TrustZone 安全触摸按键方案,实现了一个带安全隔离的触摸感应应用。

项目信息

说明

芯片

PIC32CM5164LS00048 (ARM Cortex-M23 + TrustZone)

主频

12 MHz

开发环境

MPLAB X IDE + XC32 编译器

核心功能

自电容式触摸感应 + TrustZone 安全隔离

安全特性

安全世界/非安全世界隔离,非安全调用入口



2. 硬件介绍

2.1 微控制器 (PIC32CM5164LS00048)

  • 内核: ARM Cortex-M23 (32-bit)
  • Flash: 512 KB
  • SRAM: 64 KB
  • 工作电压: 1.8V ~ 3.6V
  • 封装: 48-pin LQFP

2.2 外设资源

外设

用途

所在

PTC (触摸感应)

自电容触摸检测

非安全

RTC

触摸测量定时触发

非安全

SERCOM3 (USART)

调试串口通信

非安全

PORT (PA15)

LED 控制输出

安全

GCLK

系统时钟管理

安全

EVSYS

事件系统

非安全

NVMCTRL

Flash 控制

安全

2.3 硬件连接

     PIC32CM5164LS00048

PA15 (BTN_LED) ───── LED
PTC (Y23/Y16) ───── 触摸
SERCOM3 (TX) ───── USBTTL (调试)
SERCOM3 (RX)




3. 方案框图和设计思路

3.1 系统架构

image.png

3.2 设计思路

  1. 安全隔离: 通过 ARM TrustZone 将系统分为安全和非安全
  2. 触摸检测: 采用 QTouch 库的自电容模式 (NODE_SELFCAP_SHIELD),带频率跳变抗干扰
  3. 定时触发: 使用 RTC Timer0 产生 20ms 周期中断触发触摸测量
  4. 状态显示: 触摸按键检测到触摸时点亮 PA15 上的 LED
  5. 回调机制: 使用 cmse_nonsecure_entry 属性暴露安全 API 给非安全世界调用




4. 调试软件、软件流程图及关键代码

4.1 调试工具

软件

用途

MPLAB X IDE

项目管理、编译、调试

MPLAB PICkit 4

烧写和调试

Data Visualizer

触摸数据可视化 (QTouch Tunes)

Serial Terminal

USART 调试输出 (如 PuTTY)

4.2 主程序流程图

image.png

image.png

4.3 触摸处理详细流程代码调用


4.5 关键代码

主入口 (main.c:39-68):

int main(void)
{
uint32_t msp_ns = *((uint32_t *)(TZ_START_NS));
volatile funcptr_void NonSecure_ResetHandler;

SYS_Initialize(NULL); // 初始化所有模块

if (msp_ns != 0xFFFFFFFF) {
__TZ_set_MSP_NS(msp_ns); // 设置非安全栈
// 获取非安全复位向量并跳转
NonSecure_ResetHandler = (funcptr_void)(*((uint32_t *)((TZ_START_NS) + 4U)));
NonSecure_ResetHandler();
}

while (1) {
touch_process();
if (measurement_done_touch == 1)
touch_status_display1(); // 触摸状态显示
}
}

触摸状态显示 (main.c:71-80):

void touch_status_display1(void)
{
uint8_t key1 = get_sensor_state(0) & KEY_TOUCHED_MASK;
if (key1 != 0)
BTN_LED_Set(); // PA15 输出高,点亮 LED
else
BTN_LED_Clear(); // PA15 输出低,熄灭 LED
}

触摸传感器配置 (touch.c:170-194):

static touch_ret_t touch_sensors_config(void)
{
touch_ret_t touch_ret = TOUCH_SUCCESS;

// 初始化采集模块
touch_ret = qtm_ptc_init_acquisition_module(&qtlib_acq_set1);
touch_ret = qtm_ptc_qtlib_assign_signal_memory(&touch_acq_signals_raw[0]);

// 使能并校准每个节点
for (sensor_nodes = 0; sensor_nodes < DEF_NUM_CHANNELS; sensor_nodes++) {
touch_ret = qtm_enable_sensor_node(&qtlib_acq_set1, sensor_nodes);
touch_ret = qtm_calibrate_sensor_node(&qtlib_acq_set1, sensor_nodes);
}

// 初始化按键
for (sensor_nodes = 0; sensor_nodes < DEF_NUM_SENSORS; sensor_nodes++) {
touch_ret = qtm_init_sensor_key(&qtlib_key_set1, sensor_nodes,
&ptc_qtlib_node_stat1[sensor_nodes]);
}
return touch_ret;
}

安全世界非安全调用入口 (nonsecure_entry.c:44-46):

int __attribute__((cmse_nonsecure_entry)) secure_add(int x, int y)
{
return (x + y); // 安全 API 示例
}




5. 功能展示图及说明

5.1 功能描述

功能

说明

触摸检测

自电容式触摸传感器,Y23/Y16 电极

频率跳变

3 频点自动跳变 (FREQ_SEL_0/1/2),抗工频干扰

LED 反馈

PA15 连接 LED,触摸时点亮

TrustZone 隔离

安全世界运行主循环,非安全世界运行触摸采集

5.2 触摸配置参数

#define DEF_NUM_CHANNELS       1u    // 1 个采集通道
#define DEF_NUM_SENSORS 1u // 1 个按键
#define DEF_SENSOR_TYPE NODE_SELFCAP_SHIELD // 自电容屏蔽模式
#define DEF_TOUCH_DET_INT 4u // 触摸去抖 4 次确认
#define DEF_TOUCH_MEASUREMENT_PERIOD_MS 20u // 20ms 测量周期
#define NUM_FREQ_STEPS 3u // 3 频点跳变
#define KEY_TOUCHED_MASK 0x01 // 触摸状态掩码

5.3 功能展示
按下触摸按键,灯亮起\熄灭



6. 项目中遇到的难题及解决方法

6.1 环境部署困难

本编译烧录环境特别难部署,靠参考官网WIKI以实现

如何使用 MPLAB® 代码配置器(MCC)Harmony - 开发者帮助创建基于 TrustZone® 的触摸项目

6.2 触摸灵敏度不足

问题: 手指触摸时检测不到状态变化

解决: 调整触摸参数:

// 降低阈值,提高灵敏度
#define KEY_0_PARAMS { 20u, HYST_25, NO_AKS_GROUP }
// 原始值较大,改为 20


7. 心得体会

  1. TrustZone 边界管理: 使用 cmse_nonsecure_entry  cmse_nonsecure_call 属性标记边界函数是关键,编译器会自动生成 veneer 代码
  2. 触摸调参经验: 自电容触摸需要根据 PCB 走线调整 CSD (Charge Share Delay) 和滤波等级,FILTER_LEVEL_16 对大多数场景已足够


附件下载
microchip.zip
代码文件
团队介绍
个人项目
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号