タイマー割り込み
1.タイマー割り込みの概要
STM32のタイマー機能は、高度なタイマー(TIM1およびTIM8)、一般的なタイマー(TIM2〜TIM5)、基本的なタイマー(TIM6およびTIM7)を含む非常に強力です。この実験では、中程度の難易度を持つ一般的なタイマー、一般的なタイマーを紹介しますこれは、プログラム可能なプリスケーラーによって駆動される16ビットのオートローディングカウンターです。入力信号のパルス長の測定(インプットキャプチャ)や出力波形の生成(アウトプット比較とPWM)など、多くの場面に適しています。タイマープリスケーラーとRCCクロックコントローラープリスケーラーを使用して、パルス長と波形周期を数マイクロ秒から数ミリ秒に調整できます。各タイマーは完全に独立しており、リソースを互いに共有しません。
一般的なTIMx(TIM2、TIM3、TIM4、およびTIM5)タイマー機能には、次のものがあります。
- 16ビットのアップ、ダウン、アップ/ダウン自動ロードカウンター
- 16ビットプログラマブル(リアルタイムで変更可能)プリスケーラー、カウンタークロック周波数の分周係数は1〜65536の任意の値
- 4つの独立したチャネル:
─インプットキャプチャー
─出力比較
─PWM生成(エッジまたはセンターアライメントモード)
─シングルパルスモード出力 - 外部信号を使用してタイマーとタイマー相互接続同期回路を制御
- 割り込み/ DMAは、次のイベントが発生すると生成されます:
─更新:カウンターオーバーフロー/ダウンフロー、カウンター初期化(ソフトウェアまたは内部/外部トリガーによる)
─トリガーイベント(カウンターの開始、停止、初期化、または内部/外部トリガーによるカウント)
─入力キャプチャ-出力
比較 - 位置決め用のインクリメンタル(直交)エンコーダーとホールセンサー回路をサポート
- 外部クロックとしてのトリガー入力またはサイクル電流管理
汎用タイマーのブロック図
タイマータイムベース部
2.ハードウェア設計
この実験では、TIM3の割り込みを使用して、ハードウェアリソースを必要とするD1のオンとオフを制御します。
- D1およびD2インジケーターライト
- タイマーTIM3
3.ソフトウェア設計
3.1 STM32CubeMX設定
- RCCは外部HSEを設定し、クロックは72MHzに設定され、APB1タイムクロックに搭載されたTIM3クロックは72MHzです。
- PC0 / PC1はGPIOプッシュプル出力モード、プルアップ、高速に設定され、デフォルトの出力レベルは高
- TIM3タイマーをアクティブにし、クロックソースとして内部クロックを選択し、PSCプリスケーラーを7200-1に設定し、カウントアップし、オートリロード値(ARR)を10000-1に設定します。NVIC設定でTIM3タイマー割り込みをアクティブにします。計算できます:カウンタークロックCK_CNT = 72M / 7200 = 10000Hz、タイマー割り込み時間はARR / 10000 = 1秒
- プロジェクト名を入力し、プロジェクトパス(中国語以外)を選択し、MDK-ARM V5を選択します。IPごとに「.c / .h」ファイルのペアとして生成されたペリフェラルの初期化を確認します。「コードを生成」をクリックしてプロジェクトコードを生成します
3.2 MDK-ARMプログラミング
- tim.cファイルでタイマーの初期化関数を確認できます
void MX_TIM3_Init(void){
TIM_ClockConfigTypeDef sClockSourceConfig = {
0};
TIM_MasterConfigTypeDef sMasterConfig = {
0};
htim3.Instance = TIM3;
htim3.Init.Prescaler = 7200-1;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 10000-1;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim3) != HAL_OK){
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK){
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK){
Error_Handler();
}
}
弱いシンボルサイクルを見つけてコールバック関数のプロトタイプを実行し、tim.cでコールバック関数をカスタマイズします
__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef * htim)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
if(htim == &htim3){
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0); //LED1状态每1s翻转一次
}
}
- メイン関数に関連するコードを記述し、LED2が500msごとにフリップするようにします
int main(void){
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM3_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim3); //启动定时器中断模式计数
/* USER CODE END 2 */
while (1){
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1); //LED2状态每500ms翻转一次
HAL_Delay(500);
}
}
4.ダウンロードの確認
コンパイルが完了したら、開発ボードにダウンロードします。LED1の状態が1秒ごとに1回フリップし、LED2の状態が500ミリ秒ごとに1回フリップすることがわかります。