【ツールの使い方】STM32CubeMX - 基本的なタイマー設定

I. 概要

    初心者でも熟練者でも、STM32 シングルチップ マイコンの開発に基づいて、STM32CubeMX を使用すると開発効率が大幅に向上し、そのインターフェイス開発により、STM32 シングルチップ マイコンの初心者の開発敷居が大幅に下がります。
    この記事では主に STM32 チップのタイマーの構成と関連知識について説明します。

2. ソフトウェアの説明

    STM32CubeMX は、ST 用の公式 ST MCU/MPU クロスプラットフォーム グラフィカル ツールです。Linux、MacOS、および Windows システムでの開発をサポートしています。その基盤となるインターフェイスは HAL ライブラリです。さらに、開発の登録に慣れている学生は、LL ライブラリを使用して、も使用されます。STM32CubeMX は、MCU/MPU のハードウェア抽象化レイヤーの統合に加えて、RTOS、ファイル システム、USB、ネットワーク、ディスプレイ、組み込み AI などのミドルウェアも統合するため、開発者は MCU/MPU 構成の基礎となるドライバーを簡単に完成させることができます。より多くのエネルギーを上位層の関数ロジックの開発に残せるため、組み込み開発の効率をさらに向上させることができます。
    デモバージョン 6.7.0

3. タイマーの概要

    タイマーはその名のとおり、タイミングを計る機能であり、GPIO を除くマイクロコントローラーの最も基本的な周辺機器です。ST では、タイマーは、基本タイマー、汎用タイマー、アドバンスト タイマー、および低電力タイマーのいくつかのタイプに分類されます。この記事では基本的なタイマーの設定に重点を置き、他のタイプのタイマーについては他の章で詳しく説明します。
    基本タイマは最も基本的な計時機能のみを提供するもので、以下にST基本タイマのブロック図からタイマの原理を説明します。
ここに画像の説明を挿入
    タイミング 1 秒を例にとると、現在の入力クロック周波数が 1MHz の場合、1 秒の間隔を取得するにはどうすればよいでしょうか? ご存知のとおり、1MHz 自体は 1 秒あたり 1,000,000 回の周波数を意味するため、タイマーがクロック サイクルごとに数値をカウントする場合、1,000,000 回カウントするのに 1 秒かかると考えがちです。したがって、最初のパラメータが表示されます - Auto Reload Value . このパラメータの機能は次のとおりです: カウントが自動リロード値に達すると、オーバーフロー割り込みフラグがトリガーされ、ユーザーはオーバーフロー割り込みフラグを取得して 1 秒の時間を取得できます。
    しかし、現実はそれほど理想的ではなく、オートリロード値も 16 ビット、タイマーのカウント値も 16 ビット、つまり最大カウントは 65535 までしか到達できず、1000000 に到達することはできません。みんな。どうすればいいですか?考えてみてください。カウントはそれほど大きな数に達することはできませんが、カウントをそれほど速くしないことは可能でしょうか。たとえば、タイマーを 1kHz の周波数でカウントさせると、1 秒の時間を取得するのに 1000 回カウントするだけで済みます。しかし、タイマーの入力は 1MHz ですが、どうすれば遅くすることができますか? このとき、別のパラメーターであるプリスケーラー値 (Prescaler Value)が役に立ちます。1MHzを2で割ると500kHz、1000で割ると1kHzになります。

4. タイマー設定

    原理を読んだ後、ここでは上記の 1 秒クロックを例として、具体的な関数の実装、CubeMX での設定方法を見ていきます。

  • 基本構成

    まず設定インターフェイスを見てください。ここではタイミング通知の機能のみが必要であり、外部ポートを使用する必要がないため、「タイマー」タブで「TIM6」を直接選択できます(TIM6は基本タイマーです)。タイマーを有効にするには、「有効化」を選択します。
ここに画像の説明を挿入
    次に、いくつかの基本的な構成情報を見てみましょう。
ここに画像の説明を挿入
ワン パルス モード:このモードをオンにすると、オーバーフロー フラグが 1 回トリガされる限り、カウンティング イネーブルは自動的にオフになります。再度トリガしたい場合は、カウンティング イネーブルを手動でオンにする必要があります。したがって、定期的なトリガー イベントを実装する場合は、このオプションをオンにする必要はありません。
プリスケーラー:初心者キラーの 1 つ。ここではプリスケーラーと書かれていますが、実際の設定値はプリスケーラー -1、つまり周波数を 10 で割ったときに 9 に設定する必要があります。
カウンタ モード:カウント モードはカウント方向とも呼ばれ、タイマーがカウントアップするかカウントダウンするかを決定します。タイミングの目的のみに使用される場合は、増加または減少しても効果はありません。
Counter Period (Counter Period):カウント値がカウント周期値に達すると、オーバーフロー フラグがトリガーされます 初心者キラー 2、カウントは 0 から始まるため、10 カウントを達成したい場合は、9 を設定するだけで済みます十分です。
自動リロード (自動リロード プリロード):自動リロードが選択されている場合、オーバーフロー フラグがトリガーされた後、タイマーは自動的にカウントを 0 にクリアし、再びカウントを開始します。
トリガー イベントの選択 (トリガー イベントの選択): UG フラグ、カウント イネーブル、および通常は使用されないオーバーフロー フラグを介して出力をトリガーすることを選択できます。

    1 秒のタイミングを実現するには、まず現在のタイマーのクロック周波数を知る必要があります。まずクロックツリーを確認します.TIM6はAPBクロックバス上にハングしています.ここではシングルチップマイコンの最高周波数である48MHzに合わせて設定しています。
ここに画像の説明を挿入
    計算の便宜上、ここではプリスケーラー係数として 47999 を入力できます。これは 48000 分周に相当します。カウントサイクルは 999 で埋めることができ、つまり 1000 回カウントできます。さらに、自動リロードを有効にして、1 秒のサイクル カウントを取得できるようにします。
ここに画像の説明を挿入
    何らかの操作を実行するためのカウント期間が終了したことをすぐに知らせるために、ここで割り込みサービス関数を開く必要もあります。「NVIC設定」タブで「TIM6」割り込みイネーブルにチェックを入れます。
ここに画像の説明を挿入
    上記の設定を完了し、使用するライブラリを選択すると、プロジェクト コードを生成できます。

  • LL ライブラリ コードの実装

    生成されたプロジェクトに次のコードを追加して、割り込みがトリガーされたときにブール変数を反転します。

/***************************main.c******************************/
int main(void)
{
    
    
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM6_Init();
  /* USER CODE BEGIN 2 */
  
  /* 使能更新中断 */
  LL_TIM_EnableIT_UPDATE(TIM6);
  /* 使能计数 */
  LL_TIM_EnableCounter(TIM6);
  
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    
    
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
/***********************************************************************/

/***************************stm32f0xx_it.c******************************/
void TIM6_DAC_IRQHandler(void)
{
    
    
  /* USER CODE BEGIN TIM6_DAC_IRQn 0 */
  /* 进中断后判断如果使能了更新中断,且更新中断标志为1,则翻转数据,并清除标志 */
  if (   (LL_TIM_IsActiveFlag_UPDATE(TIM6))
      && (LL_TIM_IsEnabledIT_UPDATE(TIM6))
	   )
  {
    
    
      LL_TIM_ClearFlag_UPDATE(TIM6);
      TestTimer = (++TestTimer) % 2;
  }
  /* USER CODE END TIM6_DAC_IRQn 0 */

  /* USER CODE BEGIN TIM6_DAC_IRQn 1 */

  /* USER CODE END TIM6_DAC_IRQn 1 */
}
/*******************************************************************/
  • HAL ライブラリ コードの実装
/* USER CODE BEGIN 0 */
uint8_t TestTimer = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    
    
  /* Prevent unused argument(s) compilation warning */
  UNUSED(htim);
  TestTimer = (++TestTimer) % 2;
  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_TIM_PeriodElapsedCallback could be implemented in the user file
   */
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
    
    
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM6_Init();
  /* USER CODE BEGIN 2 */
  
  /* 使能更新中断 */
  HAL_TIM_Base_Start_IT(&htim6);
  /* 启动定时器 */
  HAL_TIM_Base_Start(&htim6);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    
    
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
  • 効果実証

ここに画像の説明を挿入

    デバッグ用にソフトウェアを書き込むと、変数が 1 秒ごとに反転することがわかります。

5. 注意すべき事項

1. プリスケーラ係数とリロード値を設定するときは、1 を引く必要があることに注意してください。つまり、2 で割る場合は PSC を 1 に設定する必要があり、リセットを 10 回カウントしたい場合は、リロード値に 9 を設定します。
2. 生成されたプロジェクトは、設定後の初期化時にはカウントされず、使用時に LL ライブラリを呼び出して開く必要があります。

おすすめ

転載: blog.csdn.net/u012749085/article/details/131396208