タイマ基本構造
タイマモジュールは入力クロックを計数し、設定値到達時に割り込みを生成します。16ビットカウンタ/プリスケーラ/自動再ロードレジスタで構成され、72MHzクロック下で最大59.65秒の計時を実現します。主要機能:
- 基本タイマ割り込み
- 内部/外部クロック源選択
- 入力キャプチャ/出力比較
- エンコーダインタフェース
- マスタ/スレーブトリガモード
複雑度に応じ3種類に分類:
- アドバンストタイマ
- 汎用タイマ
- 基本タイマ
基本タイマ構成
アップカウント専用構造:
/* プリスケーラ設定 */
CK_CNT = CK_PSC / (PSC + 1)
/* カウンタ動作 */
CK_CNT_OV = CK_CNT / (ARR + 1)
/* 自動再ロードレジスタ */
カウンタ値 == ARR 時に割り込み発生
汎用タイマ動作モード
- アップカウント
- ダウンカウント
- センターアラインド
割り込み設定手順
- RCCクロック有効化
- クロック源選択
- タイマベース設定
- 割り込み出力設定
- NVIC設定
- タイマ動作開始
実装例
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);
}