2019年1月19日土曜日

Nucleo-F446REでMCOを使ってみる

Nucleo-F446REの動作クロックを測定したく、MCO(Microcontroller Clock Output)を使ってみました。MCOはクロック信号をピンに出力するものです。

参考にしたのは以下の記事です。

「ガレスタさんのDIY日記」さんの「STM32のMCO機能を使ってGPIOからクロックを出してみる

「Thomas Rix」さんの「Configuring & measuring the MCO on STM32

STM32CubeMXとAtollic TrueSTUDIOは、以前「STM32CubeMX + Atollic TRUEStudioでLチカ」で動作させています。

STM32CubeMXでコードを生成


「Pinout & Configuration」で、「RCC」の「Master Clock Output1」と「Master Clock Output2」を有効化します。「Master Clock Output2」は「I2S_CKIN」とピンがかぶるらしく、アラートが出ますが今回はI2Sを使わないので無視しました。

「Pinout view」に

  • PA8 RCC_MCO_1
  • PC9 RCC_MCO_2

が現れます。

Nucleoボード上では下図のピンから出力されます。


「Clock Configuration」で出力するクロック・ソースを指定します。


赤枠で囲ったところがMCOの設定です。SYSCLK(84MHz)をそのまま出力したかったのですが、オシロスコープの帯域外の様でクロック信号を測定できなかったので「/2」して42MHzを出力しました。


ch1:D9/PA8(MCO1) ch2:PC9(MCO2)

使っているオシロスコープはOWON SDS7102で、仕様では100MHz帯域となっていますが、84MHzの信号は測定できませんでした

84MHzのSYSCLKをMCO2に出力


ch2:PC9(MCO2)

Nucleo-F446REは最大180MHzで動作しますが、分周して確認するしかないのかな(@@?

Atollic TrueSTUDIOでNucleoに書き込み


CubeMXで生成されたコードそのままでも動作しますが、動作確認のため一応メインループでLチカさせました。
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
HAL_Delay(100);
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
    /* USER CODE END WHILE */
void SystemClock_Config(void)関数内で
  HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLLCLK, RCC_MCODIV_2);
  HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_1);
と、それらしいHALが呼ばれています。

メモ:


「Atollic TrueSTUDIO for STM32」と「System Workbench for STM32」を同じパソコンにインストールしているとSTM32CubeMXとの連携が怪しくなります。同じEclipseベースのIDEのためでしょうか?CubeMXやTrueSTUDIOを最新版にアップデートするなどしているうちにうまく動作するようになりました。

TrueSTUDIO上で「デバッグ(ツールバーの虫のアイコン)」を開始したあと、デバッグパースペクティブで「再開(ツールバーの|>みたいなアイコン)」を押さないとターゲットボード上のプログラムが実行されない。

0 件のコメント:

コメントを投稿