LoginSignup
2
2

More than 5 years have passed since last update.

stm32(Nucleo-F411RE)でTIM割込を使用する

Last updated at Posted at 2017-05-02

目的

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

ソースコード

main.c
#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)より以下の通り。
クロックツリー.png
・以下の"TIM4_IRQn"は、stm32f4xx.hのIRQnから持ってくる。
NVIC_InitStruct.NVIC_IRQChannel = TIM4_IRQn;
・割込ハンドラのTIM4_IRQHandlerは、startup_stm32f411xe.sのベクタテーブルから取ってくる。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2