目的
STM32F411REでTIM4を用いたタイマ割込を実装したのでメモ。
環境
開発環境:Sytem Workbench for STM32(以下、OpenSTM)@Windows10 64bit
使用基板:NUCLEO-F411RE
ファーム:StdPeriph(STM32F4xx_DSP_StdPeriph_Lib_V1.8.0)
構築環境は以下の通り。
http://qiita.com/takoke/items/066d06b9a6fc18e2f975
ソースコード
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_tim.h"
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4,TIM_IT_Update) != RESET ){
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
GPIO_ToggleBits(GPIOA,GPIO_Pin_5);
}
}
int main(void)
{
/********************************/
/* GPIOの設定@ユーザLED */
/********************************/
//GPIO_Aへクロック供給
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
//ユーザLEDに対応するピンの設定
GPIO_InitTypeDef pin_PA5;
pin_PA5.GPIO_Pin = GPIO_Pin_5;
pin_PA5.GPIO_Mode = GPIO_Mode_OUT;
pin_PA5.GPIO_OType = GPIO_OType_PP;
pin_PA5.GPIO_PuPd = GPIO_PuPd_DOWN;
//GPIOの初期化・スタート
GPIO_Init(GPIOA, &pin_PA5);
/********************************/
/* TIM4の設定 */
/********************************/
//割込の設定
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 5; //0が最高優先度、15まで。
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
//TIM4にクロック供給
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
//TIM4の設定
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);
//カウントアップタイマの設定
//APB1のクロック100MHzに対し、2000*50000=100Mcnt。
//1sでタイマ割込がかかる
TIM_TimeBaseInitStruct.TIM_Prescaler = 2000-1; //2000
TIM_TimeBaseInitStruct.TIM_Period = 50000; //50000
//TIM4の初期化、スタート
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStruct);
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM4,ENABLE);
while(1){
;
}
}
メモ
・system_stm32f4xx.cの上の方にクロック関連の設定一覧がある。(表タイトル:Supported STM32F411xx/STM32F410xx devices)
・NUCLEO-F411REはSystem Clock sourceとしてHSI(16MHz)をPLLにかけて生成。
・システムクロック(SYSCLK)は100MHz。
・以下のプリスケーラの設定より、APBx timer clocksも100MHz。
・AHB Prescaler:1
・APB1 Prescaler:2
・APB2 Prescaler:1
・クロックツリーはリファレンスマニュアル(RM0383:DocID026448 Rev.1)より以下の通り。
・以下の"TIM4_IRQn"は、stm32f4xx.hのIRQnから持ってくる。
NVIC_InitStruct.NVIC_IRQChannel = TIM4_IRQn;
・割込ハンドラのTIM4_IRQHandlerは、startup_stm32f411xe.sのベクタテーブルから取ってくる。