摘要
新一代HVAC与热泵系统需要同时满足高性能、强安全性与快速上市的挑战。Infineon推出的PSOC Control C3 MCU微控制器整合了180MHz Arm® Cortex®-M33核心、CORDIC加速器、高速12Msps ADC、多通道比较器与高精度TCPWM模块,专为双电机与功率控制应用优化。内置平台级安全功能(包括TrustZone®与硬件加密单元),并支持OTA固件更新,满足现代设备的安全防护需求。结合ModusToolbox™与HVAC专用参考设计,PSOC Control C3加速设计流程,为OEM提供灵活、可靠且高性能的控制解决方案。
本文将帮助您探索 PSOC™ Control C3 MCU 的架构和开发工具,并向您展示如何使用 Eclipse IDE for ModusToolbox™ 创建您的第一个项目软件,同时展示一个GPIO的示例。通过操作GPIO,您将了解如何使用 ModusToolbox™ 控制 PSOC™ Control 3 MCU。
软件下载与安装
软件版本
ModusToolbox™ 软件3.4或以上。
要使用 ModusToolbox™ 访问不断增加的 PSOC™ Control C3 代码示例,请访问GitHub网站。
本文所使用的EVK为KIT_PSC3M5_EVK,详细可参考KIT_PSC3M5_EVK 。
本文开始
1. 点击File→New→ModusToolBox™ Application
2. 选择KIT_PSC3M5_EVK
3. 其中有许多的示例,以下创建一个 Empty App 作为示例
4. 新增完成后,可以在项目资源管理器中看到创建的Empty_App项目。同时,右侧窗口会展示Readme.md文件,介绍该示例的使用方法。
5. 点击Empty_App
6. 在下面的快速面板上会看到许多选项,点击最下面的Device Configurator 5.30。
7. 进入到PSOC™ Control C3的外设设置页面,如下,选择勾选 Port2→P2[0]。在右侧的参数栏中,可以配置此GPIO的许多选项,详细信息可点击 Configuration Help 的 Open GPIO Documentation 查看。
8. 就GPIO的驱动模式而言,PSOC™ Control C3有非常多的设置。
这里有八种主要的驱动模式。下面的图示是针对 CPU 寄存器、UDB/DSI 数字外设以及固定功能外设。
在每一种模式下从引脚 (Pin) 视角看出去的简化版输出驱动器结构图。
高阻抗 (High-Impedance):这是标准的高阻抗(HI-Z)状态,建议用于模拟和数字输入。对于数字信号来说,输入缓冲器是开启的;对于模拟信号来说,输入缓冲器通常会关闭,以便在低功耗设计中减少栓流(crowbar current)和漏电流(leakage)。为了达到最低的芯片电流,未使用的 GPIO 必须设置为高阻抗模式且输入缓冲器关闭。输入缓冲器关闭的高阻抗模式也是引脚默认的复位状态。
电阻式上拉(Resistive Pull-Up)或电阻式下拉(Resistive Pull-Down):电阻模式会在其中一种数据状态时提供串联电阻,在另一种状态时提供强驱动。这些模式下的引脚可以用来作为数字输入或数字输出。如果需要电阻式上拉,就需要将该引脚的数据寄存器 (Data Register) 位写入 '1'。如果需要电阻式下拉,就需要将该引脚的数据寄存器写入 '0'。连接机械开关是这些驱动模式常见的应用。电阻模式也用于连接 PSoC 和开漏 (open drain) 的驱动线路。当输入是开漏低电平时会用到电阻式上拉,而当输入是开漏高电平时会用到电阻式下拉。
开汲极驱动 High(Open Drain Drives High)和开汲极驱动 Low(Open Drain Drives Low):开漏极模式会在其中一种数据状态时提供高阻抗,在另一种状态时提供强驱动。这些模式下的引脚可以作为数字输入或输出,非常实用。因此,这些模式被广泛应用于双向数字通信。当信号被外部下拉时,会使用开漏极驱动 high 模式;当信号被外部上拉时,会使用开漏极驱动 low 模式。开漏极驱动 low 模式常见的应用是驱动 I2C 总线的信号线。
强驱动 (Strong Drive):强驱动模式是引脚标准的数字输出模式;它能够在高电平和低电平两种状态下都提供强大的CMOS输出驱动力。正常情况下,强驱动模式的引脚不应该用作输入。这种模式通常用于输出数字信号或驱动外部设备。
电阻式上拉和电阻式下拉(Resistive Pull-Up and Resistive Pull-Down):在电阻式上拉和下拉模式下,GPIO 在逻辑 1 和逻辑 0 的输出状态都会有串联电阻。高数据状态会被上拉,而低数据状态会被下拉。当引脚被其他可能导致短路的信号驱动时,这种模式就非常有用。
9. 因为KIT_PSC3M5_EVK的SW4开关连接到P5.0,且LED Blue连接到P8.5。
所以在设备配置器的参数配置如下,
10. 配置完成后,ModusToolbox™尚未生成代码,需要在Launches下点击“Generate Launches for Empty_App”。完成后可以通过bsps→config→GeneratedSource查看。
12. 接下来主程序的部分可以按照以下顺序进行设置
#define GPIO_INTERRUPT_PRIORITY 7
#define DELAY_SHORT_MS (250) /* 毫秒 */
#define DELAY_LONG_MS (500) /* 毫秒 */
#define LED_BLINK_COUNT (4)
/* 初始化用户按钮 */
Cy_GPIO_Pin_SecFastInit(CYBSP_USER_BTN_PORT, CYBSP_USER_BTN_PIN, CY_GPIO_DM_PULLUP, 1UL, HSIOM_SEL_GPIO);
/* 配置GPIO5.0中断向量 */
Cy_SysInt_Init(&intrCfgBTN, BTN_interrupt_handler_PDL);
NVIC_EnableIRQ(ioss_interrupts_sec_gpio_5_IRQn);
/* 启用全局中断 */
__enable_irq();
for (;;)
{
/* 检查中断状态 */
if (true == gpio_intr_flag)
{
gpio_intr_flag = false;
/* 更新LED切换延迟 */
if (DELAY_LONG_MS == delay_led_blink)
{
delay_led_blink = DELAY_SHORT_MS;
}
else
{
delay_led_blink = DELAY_LONG_MS;
}
}
/* LED闪烁四次 */
for (count = 0; count < LED_BLINK_COUNT; count++)
{
Cy_GPIO_Write(CYBSP_USER_LED_PORT, CYBSP_USER_LED_PIN, CYBSP_LED_STATE_ON); /* LED 开 */
Cy_SysLib_Delay(delay_led_blink);
Cy_GPIO_Write(CYBSP_USER_LED_PORT, CYBSP_USER_LED_PIN, CYBSP_LED_STATE_OFF); /* LED 关 */
Cy_SysLib_Delay(delay_led_blink);
}
/* 进入深度睡眠模式 */
Cy_SysPm_CpuEnterDeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT);
}
中断子程序
static void BTN_interrupt_handler_PDL()
{
/* 清除引脚中断逻辑。需要清除以检测下一个中断 */
Cy_GPIO_ClearInterrupt(CYBSP_USER_BTN_PORT, CYBSP_USER_BTN_PIN);
gpio_intr_flag = true;
}
示例说明
为什么使用 Cy_GPIO_Pin_SecFastInit?
- 比一般的 Cy_GPIO_Init() 更快,省略一堆参数,只适合单纯 GPIO用途。
- 针对一些简单的 pin(如按钮、LED)快速设置,使代码更短。
/* 初始化用户按钮 */
Cy_GPIO_Pin_SecFastInit(CYBSP_USER_BTN_PORT, CYBSP_USER_BTN_PIN, CY_GPIO_DM_PULLUP, 1UL, HSIOM_SEL_GPIO);
设置 GPIO5.0 的中断
- Cy_SysInt_Init():
设置一个中断向量 (interrupt vector)把 intrCfgBTN(一个设置结构)传进去。
里面会包含要连接哪一个硬件中断源,触发时调用哪个中断处理函数(BTN_interrupt_handler_PDL)。 - Cy_SysInt_Init():
设置一个中断向量 (interrupt vector),把 intrCfgBTN(一个设置结构)传进去。
里面会包含要连接哪一个硬件中断源,触发时调用哪个中断处理函数(BTN_interrupt_handler_PDL)。 -
NVIC_EnableIRQ():
打开 NVIC(嵌套向量中断控制器)中对应 GPIO5.0 的中断。
ioss_interrupts_sec_gpio_5_IRQn 这个 IRQ 是与 GPIO port 5 的某个 pin(比如 5.0)连接的。
/* 配置 GPIO5.0 中断向量 */
Cy_SysInt_Init(&intrCfgBTN, BTN_interrupt_handler_PDL);
NVIC_EnableIRQ(ioss_interrupts_sec_gpio_5_IRQn);
打开全局中断
- __enable_irq() 是 ARM Cortex-M CPU 的指令。
- 它会打开 CPU 接收任何中断信号。
切换 LED 闪烁速度
/* 更新LED切换延迟 */
if (DELAY_LONG_MS == delay_led_blink)
{
delay_led_blink = DELAY_SHORT_MS;
}
else
{
delay_led_blink = DELAY_LONG_MS;
}
- delay_led_blink 是一个变量,存储当前 LED 闪烁的时间间隔(单位:ms)。
- 如果现在是长时间间隔(慢慢闪),就改成短时间间隔(快速闪)。
- 如果是短的,就改回长的。
这样每按一次按钮,LED闪烁速度会切换快/慢。
让 LED 闪烁四次
/* LED闪烁四次 */
for (count = 0; count < LED_BLINK_COUNT; count++)
{
Cy_GPIO_Write(CYBSP_USER_LED_PORT, CYBSP_USER_LED_PIN, CYBSP_LED_STATE_ON); /* LED亮 */
Cy_SysLib_Delay(delay_led_blink);
Cy_GPIO_Write(CYBSP_USER_LED_PORT, CYBSP_USER_LED_PIN, CYBSP_LED_STATE_OFF); /* LED灭 */
Cy_SysLib_Delay(delay_led_blink);
}
- LED_BLINK_COUNT 通常为 4,表示需要闪烁 4 次。
- Cy_GPIO_Write() 控制 GPIO 的电平,高低切换让 LED 亮/灭。
- Cy_SysLib_Delay() 是阻塞式的延迟,单位是毫秒(ms)。
这里就是「闪烁四次 LED,间隔时间取决于刚刚按钮切换后的新延迟」。
进入 Deep Sleep
/* 进入深度睡眠模式 */
Cy_SysPm_CpuEnterDeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT);
- 这行让 MCU进入 Deep Sleep 模式,节省功耗。
- CY_SYSPM_WAIT_FOR_INTERRUPT 代表:只要有中断(例如按钮按下),就可以唤醒 CPU。
闪完 4 次 LED 之后,MCU 就进入超省电模式,等待下一次按钮唤醒。
整个流程总结
- 初始化按钮中断 → 允许中断进入。
- MCU主程序空闲等待。
- 点击按钮 → 中断来了 → 软件将 gpio_intr_flag 设置为 true。
- 主程序检测到 gpio_intr_flag,切换 LED 闪烁速度。
- LED闪四次。
- 闪完后 MCU 进入深度睡眠,等待下一次唤醒。
结论
通过本示例,我们展示了PSOC Control C3 MCU在低功耗模式下,利用GPIO中断唤醒CPU并实时执行ISR的能力。这种设计方式有效结合了系统能耗管理与高实时性需求,特别适合应用于HVAC与热泵设备中需长时间待机、但能迅速响应外部事件的场景。PSOC Control C3不仅提供强大的计算性能与丰富的电机控制功能,其在低功耗运行与灵活中断管理方面也展现了出色的设计灵活性。结合ModusToolbox™的开发资源,开发者可以更快速地导入类似的低功耗中断应用,加速产品开发流程,同时满足现代化HVAC系统对性能、功耗与实时性的严格要求。