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つは何やってんの?