Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
10 years, 4 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
10 years, 4 months ago.
C++とCではマングリングが違うので、Cから呼ばれてほしいものはextern "C"を付けます。
extern "C" void SCT2_IRQHandler(void)
修正したらLチカできました。