ガレスタさんのDIY日記

電子回路、Web、組み込み、自作エフェクターを語るblog

(自分用メモ)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タイマーを有効にする

f:id:gsmcustomeffects:20170314022327p:plain

みたいな感じ

詳細設定をしていく

f:id:gsmcustomeffects:20170314022355p:plain

f:id:gsmcustomeffects:20170314022402p:plain

f:id:gsmcustomeffects:20170314022528p:plain

f:id:gsmcustomeffects:20170314022600p:plain

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

f:id:gsmcustomeffects:20170314022626p:plain

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

f:id:gsmcustomeffects:20170314022823p:plain

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

Ac6での作業

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

Mainに二行追加

f:id:gsmcustomeffects:20170314023017p:plain

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

f:id:gsmcustomeffects:20170314023111p:plain

動作させる

こんな感じで違う周期で点滅すればOK


こっから先細かい解説

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

プリスケーラについて

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

今回の例を示すと

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

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

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

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

f:id:gsmcustomeffects:20170314032417p:plain

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

主なレジスタ

f:id:gsmcustomeffects:20170314035004p:plain

f:id:gsmcustomeffects:20170314035014p:plain

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

DIERは割り込み及びDMA

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

CNTは現在のcounter値

PSCはプリスケーラ

ARRはカウンタピリオド値

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

f:id:gsmcustomeffects:20170314041001p:plain