ModusToolbox 實戰入門 - PSOC C3 GPIO應用篇

關鍵字 :PSOC 控制、ModusToolbox、英飛凌

摘要

 

新一代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 數位周邊以及固定功能周邊。


gpio_cpu_dm_block_diagram

在每一種模式下,從引腳(Pin)視角看出去的簡化版輸出驅動器結構圖。


gpio_periio_dm_block_diagram
 

高阻抗 (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 就會進入超省電模式,等待下一次按鈕喚醒。
 

整個流程總結

 

  1. 初始化按鈕中斷 → 允許中斷進入。
  2. MCU主程式閒置等待。
  3. 點擊按鈕 → 中斷來了 → 軟體將 gpio_intr_flag 設定為 true。
  4. 主程式偵測到 gpio_intr_flag,切換 LED 閃爍速度。
  5. LED閃四次。
  6. 閃完後 MCU 進入深度睡眠,等待下一次喚醒。

 

結論

 

透過本範例,我們展示了PSOC Control C3 MCU在低功耗模式下,利用GPIO中斷喚醒CPU並即時執行ISR的能力。這種設計方式有效結合了系統能耗管理與高即時性需求,特別適合應用於HVAC與熱泵設備中需長時間待機、但能迅速回應外部事件的場景。PSOC Control C3不僅提供強大的運算性能與豐富的馬達控制功能,其在低功耗運行與靈活中斷管理方面也展現了出色的設計靈活性。結合ModusToolbox™的開發資源,開發者可以更快速地導入類似的低功耗中斷應用,加速產品開發流程,同時滿足現代化HVAC系統對性能、功耗與即時性的嚴格要求。

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

參考來源

:

評論