InterruptIn (STM32)

(2015.5.20 作成)

(2015.9.22 更新)

(2015.10.24 更新)

 STM32を用いた割り込み処理を行うクラスです。STM32の場合割り込みによって呼び出される関数名が決められていますので、この名前の関数を作成する必要があります。mbedのように複雑な処理を前提とすればどのような関数名でもよくなるのですが、処理としてシンプルではなくなるのであえて関数名はSTマイクロさんの定義のままです。

 ピン0~15それぞれに割り込みを行うことが出来ます。一方注意点もあって、たとえばPA0, PB0などは共通の関数 EXTI0_IRQHandlerが呼び出されますが、Port A, Port Bなどのどれか一つしか割り込みを設定できません。つまりPA0で割り込みを定義するとPB0やPC0で割り込みを行うことが出来ませんので注意してください。

 

コンストラクタ

プロトタイプ

InterupptIn(GPIO_TypeDef* GPIOx,

                    const uint32_t &Pin,

                    const PinPuPdMode &PPmode = No_Pull,

                    const ITmode &ITMode = IT_Rising);

戻り値

なし

引数

GPIO

Port設定

Pin

Pin設定

PPmode

Pull-UP / Pull-Down設定

ITMode

立ち上がり、立下りエッジで割り込み発生するか

備考 自動で割り込みが許可になります。手動で割り込みOn/Offを行いたいときは直後にdisable_irq()を呼び出してください。

呼び出し関数名

 割り込みを使用するピンによって以下の呼び出し関数をプログラム内に作成してください。注意点としてはextern "C"の宣言がなければC++の関数として処理されるので必ず extern "C"を付けるようにしてください。下にあるサンプルプログラムを参照していただければと思います。


STM32F303xC

(STM32 F3Discovery)

STM32F401xE

(NucleoF401RE)

Px0 EXTI0_IRQHandler EXTI0_IRQHandler
Px1 EXTI1_IRQHandler EXTI1_IRQHandler
Px2 EXTI2_TSC_IRQHandler EXTI2_IRQHandler
Px3 EXTI3_IRQHandler EXTI3_IRQHandler
Px4 EXTI4_IRQHandler EXTI4_IRQHandler
Px5~9 EXTI9_5_IRQHandler EXTI9_5_IRQHandler
Px10~15 EXTI15_10_IRQHandler EXTI15_10_IRQHandler

サンプルコード

 このサンプルコードをNucleoF401REで実行するとボタンを押すごとにLEDがトグルします。書き込み方法等についてはこちらを参照にしてください。

#include "DKS_Util_F401xE.h"
#include "DKS_GPIO_F401xE.h"

DKS::InterupptIn *button;
DKS::DigitalOut *ld;

int main(void)
{
        DKS::InitSystem();
        button = new DKS::InterupptIn(GPIOC, GPIO_PIN_13, DKS::No_Pull, DKS::IT_Rising);
        ld = new DKS::DigitalOut(GPIOA, GPIO_PIN_5);
        while (1);
}

extern "C"
void EXTI15_10_IRQHandler(void)
{
        if(__HAL_GPIO_EXTI_GET_IT(button->Pin) != RESET)
        {
                __HAL_GPIO_EXTI_CLEAR_IT(button->Pin);
                if (button->Debounce()==1)      ld->toggle();
        }

}