0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【チュートリアル】mruby/c ver4 をSTM32マイコンで動かす Chapter4: halの仕上げ

0
Posted at

島根県産業技術センター の東です。

mruby/c ver4 をSTM32マイコンで動かす記事
今回はその第4回、mruby/c のhalを仕上げます。

目標

mruby/c のプログラムで、puts や、printf を使えるようにする。

作業手順

デバイスの確認

プロジェクトを作成する段階で、ペリフェラルをデフォルト値で初期化しているため、UART2 を使う設定で初期化コードも自動生成されています。確認してみましょう。

  • エクスプローラでプロジェクトのフォルダを開き、mrubyc_v4.ioc をダブルクリックして CubeMX を開きます
  • CubeMXが起動したら、Categories > Connectivity > USART2 1 にチェックが入っていることを確認し、そこをクリックします。

20261018115502.png

画面表示より、以下の設定になっていることを確認します。

  • Mode Asynchronous
  • Hardware Flow Control : Disable
  • Baud Rate : 115200 Bits/s
  • Word Length : 8 Bits
  • Parity : None
  • Stop Bits : 1
  • Data Direction : Receive And Transmit
  • Over Sampling: 16 Samples
  • ICチップ表示の左下、USART_TX = PA2 と USART_RX = PA3 がアサインされている

実際に PA2 と PA3 がどこへ接続されているかをユーザーマニュアル(UM1724)で確認すると、デフォルトで ST-LINK 経由の USB Virtual COM ポートとして利用可能である旨が記載されています。

コンソール出力先を準備

Windowsでは TeraTerm を使うのが定番になっていますので、ここでもそれを使う前提で説明します。

TeraTerm を起動し、接続先でシリアルを選んだのち、ポート一覧から「STMicroelectronics STLink ...」を選びます。

20261018120544.png

メニューから、設定 > シリアルポート を選ぶと以下のダイアログが表示されますので、先ほど CubeIDEで確認したパラメータに合わせて設定します。
20261018120812.png

メニューから、設定 > 端末 を選ぶと以下のダイアログが表示されますので、以下の通りに設定します。
20261018121105.png

hal関数へ、UART2を使うよう追記

空の関数で作っておいた、hal_write で、UART2 を使うように追記します。
CubeIDEのウインドウに戻り、左ペイン Project Explorer から、Core > mrubyc とたどり、start_mrubyc.c をダブルクリックして開きます。

空だった mrbc_hal_write 関数を、以下の通り書き換えます。

Core/mrubyc/start_mrubyc.c
/*! mruby/c hal
*/
int mrbc_hal_write(int fd, const void *buf, int nbytes)
{
  extern UART_HandleTypeDef huart2;
  HAL_UART_Transmit( &huart2, buf, nbytes, HAL_MAX_DELAY );

  return nbytes;
}

また、libc の標準出力が使えると便利な場合があるかもしれないので、hal_write 関数の下に、以下の _write 関数も定義しておくと良いです。

Core/mrubyc/start_mrubyc.c
int _write(int file, char *ptr, int len)
{
  return mrbc_hal_write(file, ptr, len);
}

参考
残りのhal関数、hal_flush() と hal_abort() は、今後のバージョンで使う予定にしており、現段階では積極的に使っていませんので、空のままで大丈夫です。

mruby/c プログラムの書き換え

では、puts が使えるようになったか確認するために、mruby/c プログラム側も puts を使うよう書き換えます。

左ペイン Project Explorer から、Core > mrubyc とたどり、task1.rb をダブルクリックして開きます。

以下のように、書き換えます。

Core/mrubyc/task1.rb
10.times {|i|
  puts "Hello, mruby/c #{i}"
  sleep 1
}

実行

メニューから、Run > Run を選んでターゲットへ書き込みます。

2026-10-18123038.gif

正常に、文字列 Hello, mruby/c とカウントアップする数字とが10行ほど表示されたでしょうか。

mruby/c の標準出力だけではなく、例外発生時の出力も表示されるようになるので、例えば以下の通り存在しない関数をコールした場合、

Core/mrubyc/task1.rb
not_exist_func()

TeraTerm には、その旨が表示されるようになります。

Exception(vm_id=1): undefined local variable or method 'not_exist_func' for Object (NoMethodError)

浮動小数点値の表示

task1.rb を、次のように書き換えて実行してみます。

Core/mrubyc/task1.rb
printf "ABC %d\n", 1234
printf "PI=%.2f\n", 3.141592

すると、以下の通り整数は表示されますが、浮動小数点は表示されません。

ABC 1234
PI=

STM32の開発環境では、デフォルトで浮動小数点の表示サポートが無効化されているため、設定を変更します。

  • メニューから、Project > Properties を選び、ダイアログを開きます
  • ダイアログ左ペインの C/C++ Build > Settings をクリックします
  • 右ペインの Tool Settings タブをクリックし、MCU Settings をクリックします
  • Use float with printf from newlib-nano 欄のチェックをつけます

20261018124309.png

再度ビルド、書き込みをすると、今度は表示されるようになります。

ABC 1234
PI=3.14

おまけ - IDE内にシリアル出力を表示

いつの間にか Eclipse (だと思う) が、シリアル出力のウインドウ内表示をサポートしていました。ただし、改行コードの指定など全くできないようなので、今回の mruby/c での実験では使いづらく、ここではやり方の紹介にとどめます。

方法

Console ペイン右端にあるアイコンから、以下の画像を参考に、Open Console アイコンをクリックし、開いたメニューから Command Shell Console を選びます。

20261018143704.png

Select Remote Connection ダイアログが開くので、Connection Type 欄で Serial Port を選んでから、[New] ボタンをクリックします。

20261018143813.png

New Serial Port Connection ダイアログが開くので、以下の図を参考にパラメータを設定します。

20261018143832.png

これで、IDE画面内に、シリアル出力の表示ペインができます。

おわりに

ファイル全体は、GitHub リポジトリにありますので、そちらをご覧ください。

今回は、hal のコンソール出力をサポートしました。
これで、mruby/c 側で何か意図しないことが発生したときに手がかりを表示させることができるようになったので、開発段階では非常に有用かと思います。

  1. 画面上は USART と表示がされていますが、ここでは UART と同じものです。記事では、UARTで統一します。 ↩

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?