技術共有

STM32-TIMタイマー

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

このコンテンツは以下に基づいていますJiangxie Technology STM32 ビデオ内容が整理されています。

1. ティム

1.1 TIMタイマー

  • タイマは入力クロックをカウントし、カウント値が設定値に達すると割り込みを発生させることができます。
  • 16ビットカウンタ、プリスケーラ、自動リロードレジスタからなるタイムベースユニットは、72MHzのカウントクロックで最大59.65秒のタイミングを実現します。 1/(72/65536/65536) (カウンタはカウントのタイミングを行うためのレジスタです。クロックが来るたびにカウンタは1ずつ増加します。プリスケーラはカウンタのクロックを分周して、カウントをより柔軟にすることができます。 自動再起動 ロードされたregister はカウントの目標値であり、割り込みに適用するためにカウントするクロック数を表します。これらのレジスタはタイマーのコア部分を構成します。この回路はタイムベースユニットと呼ばれます。
  • 基本的なスケジュール割り込み機能だけでなく、内部および外部クロック ソースの選択、入力キャプチャ、出力比較、エンコーダ インターフェイス、マスター/スレーブ トリガ モードなどの機能も備えています。
  • 複雑さとアプリケーションのシナリオに応じて、アドバンスト タイマー、一般タイマー、ベーシック タイマーの 3 つのタイプに分類されます。

1.2 タイマーの種類

タイプシリアルナンバーバス関数
アドバンストタイマーティム1、ティム8APB2一般的なタイマの機能をすべて備え、さらに繰り返しカウンタ、不感帯生成、相補出力、ブレーキ入力などの機能を備えています。
ユニバーサルタイマーティム2、ティム3、ティム4、ティム5APB1基本的なタイマの機能をすべて備えており、内部および外部クロック ソースの選択、インプット キャプチャ、出力比較、エンコーダ インターフェイス、マスター/スレーブ トリガ モードなどの追加機能もあります。
基本タイマーティム6、ティム7APB1スケジュール割り込み機能とマスターモードトリガDAC機能を搭載
  • STM32F103C8T6 タイマー リソース: TIM1、TIM2、TIM3、TIM4
  • DAC: デジタル - アナログ コンバーター

1.3 基本タイマー

主な機能:

  • 16ビットオートリロード蓄積カウンタ
  • 16 ビットのプログラマブル プリスケーラー。入力クロックを 1 ~ 65536 の任意の値で分周するために使用されます。
  • DACをトリガーする同期回路
  • 更新イベントで生成された割り込み/DMA リクエスト (カウンタ オーバーフロー)

画像.png

  • プリスケーラ PSC
    基準カウントクロックの入力はプリスケーラーの前に接続されます。基本タイマは内部クロックしか選択できないため、プリスケーラの入力線は内部クロック(CK_INT)に接続されていると考えることができます。
    内部クロックのソースは RCC の TIMxCLK です。ここでの周波数値は通常、システムのメイン周波数の 72MHz です。
    プリスケーラに 0 を書き込むと分周しないことを意味し、1 を書き込むと周波数を 2 で分周することを意味し、出力周波数 = 入力周波数 / 2 = 36MHz となります。
    2 と書くと 3 で割ることを意味し、出力 = 入力 / 3 になります。したがって、プリスケーラの値は実際の分周係数と1異なり、実際の分周係数=プリスケーラの値1となります。プリスケーラは 16 ビットなので、最大値は 65535 を 65536 で割った値として書き込むことができます。

  • カウンターCNT
    カウンタは、あらかじめ分周された計数クロックをカウントすることができ、計数クロックが立ち上がりエッジになるたびにカウンタ値が 1 ずつ増加します。カウンタも 16 ビットなので、内部の値は 0 ~ 65535 まで加算できます。さらに追加すると、カウンターは 0 に戻り、再び開始されます。したがって、カウント処理中にカウンタの値は増加し続け、その増加量が目標値に達すると、割り込みが生成され、スケジュールされたタスクが完了します。したがって、ターゲット値を格納するレジスタが必要になります。これが自動リロード レジスタです。

  • 自動リロードレジスタ
    オートリロードレジスタも16ビットであり、書き込むカウント対象を格納します。実行プロセス中、カウント値は増加し続け、自動リロード値は固定目標であり、カウント値が自動リロード値と等しくなったときにタイムアップします。その後、割り込み信号が生成され、カウンタがクリアされ、カウンタは自動的に次のカウント時間を開始します。

  • U および UI 矢印
    図中に描かれている上向きの割引矢印は、ここで割り込み信号が発生することを意味します。このようなカウント値が自動リロード値と等しい割り込みを一般に「更新割り込み」と呼びます。この更新割り込みは NVIC につながります。NVIC のタイマー チャネルを設定すると、タイマーの更新割り込みが CPU によって応答されます。下向きの矢印はイベントが発生することを表しており、ここでは対応するイベントを「更新イベント」と呼びます。更新イベントは割り込みをトリガーしませんが、他の内部回路の動作をトリガーする可能性があります。

1.4 一般的なタイマー

主な機能:

  • 16ビットアップ、ダウン、アップ/アップ自動リロードアキュムレータカウンター

  • 16 ビットのプログラマブル プリスケーラー。入力クロックを 1 ~ 65536 の任意の値で分周するために使用されます。

  • 4つの独立したチャンネル:

    • インプットキャプチャ
    • 出力比較
    • PWM生成(エッジまたはセンターアラインモード)
    • シングルパルスモード出力
  • 外部信号を使用してタイマーとタイマー相互接続を制御する同期回路

  • 割り込み/DMA は、次のイベントが発生したときに生成されます。

    • 更新: カウンタのオーバーフロー/アンダーフロー、カウンタの初期化 (ソフトウェアまたは内部/外部トリガ経由)
    • トリガーイベント (内部/外部トリガーによるカウンターの開始、停止、初期化またはカウント)
    • インプットキャプチャ
    • 出力比較
  • 位置決め用のインクリメンタル (直角位相) エンコーダおよびホール センサー回路をサポート

  • 外部クロックとしてのトリガー入力またはサイクルごとの電流管理
    画像.png

  • CNTカウンター
    CNTカウンターはアップカウントモード、ダウンカウントモード、センターアライメントモードをサポートしています。ダウンカウントモードはリロード値から開始し、0まで減少した後、リロード値に戻り割り込みがかかります。中央揃えモードは 0 から開始し、最初に上向きにインクリメントし、リロード値をカウントして割り込みを適用し、次に下向きに 0 までデクリメントしてから割り込みを適用します。

  • クロックソース
    一般タイマのクロックソースは内部72MHzクロックだけでなく、外部クロックも選択できます。
    (1)最初の外部クロックは次のとおりです。TIMx_ETR ピンの外部クロックつまり、外部方形波クロックを TIM2、PA0 の ETR ピンに接続し、内部極性選択、エッジ検出、プリスケーラー回路、および入力フィルター回路を構成できます。確かな造形。外部ピンクロックであるため、必然的にグリッチが発生するため、これらの回路は入力波形をフィルタリングできます。フィルタリングされた信号は 2 つのチャネルに分割され、上部の ETRF チャネルがトリガ コントローラに入力され、クロックがタイム ベース ユニットとして選択されます。この道は「」とも呼ばれます。外部クロックモード2”。
    画像.png
    (2) TRGI は外部クロックも提供できます。 、主にトリガー入力として使用され、このトリガー入力はタイマーのスレーブ モードをトリガーできます。 TRGI が外部クロックとして使用される場合、このパスは「」と呼ばれます。外部クロックモード1"。このパスを通過する外部クロックは何ですか? 1 つ目は ETR ピンの信号です。2 つ目は ITR 信号です。クロック信号のこの部分は他のタイマーから来ます。マスター モードの TRGO は次のような問題を引き起こす可能性があります。他のタイマに接続する場合、他の 4 つのタイマの TRGO 出力からの ITR0 ~ ITR3 ピンに接続され、ここでインプット キャプチャ ユニットに接続される TI1F_ED を選択することもできます。 CH1 ピン、つまりクロックは CH1 ピンから取得されます。ここでの ED (エッジ) はエッジを意味します。TI1FP1 は CH1 ピンに接続されているクロックであり、TI2FP2 は TI2FP2 に接続されています。 CH2 クロック。
    概要: 外部クロック モード 1 への入力は、ETR ピン、他のタイマ、CH1 ピンのエッジ、CH1 ピン、および CH2 ピンにすることができます。

  • 出力比較回路
    右下の出力比較回路はCH1~CH4の端子に対応して計4チャンネルあり、PWM波形の出力やモーターの駆動に使用できます。

  • インプットキャプチャ回路
    左側はインプットキャプチャ回路で、これもCH1~CH4端子に対応する4チャンネルがあり、入力方形波の周波数測定などに使用できます。

  • キャプチャ/比較レジスタ
    中央のレジスタはキャプチャ/コンペア レジスタで、インプット キャプチャ回路とアウトプット コンペア回路で共有されます。インプット キャプチャとアウトプット コンペアは同時に使用できないため、ここのレジスタは共有され、ピンも共有されます。

1.4 アドバンストタイマー

主な機能:

  • 16ビットアップ、ダウン、アップ/アップ自動リロードアキュムレータカウンター
  • 16 ビットのプログラマブル プリスケーラー。入力クロックを 1 ~ 65536 の任意の値で分周するために使用されます。
  • 4つの独立したチャンネル:
    • インプットキャプチャ
    • 出力比較
    • PWM生成(エッジまたはセンターアラインモード)
    • シングルパルスモード出力
  • デッドタイムをプログラム可能な相補出力
  • 外部信号を使用してタイマーとタイマー相互接続を制御する同期回路
  • 指定されたデータのカウンター期間後にタイマー レジスタ内の繰り返しカウンターを更新できるようにします
  • ブレーキ入力信号は、タイマー出力信号をリセット状態または既知の状態にすることができます。
  • 割り込み/DMA は、次のイベントが発生したときに生成されます。
    • 更新: カウンタのオーバーフロー/アンダーフロー、カウンタの初期化 (ソフトウェアまたは内部/外部トリガ経由)
    • トリガーイベント (内部/外部トリガーによるカウンターの開始、停止、初期化またはカウント)
    • インプットキャプチャ
    • 出力比較
    • ブレーキ信号入力
  • 位置決め用のインクリメンタル (直角位相) エンコーダおよびホール センサー回路をサポート
  • 外部クロックとしてのトリガー入力またはサイクルごとの電流管理

画像.png

  • リピートカウンター
    一般的なタイマーとの違い: 1 つ目は、割り込みが適用される繰り返しカウンターを追加することで、更新イベントと更新割り込みが数カウント サイクルごとにのみ発生することを実現できます。元の構造では、各カウント サイクルが完了した後に更新が発生します。これは、出力更新信号を再度分割することに相当します。

  • DTG デッドバンド ジェネレーターと相補出力
    以下はアドバンストタイマによる出力比較モジュールのバージョンアップです。DTG(デッドタイムジェネレート)はデッドゾーン生成回路です。右側の出力ピンは、元の 1 つから 2 つの相補出力に変更されており、一対の相補 PWM 波を出力できます。これらの回路は、クアッドコプター航空機や電動モーターの後輪などの 3 相ブラシレス モーターを駆動するために使用されます。車や電気ドリル、もしかしたら三相ブラシレスモーターかもしれません。三相ブラシレスモーターの駆動回路には通常3本のブリッジアームが必要となるため、各ブリッジアームは2本の高出力スイッチング管で制御され、合計6本の高出力スイッチング管が必要となります。したがって、ここでの最初の 3 つの出力 PWM ピンは相補出力になります。また、相補出力PWMでブリッジアームを駆動する際のスイッチング瞬間におけるデバイスの欠陥に起因する短時間のシュートスルー現象を防止するため、前段にデッドゾーン生成回路を追加しています。スイッチが切り替わった瞬間に一定時間の不感帯が発生し、ブリッジアームの上下のチューブがオフになり、貫通を防止します。

  • ブレーキ入力
    最後の部分はブレーキ入力機能で、モーター駆動の安全性を保証します。外部端子BKIN(Break IN)からブレーキ信号が発生したり、内部クロックが狂い故障が発生した場合には、制御回路が自動的にモーターの出力を遮断し、事故を防止します。

1.5 定時割り込みの基本構造

画像.png
動作制御: スタートとストップ、カウントアップまたはカウントダウンなど、レジスタ内の一部のビットを制御します。
右側は、タイミング時間が経過し、更新割り込みが生成された後に信号が送信される場所です。アドバンスト タイマーの場合は、追加のリピート カウンタが存在します。割り込み信号はまずステータス レジスタの割り込みフラグ ビットを設定し、このフラグ ビットは割り込み出力を通じて制御され、NVIC に割り込みを適用します。割り込み出力制御は、割り込み出力の有効化ビットです。割り込みが必要な場合は、必ず許可してください。
画像.png
画像.png

1.6 プリスケーラのタイミング

画像.png

  • カウンタのカウント周波数: CK_CNT = CK_PSC / (PSC 1)
  • CK_PSC: プリスケーラ クロック。内部クロックは 72MHz です。
  • CNT_EN: カウンタが有効になり、高レベル カウンタは通常通り動作し、低レベル カウンタは停止します。
  • CK_CNT: カウンタ クロック。プリスケーラのクロック出力とカウンタのクロック入力の両方です。
  • 最初は、カウンタは有効になっておらず、カウンタ クロックは実行されていません。イネーブル後、周期の前半では実際の分周係数は 1 (PSC=0)、後半ではカウンタのクロックがプリスケーラ前のクロックと等しくなり、実際の分周係数は 2 ( PSC=1)となり、カウンタのクロックはプリスケーラ前の半分のクロックになります。カウンタ クロックによって駆動され、次のカウンタ レジスタもクロックの立ち上がりエッジで増加し続けます。中間位置 FC 以降、カウント値は 0 になります。ここから、ARR 自動リロード値が FC であると推測できます。カウント値がリロード値と等しくなり、次のクロックが来ると、カウント値がゼロにクリアされ、更新イベントが生成されます。 これがカウントサイクルのワークフローです。
  • 次の 3 行は、プリスケーラ レジスタのバッファリング メカニズムを記述しています。つまり、実際には 2 つのプリスケーラ レジスタがあり、これは分周係数を直接決定するものではありません。 。バッファ レジスタまたはシャドウ レジスタもあります。これはプリスケーラ バッファです。このバッファ レジスタは、たとえば、ある瞬間にプリスケーラ レジスタを 0 から 1 に変更します。クロックの分周係数により、カウント周期内で前半と後半の周波数が異なります。したがって、カウントがカウントの半分に達しても、この変更はすぐには反映されず、このカウント サイクルが終了して更新イベントが発生するまで待機するように設計されています。プリスケーラ レジスタの値は変更される前にバッファ レジスタに渡されます。
  • 最後の行からわかるように、プリスケーラーは周波数を分周するためにカウントにも依存します。プリスケーラー値が 0 の場合、カウンターは常に 0 であり、プリスケーラー値が 1 の場合、カウンターは 0 を直接出力します。 1、0、1、0、1 とカウントし、0 に戻ると出力周波数はプリスケーラの値の 2 で分周されます。実際の分周係数には数値のオフセットがあります。

1.7 カウンタのタイミング

画像.png

  • カウンタのオーバーフロー周波数: CK_CNT_OV = CK_CNT / (ARR 1) = CK_PSC / (PSC 1) / (ARR 1)
  • CK_INT: 内部クロック 72MHz。
  • CNT_EN: カウンタ イネーブル、立ち上がりエッジで有効。
  • CK_CNT: カウンタークロック。分周係数が 2 であるため、この周波数は CK_INT を 2 で分周したものになります。その後、このクロックの立ち上がりエッジごとにカウンタが増加し、0036 に達すると、オーバーフローが発生します。 36 までカウントした後、別の立ち上がりエッジが発生し、カウンタがクリアされ、カウンタがオーバーフローし、更新割り込みフラグ (UIF) がセットされると更新イベント パルスが生成されます。 1 に設定すると、割り込みが要求されます。割り込みに応答した後、割り込みプログラムで手動でクリアする必要があります。

1.8 カウンタには、事前にインストールされたタイミング シーケンスがありません。

画像.png
オートローディングレジスタがFFから36に変更され、カウント値の目標値もFFから36に変更されているため、ここで36をカウントした後、そのまま更新されて次のカウントが開始されます。

1.9 カウンターにはタイミングが事前にインストールされています

画像.png
カウント途中でカウント目標値をF5から36に変更します。以下にシャドウ レジスタがあります。このシャドウ レジスタはまだ F5 なので、カウント対象は引き続き F5 までカウントされ、同時に変更される 36 がシャドウに渡されます。この変更は、サイクルが 36 の場合にのみ有効です。そのため、シャドウ レジスタを導入する目的は実際には同期です。つまり、値の変更と更新イベントを同期して発生させ、変更によるエラーを防ぐことができます。動作中に。

1.10 RCC クロックツリー

画像.png

  • クロックソース
    クロック生成回路には 4 つの発振源があります。
    (1) HSI: 内部 8MHz 高速 RC 発振器。
    (2) HSE: 外部 4 ~ 16MHz の高速水晶発振器 (水晶発振器とも呼ばれます) は、通常 8MHz に接続されます。
    (3) LSE: 外部 32.768KHz 低速水晶発振器。通常、RTC にクロックを提供します。
    (4) LSI: 最後に、ウォッチドッグにクロックを供給できる内部 40KHz 低速 RC 発振器があります。
    上記の 2 つの高速水晶発振器は、システム クロックを提供するために使用されます。AHB、APB2、および APB1 のクロックはすべて、これら 2 つの高速水晶発振器から得られます。これは、外部水晶発振器よりも安定しているというだけです。内部 RC 発振器を使用するため、通常は外部水晶発振器を使用します。

  • ST コンフィギュレーション クロック
    SystemInit 関数では、ST がクロックを設定します。まず、内部クロック HSI を開始し、システム クロックとして内部 8MHz を選択し、内部 8MHz クロックで一時的に実行します。次に、外部クロックを開始し、周波数逓倍のために PLL フェーズ ロック ループに入るように外部クロックを設定します。8MHz が 9 倍になり、フェーズ ロック ループの出力が安定した後、フェーズ ロック ループを選択します。をシステムクロックとして出力し、システムクロックを8MHzから72MHzに切り替えました。

  • CSSクロックセキュリティシステム
    CSS (クロック セキュリティ システム): クロック セキュリティ システムは、外部クロックの実行ステータスを監視し、動作を保証するために自動的に外部クロックを内部クロックに切り替えます。システムクロックを調整し、事故によるプログラムのスタック死を防ぎます。

  • クロック分配回路

    • AHB バス: まず、システム クロック 72MHz が AHB バスに入ります。AHB バスにはプリスケーラがあり、SystemInit で設定された分配係数は 1 であるため、AHB クロックは 72MHz になります。
    • APB1 バス: ここで設定された分配係数は 2 であるため、APB1 バスのクロックは 72MHz/2=36MHz になります。以下では、APB1 プリスケーラ係数 = 1 の場合、周波数は変化しません。それ以外の場合、周波数は変化しません。*2次に右側では、タイマー 2 ~ 7 に対して個別に開きます。ここでのプリスケーラー係数は 2 であるため、ここでの周波数は次のようにする必要があります。*2 , したがって、タイマー 2 ~ 7 につながるクロックは 72MHz です。したがって、アドバンストタイマ、一般タイマ、ベーシックタイマのいずれにおいても、内部基準クロックは72MHzとなります。
    • APB2 バス: APB2 の分周係数は 1 であるため、クロックは 72MHz です。次に、APB2 に接続されているクロックもオンになります。つまり、APB2 プリスケーラー係数 = 1 の場合、周波数は変化しません。それ以外の場合、周波数は変わりません。*2 。分周係数が 1 なので、タイマ 1 と 8 のクロックは 72MHz になります。
    • クロック出力部には出力制御用の AND ゲートがあり、プログラム内で外部クロック イネーブルを書き込みます。クロックをオンにするには、この位置に 1 を書き込みます。 AND ゲートを介してペリフェラルに出力できます。

2. TIM ライブラリの関数とコード

2.1 TIMライブラリ関数

// 恢复缺省配置
void TIM_DeInit(TIM_TypeDef* TIMx);

// 时基单元初始化
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

// 结构体变量赋一个默认值
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

// 使能计数器---运行控制
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);

// 使能中断输出---中断输出控制
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

/*-----------------时基单元的时钟选择---------*/
// 选择内部时钟
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);

// 选择ITRx其他定时器的时钟
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);

// 选择TIx捕获通道的时钟
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
                                uint16_t TIM_ICPolarity, uint16_t ICFilter);

// 选择ETR通过外部时钟模式1输入的时钟
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
                             uint16_t ExtTRGFilter);

// 选择ETR通过外部时钟模式2输入的时钟
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
                             uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);

/*--------------------------------------------------------*/
// 不是用来选择时钟的,单独用来配置ETR引脚的预分频器、极性、滤波参数的
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
                   uint16_t ExtTRGFilter);

// 用来单独写预分频值的
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);

// 用来改变计数器的计数模式
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);

// 自动重装器预装功能配置
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

// 给计数器写入一个值
void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);

// 给自动重装器写入一个值
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);

// 获取当前计数器的值
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);

// 获取当前的预分频器的值
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);

/*-------------获取标志位和清除标志位的------------*/
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);

ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);