[電子工作]TrueSTUDIO(STM32の開発環境)の使い方

ーーーー目次ーーーー

1.STM32の性能を発揮するためには?

2.Atollic TrueSTUDIOを使ってみよう

3.プロジェクトの作り方

4.基本的なコマンド

ーーーーーーーーーー

1.STM32の性能を発揮するには?

    上記の通り、Arduino IDEのSTM32開発環境で開発可能ですが、STM32の性能が発揮できません。

    全ての機能を使うためには、専用のコンパイラが必要です。

 

2.Atollic TrueSTUDIOを使ってみよう

    STM32のソフト開発環境として、mbedやTrueSTUDIOがあります。mbedはArduino IDEに近い

    感じで開発が行えそうですが、私はTrueSTUDIOを使ってみました。

    Atollic TrueSTUDIOは現在、STMicroが買収したためSTM32の標準Cコンパイラと言えると思います。

    STM32を搭載したボードであれば何でも使え、ハードを生かしたソフトが開発できるはず(!)です。

    特徴は次の通り。

     ・IDEはEclipseベース。

     ・ST-Linkでデバッガを使うことができる。

 

3.プロジェクトの作り方

    様々な方法がありますが、各端子の機能を設定したり、SPIやI2C等のハードウェア設定を

    簡単に行いたい場合、STM32CubeMXを使うのが良いと思います。手順は次の通り。

    (1)右上のMXと書かれたアイコン「STM32CubeMX」を押す。

     

 

    (2)STM32CubeMX画面で、NewProjectのACCESS TO BOARD SELECTORを押す。

    (3)New Project from a Board画面で、ボード又はMCUを選択し、StartProjectを押す。

 

    (4)Board Project Options画面で、「はい」を選ぶ。

 

    (5)Pinout & Confgurationで、使用する端子を左クリックし、端子の機能を選択する。

      その後、各種ハードウェアの設定を行う。

      systemCore : DMAやGPIOなど

      Analog : ADCやCOMPなど

      Connectivity : I2CやSPIなど

 

    (6)ProjectManagerで、プロジェクト名、保存するフォルダーを設定し、Toolchain/IDEはTrueSTUDIO

      を選ぶ。

 

    (7)GENETATE CODEを押し、CodeGenerationはどれを選んでもOKです。なお、Pinoutやハードの設定

      を変更したら、毎回、GENERATE CODEを押す必要があります。

 

    (8)右上のCと書かれたアイコン「C/C++」を押す。

     

 

    (9)STM32 workspace画面の、プロジェクト・エクスプローラーから作成したプロジェクトを選び、

      Srcの下を見ると、設定したピンアサイン、ハード設定のひな型が書かれた「main.c」ができています。

 

    (10)「main.c」を書き換えます。ここで注意点があります。

      まず、コードの中のコメントは絶対に消さないで下さい。

      また、必ず、「USER ??? BEGIN」と「USER ??? END」のコメントの間に自分のコードを書いて下さい。

      (5)〜(7)のSTM32CubeMXで、ピン設定や、各種回路の設定を変更した時、ユーザーコードを

      保存するためで、これ以外の場所に書かれたコードは消えてしまいます!

      その後、トンカチのアイコン「Build」を押すとコンパイルされます。

      エラーが発生したファイルには赤×がつき、その行は赤くなっているので、修正して下さい。

     

 

    (11)虫のアイコン「debug」を押すと、プログラムがボードに転送され、デバッガが起動します。再開(F8)

      を押すと、転送したソフトが実行されます。

      終了(Ctrl+F2)を押すと終了し、C/C++画面に戻ります。

     

 

    (12)以降、(10)と(11)を繰り返し、

 

4.基本的なコマンド

    下記に、よく使うコマンドを記載します。

    詳しくは、STMicroが公開しているマニュアルをご覧ください。

  ・GPIO : デジタルの入出力

   GPIO_PinState HAL_GPIO_ReadPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)

     :GPIOの値を読み出す

   void HAL_GPIO_WritePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

     :GPIOに値を設定

   void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)

     :GPIOの値を反転する

 

  ・PWM : パルス出力

   ちょっと困ったが、TimerのLPTIMを使うとPWM出力が可能なようです。でも、パルス数を

   前もって設定できないようで、自分でカウントする必要がありそうです。

   HAL_StatusTypeDef HAL_LPTIM_PWM_Start (LPTIM_HandleTypeDef * hlptim, uint32_t Period, uint32_t Pulse)

     :PWM出力開始

   HAL_StatusTypeDef HAL_LPTIM_PWM_Stop (LPTIM_HandleTypeDef * hlptim)

     :PWM出力停止

   HAL_StatusTypeDef HAL_LPTIM_OnePulse_Start (LPTIM_HandleTypeDef * hlptim, uint32_t Period, uint32_t Pulse)

     :1ショットパルスの出力開始

   HAL_StatusTypeDef HAL_LPTIM_OnePulse_Stop (LPTIM_HandleTypeDef * hlptim)

     :1ショットパルスの出力停止

 

  ・ADC : アナログ入力

   正しい使い方は分からないが、現状、HAL_ADC_Start()、HAL_ADC_GetValue()、HAL_ADC_Stop()

   を繰り返さないと、変換できない。

   HAL_StatusTypeDef HAL_ADC_Start (ADC_HandleTypeDef * hadc)

     :A/D変換開始

   uint32_t HAL_ADC_GetValue (ADC_HandleTypeDef * hadc)

     :A/D変換した値の読み出し(bit精度はSTM32CubeMX等で設定)

   HAL_StatusTypeDef HAL_ADC_Stop (ADC_HandleTypeDef * hadc)

     :A/D変換終了

 

  ・SPI : クロック同期の高速シリアルインタフェース(一般に、数Mbps〜100Mbpsで使われる)

   HAL_StatusTypeDef HAL_SPI_Transmit (SPI_HandleTypeDef * hspi, uint8_t * pData, uint16_t Size, uint32_t Timeout)

     :SPIの送信(CSなどは、GPIOの出力として制御すること)

   HAL_StatusTypeDef HAL_SPI_Receive (SPI_HandleTypeDef * hspi, uint8_t * pData, uint16_t Size, uint32_t Timeout)

     :SPIの受信(CSなどは、GPIOの出力として制御すること)

 

  ・I2C : I2C又はSMBusなどと呼ばれている2線シリアルバス

       (100kbpsのスタンダードモードと400kbpsのファーストモードが一般的)

   HAL_StatusTypeDef HAL_I2C_Master_Transmit (I2C_HandleTypeDef * hi2c, uint16_t DevAddress, uint8_t * pData, uint16_t Size, uint32_t Timeout)

     :I2Cのマスタとして送信

   HAL_StatusTypeDef HAL_I2C_Master_Receive (I2C_HandleTypeDef * hi2c, uint16_t DevAddress, uint8_t * pData, uint16_t Size, uint32_t Timeout)

     :I2Cのマスタとして受信

   HAL_StatusTypeDef HAL_I2C_Slave_Transmit (I2C_HandleTypeDef * hi2c, uint8_t * pData, uint16_t Size, uint32_t Timeout)

     :I2Cのスレーブとして送信

   HAL_StatusTypeDef HAL_I2C_Slave_Receive (I2C_HandleTypeDef * hi2c, uint8_t * pData, uint16_t Size, uint32_t Timeout)

     :I2Cのスレーブとして受信

 

  ・ウェイト/遅延 : タイマー待ち

   void HAL_Delay (__IO uint32_t Delay)

     :Delay(ms)待つ

 

Arduinoの紹介はこちら。 

 

Arduino IDEで液晶パネル、タッチパネル、SDカードを使う方法は、こちら。

 

ESP32の詳細はこちら。