STM32のベーシックタイマー(TIM6/TIM7を使う)

Basic timer (TIM6/TIM7)

見出しの通りベーシックなタイマである。
STの中では一番チープなタイマである。(つか他のが高機能かつ複雑怪奇w

  • 16-bit オートリロードアップカウンタ
  • 16-bit プログラマブルプリスケーラ(1-65535)
  • Interrupt/DMA generation on the update event: counter overflow(カウンタのオーバーフローで割り込み又はDMAの生成)

要は単純に時間はかったりカウンタが一定値に達した時に割り込みリクエストできる機能があるというやつ。

主に思いつく使い方

  • タクトスイッチの入力を一定間隔で見に行くことで簡単なチャタリング除去
  • ADCと組み合わせて一定間隔でサンプリング値をUARTで送信とか

割り込みありきな使い方しか思いつかないが
エフェクターに使うとなるとタップテンポの感覚の計測とかかな・・・・・

使い方

さっそく使い方を見ていこう

今回はSTM32F303(Nucleo32から評価ボードが出てる)でやって行こうと思う

内容としては以下の感じ

  • TIM6/TIM7両方使って別周期で割り込み
  • 両方の割り込みハンドラ内でLEDをちかちかする。

いたって簡単だ。

CubeMXを起動する

手順

  1. Nucleo32タブで今回使うやつを選ぶ
  2. GUIピンコンフィグで設定
  3. TIM6/TIM7タイマーを有効にする

みたいな感じ

詳細設定をしていく

タイマーペリフェラルのクロックはこんな感じになっている。


次に割り込みとかの設定をしていくよ

終ったらジェネレートする。

Ac6での作業

こっからはほとんどすることない。

Mainに二行追加

stm32f3xx_it.cのハンドラ内にLチカ処理を書く

こっから先細かい解説

まあ単に動かしたい人はここは読まなくていいです。
読みたい人だけ読んで

プリスケーラについて

プリスケーラはなんというか分周器です。
これがないと速攻カウンタがオーバフローするので入ってくるクロックを遅くする役目を担っています。

今回の例を示すと

{ \displaystyle
freq[1/sec] = (Tim_{Clock}/Prescaler)/CounterPeriod
}

{ \displaystyle
freq[1/sec] = (64000000/10000)/6400
}

ここで9999は0を含めでなので10000
TimClockはSystemCoreClockから計算できるのでプリスケーラ値はSTのサンプルではこうなっています。

uwPrescalerValue = (uint32_t)((SystemCoreClock/ 2) / 10000) - 1;

というわけなんで1秒間で6400までカウントアップしてリロード値と一致するのでそこで割り込みがかかります。

主なレジスタ

CR1レジスタが基本設定項目でCR2はトリガイベントの設定

DIERは割り込み及びDMA

SRはカウンタ一致でbitが立つReadレジスタ

CNTは現在のcounter値

PSCはプリスケーラ

ARRはカウンタピリオド値

実際に動かしてブレークしてIOレジスタ見てみるとこんな感じ