PSoC でGPIO割り込みを使うときの手順

度忘れるので、いまさらながらメモっとく。

  1. Pinout の設定で、割り込みをかけたいポートの Interrupt を DisableInt 以外にする
  2. lib/PSoCGPIOINT.asm の59行目あたりに下記を追加

    ;---------------------------------------------------
    ; Insert your custom code below this banner
    ;---------------------------------------------------
    ljmp _GPIO_INT                                         // added
    


  3. main.c の main() 関数の先頭に下記を追加

    M8C_EnableGInt ;                             // <--- これはもともとあるので、アンコメントする
    M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO);  // <--- 追加
    


  4. main.c に #pragma ディレクティブと割り込みハンドラを追加

    #pragma interrupt_handler GPIO_INT
    void GPIO_INT(void)
    {
        // do something
    }
    


注意点としては、

  • lib/PSoCGPIOINT.asm に追加した ljmp のジャンプ先ラベル名
  • #pragma ディレクティブで指定したシンボル名
  • 割り込みハンドラの関数名

が一致していないと割り込みが入らないこと。

ちなみに、F6(Generate / Build Project) とか Ctrl+F6(Generate Configuration Files) とかすると、lib 内のファイルは再生成されるので、lib/PSoCGPIOINT.asm に変更を加えるタイミングによっては変更前の状態に上書きされることもある。割り込みが入らないときは、もう一度 lib/PSoCGPIOINT.asm をチェックするのもいいかもしれない。