LPC系のソースコードは複数のソースファイルがあるので、ちゃんと読んでなかった。
今回のperiph_blinkyはLチカなので簡単だろうから、読んでみることに。
periph_blinkyは、次の3つのソースコードからできている。
1. cr_startup_lpc175x_6x.c
2. sysinit.c
3. systick.c
このうち、systick.c
にmain
関数があるので、まずはざっくりとsystick.c
を見る。
/* * @brief Blinky example using sysTick * * @note * Copyright(C) NXP Semiconductors, 2014 * All rights reserved. * 略 */ #include "board.h" #include <stdio.h> /***************************************************************************** * Private types/enumerations/variables ****************************************************************************/ #define TICKRATE_HZ1 (10) /* 10 ticks per second */ /***************************************************************************** * Public types/enumerations/variables ****************************************************************************/ /***************************************************************************** * Private functions ****************************************************************************/ /***************************************************************************** * Public functions ****************************************************************************/ /** * @brief Handle interrupt from SysTick timer * @return Nothing */ void SysTick_Handler(void) { Board_LED_Toggle(0); } /** * @brief main routine for systick example * @return Function should not exit. */ int main(void) { /* Generic Initialization */ SystemCoreClockUpdate(); Board_Init(); /* Enable and setup SysTick Timer at a periodic rate */ SysTick_Config(SystemCoreClock / TICKRATE_HZ1); /* LEDs toggle in interrupt handlers */ while (1) { __WFI(); } return 0; }
まずはmain
関数を上から見ていくと、
SystemCoreClockUpdate();
でクロックの設定をして、
Board_Init();
でボードの初期化、
SysTick_Config(SystemCoreClock / TICKRATE_HZ1);
でSysTickの設定をして、
while (1)
でループ。
で、ループ内の__WFI();
と。
特にLEDをOn/Offしてない。
LEDをトグルしているのは、main
関数の上のvoid SysTick_Handler(void)
内のBoard_LED_Toggle(0);
でやっているらしい。
SysTick_Handler
のコメントからSysTick
というタイマー割り込みで呼ばれるらしい。
そうすると、SysTick_Config
で割り込みの間隔(コメントを読むと1/10秒)を指定しているということだろう。
ループ内の__WFI();
はWait For Interruptの略でインラインアセンブラでwfi
命令になる。
「割り込みを待つ」という命令らしい。
で、今度は逆方向に見ていくと、
SysTick_Config(SystemCoreClock / TICKRATE_HZ1);
のSystemCoreClock
はグローバル変数でSystemCoreClockUpdate();
で更新される。
で、クロック数を10で割った値を渡しているので、クロック数の1/10毎にSysTick
割り込みがかかり、SysTick_Handler
が呼ばれる。
void Board_Init(void)
はboard.c
に定義されている。
GPIOとかLEDとかを初期化する。
void SystemCoreClockUpdate(void)
はchip_17xx_40xx.c
で定義されている。
あれ?これでいいじゃん。
他の2つは何やってんの?