“periph_blinky”を読む(systick.c編)

LPC系のソースコードは複数のソースファイルがあるので、ちゃんと読んでなかった。
今回のperiph_blinkyはLチカなので簡単だろうから、読んでみることに。

periph_blinkyは、次の3つのソースコードからできている。
1. cr_startup_lpc175x_6x.c
2. sysinit.c
3. systick.c

このうち、systick.cmain関数があるので、まずはざっくりと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つは何やってんの?

カテゴリー: ARM, ソフトウェア パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA