2020年4月16日木曜日

STM32でDCCを作る方向で (2) まずはタイマと割り込みとLEDチカ

告知です.
コミケ99にて当社のDDC/DACを頒布いたします.
  日付   2021年12月31日(金) 東地区 テ-40b  東5ホール
  サークル名    bangflat
コミケにお越しの際はお立ち寄りいただけますとありがたいです.
商品紹介ページを作りました.

ーーーー
さぁ、今日も張り切って行きましょう.在宅勤務だからダレてるそこの人、シャキッとしろよ~  (エガちゃんみたいなのでやめときます)

デバイス変更とかやめてくれぇ~、、、という葛藤を抑え込んでEZ-USB→STM32へデバイス変更することにしたわたくし.

最近のSTM32のIDEを知らないし、ライブラリも知らない.work flowが全然わからん.

そういう時にやるのは、タイマ割り込みでLEDチカチカを動かすことだ.これでwork flowを知れるのと、ライブラリも少々知ることができる.

INDEXページへ

------
前回チロッと書いた  STM32CubeIDE、STM32CubeMX を使う.インスト必要.

それでは開始.まずはSTM32CubeIDEを起動する.

【新project】
↓新projectを作る.

↓少し待つと「target selector」が起動する.
ここでやりたいのは、NUCLEO-F401RE を使うことである.①②③を操作する.

↓project名を入力するよう促されるのでここではtest2とした.

↓peripheralをデフォにしといていい?と訊かれる.これの意味は、後で使うSTM32CubeMXの設定をデフォにしとくよという意味だ.YESでいい

↓しばらく待たされる.裏でSTM32CubeMXが動いてるのだろう.やがてSTM32CubeIDE画面が開くのだが、わけわからん小窓ばっかり開いて操作に窮するかもしれないので、perspective設定のやり方を知っておいたらいいかもしれない.
window→perspective→open perspective→other
↓C/C++(default)を選ぶ
↓ようやく、見慣れたIDE画面っぽく表示された

【雛形ができた】
ここまでで、新projectの開始となったわけであるが、STM32CubeMXが何やらデフォ設定してくれているのでまずはそれをみてみよう.

Core→Src→main.c を開いてみる.
こんなのがproto宣言されている.
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
これらは、Clock treeの初期化、GPIOの初期化、UARTの初期化 ルーチンだ.
STM32CubeMXはデフォでこれらのperipheralをオンにしたという事である.
もちろん後からカスタマイズできるので心配ゴム用.

さらにmain.cを下へ降りると、いつものloopが居る.ここにuser programを書くのだ.
  while (1)
  {
      ここに書く
  }

というわけで、STM32CubeMXがperipheralを初期化するルーチンと、main()の雛形を吐き出してくれたのだとわかった.

【Peripheralの編集】
当面の目標は、タイマ割り込みでLEDチカチカであるから、UARTなんか不要である.
また、雛形に無いタイマを追加しなくちゃいけない.
そのためには、STM32CubeMXを使わなくちゃいけない.

↓STM32CubeMXを別窓で開く必要はない.test2.iocを開けばよい.
ここで軽く注意がある.執筆時点のSTM32CubeIDEが対応しているSTM32CubeMXのversionは5.6.0だった.しかし、DL可能な最新版は5.6.1だった.version不整合で動かなかった.STM32CubeMX 5.6.0をインストするしかなかった.

↓test2.iocタブがSTM32CubeMXそのものである.

↓まずは不要なUARTを削除しようか.要するに③Disableにすれば殺せるのだ.便利でいいね.

↓次はタイマを追加しようか.これにはちょっとタイマの知識が必要だ.
いまやりたいのは、
  1)タイマが一定周期で自走する
  2)タイマが一定周期で割り込み発生
  3)おまけでLEDチカチカ
こういう仕様である.
これを実現できるのは、Output Compareというモードなのである.マイコンタイマには一般的なモードだ.他にもいろいろな一般的モードがあるのだが紙面の都合で解説は略させていただく.
①timer
②とりあえず末席のTIM11
③Activate
④output compare CH1
⑤PB9にCH1出力ピンが自動でアサインされる
⑥割り込みを有効にする

↓次は割り込み動作確認のためにGPIOを1つ使う設定.
PC8を出力ピンに設定したいとする.
PC8でマウスクリックするとセレクタが出てくるのでGPIO_Outputを選ぶ.簡単.

↓clock configurationタブを開くと、タイマに供給されるclockは84MHzになっているとわかる.変更はできるが今はこのままとする.
↓タイマ設定に戻る.
84MHz ÷ 840 ÷ 10000 = 10Hz
Enableは、クルクル回れの意味がある.
Tggle on matchは、PB9を10Hzでトグルせよの意味=5Hz
Pulse=0は、カウンタ値0の時にトグルせよの意味

↓雛形を吐き出させる.
編集済みのmain.cなどは上書きされてしまうので注意が必要だ.
USER CODE BEGIN~ENDの間に書けばMXで上書きされない.

【code編集】
雛形をコンパイルしただけでは動かない.main()とタイマ割り込みの飛び先にcodeを追加してあげる必要がある.

main.c
  /* USER CODE BEGIN 2 */
  HAL_TIM_OC_Start(&htim11, TIM_CHANNEL_1);
  HAL_TIM_Base_Start_IT(&htim11);

  /* USER CODE END 2 */
タイマ11を動かすのと、割り込みを動かす意味がある.

stm32f4xx_it.c
void TIM1_TRG_COM_TIM11_IRQHandler(void)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_8);
HAL_TIM_IRQHandler(&htim11);
}
割り込み処理のお仕事として、PC8をトグルしてもらう.10Hzで割り込むので、その度にPC8をトグルするので、LEDは5Hzでチカチカする予定.

【RUN】
コンパイルして焼く.初回のみダイアログが出るかもだがOKを押す.

↓はいっ、2つのLEDが交互にチカチカしております.
PB9は、タイマのhardwareでチカチカさせている.
PC8は、割り込み処理でチカチカさせている.

-----
work flowはわかった.
でも、HALライブラリがまださっぱり.
HALのdocumentは1800ページもあるこれらしい.

音よ出でよ!

かしこ

1 件のコメント:

  1. I think it’s cheap, it’s fun to watch, but you can try it before I bought it at mokoPCB.

    返信削除