STM32SystickTimerを稼働させる

# STM32SystickTimerを稼働させる

## 環境
使用マイコン：STM32F303VCT6(STM32F3DISCOVERY)
使用IDE:Eclipse(誰かが配布してくれた奴)

## 設定コード
すべてここで学びました．
[インターバルタイマー割り込みによるLEDの点灯消灯](http://tokyo-ct.net/usr/kosaka/for_students/stm32/stm32f3discovery/Systick/Systick.html)

``` C
/*インターバルタイマー割り込み初期設定　割り込み周波数[Hz]を引数で渡す*/
void initIntervaltimer(int32_t frequency)
 {
     RCC_ClocksTypeDef RCC_Clocks;
     RCC_GetClocksFreq(&RCC_Clocks);
     SysTick_Config(RCC_Clocks.HCLK_Frequency / frequency);
 }
```

RCC_GetClocksFreq(&RCC_Clocks);
で現在のクロック数を取得し
SysTick_Config(RCC_Clocks.HCLK_Frequency / frequency);
でSysTickTimerの周期を決める．

こんな簡単にSysTcikTimerが設定できるわけないだろと思い，これでは投稿する意味もないのでSysTick_Congfigを読んでみる．

``` C
/** \brief  System Tick Configuration

    This function initialises the system tick timer and its interrupt and start the system tick timer.
    Counter is in free running mode to generate periodical interrupts.

    \param [in]  ticks  Number of ticks between two interrupts
    \return          0  Function succeeded
    \return          1  Function failed
 */
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */

  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* Function successful */
}

```

まず初めのif文でカウント可能かを調べている．SysTick_LOAD_RELOAD_Mskは24bitの最大値．
次にSysTick->LOADで設定した周期で何回カウントしたいのかを設定．ここでも?限界値を見てるのでダブルチェック?なの?-1は愛嬌
NVIC_SetPrioritでは割り込みの優先順位を決めている．正直どうでもいい．
SysTick->VALは開始値なので初期化していると予想
SysTick->CTRLはSysTick_CTRL_CLKSOURCE_MskでSysTickTimerを有効化，SysTick_CTRL_TICKINT_Mskでカウントを有効化，SysTick_CTRL_ENABLE_Mskで割り込みを有効化と予想

簡単に設定できるように関数が用意しているのですね．便利だ．


## 成果物(ms_wait)
以下指定秒待つ関数を作成．勉強になりました．
Handlerの中に書いてもいいがタイマの中がif文でごちゃごちゃするの嫌いなんです←SysTickTimerの無駄遣い


``` C
/*インターバルタイマー割り込み初期設定　割り込み周波数[Hz]を引数で渡す*/
void initIntervaltimer(int32_t frequency)
 {
     RCC_ClocksTypeDef RCC_Clocks;
     RCC_GetClocksFreq(&RCC_Clocks);
     SysTick_Config(RCC_Clocks.HCLK_Frequency / frequency);
 }

 //インターバルタイマー割り込み関数
volatile uint32_t msCount=0;	//volatile大事
extern "C" void SysTick_Handler(void)
 {
	msCount++;
 }

/**
 * ms待つ関数
 * uint32_t ms : 待ちたい時間
 */
void ms_wait(uint32_t ms){
	msCount = 0;
	while(msCount < ms);
}
```

ほんとはSysTick_Handlerをms_wait内で有効化，無効化したいのだけどSysTick->CTRLにアクセスするのが面倒なのでやめました．


## Link
* [STM32F3Discoveryの使い方](http://tokyo-ct.net/usr/kosaka/for_students/stm32/stm32f3discovery/)
* [STM32 -Wiki](http://www.minokasago.org/STM32wiki/)
* [ Discovery kit with STM32F303VC MCU ](http://www.st.com/content/st_com/ja/products/evaluation-tools/product-evaluation-tools/mcu-eval-tools/stm32-mcu-eval-tools/stm32-mcu-discovery-kits/stm32f3discovery.html)
* [STM32F303VC  ](http://www.st.com/content/st_com/ja/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f3-series/stm32f303/stm32f303vc.html)