趣味のマイコンいじり

安価なマイコンを利用して作成したアプリの紹介です。

STM32F103C8 ボードへのプログラムの移植について調べて見ました

STM32F103C8ボードを利用する時の他のボード用のプログラムからの移植の
難易度に関して調べて見ました。例として先に検討したSTM8S103F3ボード用の
ものから動作の確認のしやすい表示デバイスを利用したものを3つ選んで行いました。
検討の結果、移植元のプログラムにクラスを利用している場合はC++への対応が
必要で、SW4STM32のIDEを利用すればそれらが容易に行える事が判りました。
以下がその検討状況となります。

<STM32F103C8 ボードへの移植例>
  STM8S103F3の時にArduinoからライブラリを移植して作成した次の3つの
  プログラムをSTM32F103C8のボードへ移植して見ました。

  <Nokia 5110 LCD>  --- original
    イメージ 1 

  <LCD1602/2004>  --- original
    イメージ 2
  <0.96"/1.3" OLED>  --- original
     イメージ 3

<移植作業の流れ>
  ArduinoのライブラリはC++をベースに作られていて、STM8S103F3ボード用に
  移植する時には、IARのIDEの設定をC++にすれば対応できました。
  それに対して、STM32F103C8のボードのI/Oのコンフィグレーションに
  STM32CubeMXを利用した場合、生成コードはC++に対応していない為にC++
  に変換する必要が有ります。操作性の良さからCoIDEの利用を考えていたのですが
  簡単なC++への変換ではリンクエラーとなりSTM32CubeMXの生成コードの
  CoIDEでの利用には一連の複雑な導入作業が必要な事が判りました。他にこの
  C++へのコード変換を簡単に対応できるIDEを検討した結果、SW4STM32の
  IDEC++への変換機能が有り、調べた結果これが使える事が判りました。
  その為、STMのチップに関してはIDEとしてSW4STM32を利用する事とし、
  その場合の一連の作業は次の様にしました。

   1.STM32CubeMXによるI/O割り付けと基本コードの作成
         イメージ 4

   2.SW4STM32でのC++コードへの変換
         イメージ 5

   3.CastのC++への対応(ワーニング対応、そのままでもOK)
         イメージ 6

   4.マイクロ/ミリ秒のディレイ用タイマー関連の追加
         イメージ 7

   5.マイクロ/ミリ秒のディレイ用タイマー関数の追加   
         イメージ 8

   6.デバッガ用のスクリプトファイルの修正
         イメージ 9

   7.アプリケーション個別の処理を追加
        移植元のプログラムからI/O関連部分の切り離して等価機能の関数に置き換え
        イメージ 10

<テスト内容と結果>
    テストとしは、以上の移植作業で3つのSTM8S103F3ボード用に開発した
    アプリケーションをSTM32F103C8のボード上で実行させる事としました。

    その結果としては次の様なものでした。

    1.3つのアプリケーションとも問題なく移植する事ができました。
    2.STM32CubeMXは、ポートレベルの初期値まで設定する事ができ、
          とても重宝である事が判りました。
    3.コード用メモリ使用量はビット長の違いからか、STM8Sに比べてかなり
          多くなりました。(2~3倍程度)
    4.速度に関しては、72MHzで動作できる為かなり速くなっている様に
          思えました。
    5.RAMの容量が十分有るため、STM8Sの時は半分づつ書いていた描画も
          フルで書ける様になり、もっと高度な描画処理も可能と思いました。
    6.IDEとしては、STM32CubeMXの出力をC++コードに変換する必要が
          有り、SW4STM32を利用すればこれらの一連の作業が簡単に行える事が
          判りました。

  [コード] 
   コードは次のURLからダウンロード可能です。(開発環境に関してはこちらの
   記事
を参照して下さい。)

     Code download URL :  https://www.dropbox.com/s/nrsjnc6ggegpxzn/AC6_Porting_sample.zip?dl=0
      
 [動作状況]