蒐集

鮮やかな憧憬

STM32のタイマ機能使ったときのうっかりミス

STM32のタイマ機能使った時に初歩的なミスをしていた。

 

タイマ機能の使い方としては、NVICとタイマの初期化をそれぞれ行い、その後割り込みで発生する関数の中に命令を書いてやるだけです。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //タイマ有効化
NVIC_Configuration();
TIM_Configuration();

 

void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

/* Enable the TIM2 gloabal Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0 );

/* 1 bit for pre-emption priority, 3 bits for subpriority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1 );
}

//割り込み関数用
void TIM_Configuration( void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// 72MHz -> 18MHz -> 1kHz -> 2Hz ?
TIM_TimeBaseStructure.TIM_Period = 500;
TIM_TimeBaseStructure.TIM_Prescaler = 18000;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV4;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

// 設定を反映
TIM_TimeBaseInit( TIM2, &TIM_TimeBaseStructure);

// 割り込み許可...割り込み要因のORを引数に入れる
TIM_ITConfig( TIM2, TIM_IT_Update, ENABLE);

// タイマ2起動
TIM_Cmd( TIM2, ENABLE);
}

まあこんな感じ。(かなり適当目に書いたのでわからんかったら言って下さい)
あとはあらかじめ予約されたハンドラに割り込み処理そのものを書いてやればいい。
ただ、STM32は機能がくっそいっぱいあるので、初期化の段階でタイマーの振り分けをしてやらんと動かない。ので、GPIOコンフィグちゃんとしましょう。……これに気が付くのに暫く掛かった。馬鹿である。

まあそういうことなんでがんばってください