STM32タイマ割り込み制御

タイマ基本構造

タイマモジュールは入力クロックを計数し、設定値到達時に割り込みを生成します。16ビットカウンタ/プリスケーラ/自動再ロードレジスタで構成され、72MHzクロック下で最大59.65秒の計時を実現します。主要機能:

  • 基本タイマ割り込み
  • 内部/外部クロック源選択
  • 入力キャプチャ/出力比較
  • エンコーダインタフェース
  • マスタ/スレーブトリガモード

複雑度に応じ3種類に分類:

  1. アドバンストタイマ
  2. 汎用タイマ
  3. 基本タイマ

基本タイマ構成

アップカウント専用構造:

/* プリスケーラ設定 */
CK_CNT = CK_PSC / (PSC + 1)

/* カウンタ動作 */
CK_CNT_OV = CK_CNT / (ARR + 1)

/* 自動再ロードレジスタ */
カウンタ値 == ARR 時に割り込み発生

汎用タイマ動作モード

  • アップカウント
  • ダウンカウント
  • センターアラインド

割り込み設定手順

  1. RCCクロック有効化
  2. クロック源選択
  3. タイマベース設定
  4. 割り込み出力設定
  5. NVIC設定
  6. タイマ動作開始

実装例

void Timer_Init(void) {
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  TIM_InternalClockConfig(TIM2);
  
  TIM_TimeBaseInitTypeDef baseConfig;
  baseConfig.TIM_ClockDivision = TIM_CKD_DIV1;
  baseConfig.TIM_CounterMode = TIM_CounterMode_Up;
  baseConfig.TIM_Period = 9999;
  baseConfig.TIM_Prescaler = 7199;
  TIM_TimeBaseInit(TIM2, &baseConfig);
  
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);
  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  NVIC_InitTypeDef nvicConfig;
  nvicConfig.NVIC_IRQChannel = TIM2_IRQn;
  nvicConfig.NVIC_IRQChannelCmd = ENABLE;
  nvicConfig.NVIC_IRQChannelPreemptionPriority = 2;
  nvicConfig.NVIC_IRQChannelSubPriority = 1;
  NVIC_Init(&nvicConfig);
  
  TIM_Cmd(TIM2, ENABLE);
}

PWM出力設定

出力比較機能を使用してPWM波形生成:

void PWM_Config(TIM_TypeDef* TIMx, uint16_t channel) {
  TIM_OCInitTypeDef ocConfig;
  ocConfig.TIM_OCMode = TIM_OCMode_PWM1;
  ocConfig.TIM_OutputState = TIM_OutputState_Enable;
  ocConfig.TIM_Pulse = 0;
  ocConfig.TIM_OCPolarity = TIM_OCPolarity_High;
  
  switch(channel) {
    case 1: TIM_OC1Init(TIMx, &ocConfig); break;
    case 2: TIM_OC2Init(TIMx, &ocConfig); break;
    case 3: TIM_OC3Init(TIMx, &ocConfig); break;
    case 4: TIM_OC4Init(TIMx, &ocConfig); break;
  }
}

エンコーダインタフェース

void Encoder_Init(void) {
  GPIO_InitTypeDef gpioConfig;
  gpioConfig.GPIO_Mode = GPIO_Mode_IPU;
  gpioConfig.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_Init(GPIOA, &gpioConfig);
  
  TIM_TimeBaseInitTypeDef baseConfig;
  baseConfig.TIM_Period = 65535;
  baseConfig.TIM_Prescaler = 0;
  TIM_TimeBaseInit(TIM3, &baseConfig);
  
  TIM_ICInitTypeDef icConfig;
  icConfig.TIM_Channel = TIM_Channel_1;
  icConfig.TIM_ICFilter = 0x0F;
  TIM_ICInit(TIM3, &icConfig);
  
  icConfig.TIM_Channel = TIM_Channel_2;
  TIM_ICInit(TIM3, &icConfig);
  
  TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, 
    TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
  
  TIM_Cmd(TIM3, ENABLE);
}

タグ: STM32 TIM PWM Encoder interrupt

7月6日 23:04 投稿