小ピンマイコンの酷暑(3) CH32V003、外部端子から割り込みをかけてみる

Joseph Halfmoon

酷暑にもめげず、RISC-V搭載の超お求めやすい32ビットマイコンCH32V003を触っています。今回はGPIO端子から割り込みをかけてみます。Arduino IDE環境での作業なので「いつものやり方でOK」かというと微妙に違うんだこれが。前回のようにCH32V用の低レベルなAPIを呼びだす必要はないのですが。

attachInterrupt()

Arduino環境にて外部端子からの割り込み受けをする場合、ユーザーの割り込みハンドラ(割り込み時にコールバックされる関数)は、attachInterrupt()関数で事前に登録しておくことになります。すると割り込み発生時に「ホンモノの」割り込みハンドラから呼び出して貰えます。attachInterrupt()関数の詳細については、御本家 arduino.cc の以下のページに書かれております。

attachInterrupt()

しかしね、CH32V003向けにコードを書いてみたらば以下の如し。

    1. attachInterrupt()という名のAPIは存在する
    2. しかし、その引数は上記ページで説明されている Arcuinoの標準APIとは異なる。ぶっちゃけ引数が2個ばかり多いのよ。
実験に使ったソース

attachInterrupt()関数の引数が多い様子を観察するために書いたコードが以下に。とっても手抜きで超短縮なコードです。以下ソースを実機に書き込んで動作させると、

    • PC4端子(8ピンパッケージでは7番端子)に接続したプッシュボタン(プルアップ抵抗付)を押すとフォーリングエッジで割り込みが発生。
    • 割り込みハンドラ内でPD6端子に接続しているLEDを点灯。
    • 上記とはまったく無関係なタイミング、毎5秒置きにPD6端子のLEDは消灯。

ということになります。ボタンを押すとタイミングにより0~5秒のLED点灯が発生するので、割り込みがかかったことが分かる、というだけのコードです。

void workIsr() {
    digitalWrite(PD6, HIGH);
}

void setup() {
  pinMode(PD6, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(PC4), GPIO_Mode_IN_FLOATING, workIsr, EXTI_Mode_Interrupt, EXTI_Trigger_Falling);
}

void loop() {
  delay(5000);
  digitalWrite(PD6, LOW);
}
attachInterruptの引数

御本家版ではattachInterruptの引数は以下の3つです。

    1. ピン番号
    2. ユーザハンドラの関数ポインタ
    3. 割り込みトリガのモード(立下りなど)

しかし、CH32V003版では以下に引用させていただく関数プロトタイプのようになっとります。

void attachInterrupt(uint32_t pin, GPIOMode_TypeDef io_mode, void (*callback)(void), EXTIMode_TypeDef it_mode, EXTITrigger_TypeDef trigger_mode);
    1. ピン番号
    2. 上記ピンのGPIOの設定モード
    3. ユーザハンドラの関数ポインタ
    4. 割り込み/イベントの種別
    5. 割り込みトリガのモード(立下りなど)

違いの部分を見ていきます。

まず上記の2番目のモードは、御本家版ではpinMode()関数で別途指定しておくスタイルです。CH32V003版では別途のpinModeは不要、プルアップ付きのINPUTにしろ、とかこの関数一つで指定可能です。今回は外付けのプルアップ抵抗つけてあるので、素の入力、GPIO_Mode_IN_FLOATINGとしてあります。

つづく違いは4番目です。CH32V003では、割り込みとは別にイベントというカテゴリがあります。これはチップが寝ているときに叩き起こすための「目覚まし」イベントとしての利用を想定しているようです。フツーの割り込みなのか、Wake-up用のイベントなのかを4番目の引数で指定しないとなりません。上記の実験コードではフツーの割り込み指定です。

動作確認

上記の実験コードをArduino IDEでビルド後、実機に書き込んだところが以下に。ブレッドボードの右下にあるのが、プッシュスイッチです。おもむろにこのボタンを押すと、上の方のLEDが点灯します。点灯したら様子を見守ると最大5秒間くらい点灯してから消灯します。

CH32V_EXTINTR_BBa

予定どおりの動きだけれどもまどろっこしいな5秒。

小ピンマイコンの酷暑(2) CH32V003、8ピンマイコンのSYSCLKを外部出力 へ戻る

小ピンマイコンの酷暑(4) CH32Vのモデル?STM32のタイマを使ってみる へ進む