摘要
新一代HVAC與熱泵系統需要同時滿足高性能、強安全性與快速上市的挑戰。Infineon推出的PSOC 控制 C3 微控制器微控制器整合了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 C3 MCU。
軟體下載與安裝
軟體版本
ModusToolbox™ 軟體3.4或以上。
要使用 ModusToolbox™ 存取不斷增加的 PSOC™ Control C3 程式碼範例,請造訪GitHub網站。
本文所使用的EVK為KIT_PSC3M5_EVK,詳細可參考KIT_PSC3M5_EVK 。
本文開始
1. 點擊「檔案」→「新增」→「ModusToolBox™ 應用程式」
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,間隔時間取決於剛剛按鈕切換後的新延遲」。
進入深度睡眠
/* 進入深度睡眠模式 */
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系統對性能、功耗與即時性的嚴格要求。
評論