8 years, 9 months ago.

mbed上でのSCTimerの使用方法

LPCXpresso1549を利用して、mbedの環境で使用しています。 LPC1549は強力なSCTがあるので、これを利用したいと勉強しているのですが、Lチカでさえうまく動かすことが出来ず、皆様のお知恵をお貸しください。

参考にしているのはこちらのSCTimer/PWM cookbookです。 http://www.lpcware.com/content/nxpfile/an11538-sctimerpwm-cookbook

この中にある、最初のRepetitive interruptのサンプルコードを利用しています。

以下、mbedでの定義に若干変更していますが、以下コードです。

Repetitive interrupt under mbed

#include "mbed.h"

void SCT2_Init(void)
{
    LPC_SYSCON->SYSAHBCLKCTRL1 |= (1<<4);                // enable the SCT2 clock

    LPC_SCT2->CONFIG            = (1 << 0) | (1 << 17);    // unified 32-bit timer, auto limit

    LPC_SCT2->MATCH0        = SystemCoreClock/100 - 1; // match 0 @ 100 Hz = 10 msec
    LPC_SCT2->MATCHREL0     = SystemCoreClock/100 - 1;

    LPC_SCT2->EV0_STATE    = 0xFFFFFFFF;              // event 0 happens in all states
    LPC_SCT2->EV0_CTRL     = (1 << 12);               // match 0 condition only

    LPC_SCT2->EVEN              = (1 << 0);                // event 0 generates an interrupt
    NVIC_EnableIRQ(SCT2_IRQn);                             // enable SC2 interrupt

    LPC_SCT2->CTRL &= ~(1 << 2);                         // start timer
}

void SCT2_IRQHandler(void)
{                                                  // SCT2 Interrupt Handler (10 msec)
  static uint8_t cnt = 0;

    if (++cnt > 20)                                // 20 * 10 msec = 200 msec
    {
        cnt = 0;
        LPC_GPIO_PORT->NOT[0] = (1 << 25);              // toggle pin P0_25
    }
    LPC_SCT2->EVFLAG = 0x00000001;                 // clear event 0 flag
}

int main (void)
{
    LPC_SYSCON->SYSAHBCLKCTRL0 |= (1<<14);       // enable clock to GPIO port 0
    LPC_GPIO_PORT->DIR[0]           |= (1 << 25);       // configure P0_25 (red LED) as output

    SCT2_Init();                                   // Initialize SCT

    while (1)                                      // loop forever
    {
    }
}

このようなコードですが、Buildは問題ありませんが、LEDは点灯したままで、チカチカしないという状況です。 もともとのコードをLPCXpresso上でBuildしたものは、問題なくLEDがチカチカします。

mbedではSCTの設定や、割り込み設定など特別に注意することがあるのでしょうか? mbed-srcではアドレスなどLPC1549マニュアルどおりにきちんと設定されていることなどは確認しましたが、どうにもよく分かりませんでした。 自分でも色々と確認してみますが、ポインタなど教えていただくだけでも良いので、よろしくお願いいたします。

1 Answer

8 years, 9 months ago.

C++とCではマングリングが違うので、Cから呼ばれてほしいものはextern "C"を付けます。

extern "C" void SCT2_IRQHandler(void)

修正したらLチカできました。

Accepted Answer

ありがとうございます。助かりました。そして申し訳ないのですが、追加で質問させてください。 この場合はSCT2_IRQHanlderはC++で記載されてネームマングリングを受けているということは理解出来たのですが、割り込み処理を呼び出しているところは、mbed-srcのどこに記載があるのでしょうか? そちらはCで書かれているとして、他にもこのように注意するところはありますでしょうか?(Priorityの変更とか?)

posted by Takuya Fukuda 01 Jul 2015