2021年1月8日金曜日

STM32CubeIDE: UARTでprintfを使う(浮動小数点数型あり)

STM32のネイティブな環境で開発しようと思って、STM32CubeMXとEclipseベースのIDEのSW4STM32やTrueStudioを試していましたが、STMicroよりCubeMXを含めた統合開発環境のSTM32CubeIDEが提供されているので、改めて各種機能を試してみたいと思います。ほぼほぼ自分用のあんちょこです。

トランジスタ技術2020年3月号でSTM32が特集されているので参考になります。



UARTでprintf()を使う


PCとのシリアル通信でprintf()を使う方法です。printf()内部で呼ばれる関数を定義してやることで、mbedのprintf()のように使えます。

STM32CubeIDE: Version: 1.5.1
Target Board: Nucleo-F446RE

手順


ボードを指定してプロジェクトを新規作成します。

特に設定しなくてもUART2が有効化されています。

そのまま「Project」-「Generate Code」(または ツールバーの「ギア」のアイコン)でコードを生成します。

コードが生成されたら「Project Exploer」で<project名>/Core/Src/main.cをダブルクリックして編集します。(すでにEditorで開かれていると思いますが)

printf()を使うために<stdio.h>をインクルードします。

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */

printf()内で間接的に呼ばれる__io_putchar()を定義します。

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
 HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
 return ch;
}
/* USER CODE END 0 */

メインループ内でprintf()を呼び出します。

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  const char msg[] = "COUNT:";
  int cnt = 0;
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  float fv = cnt * 0.01f;
	  printf("%s\t%d\t%f\r\n", msg, cnt, fv);
	  cnt++;
	  HAL_Delay(1000);
  }
  /* USER CODE END 3 */

printf()の書式でfloat型を使う


浮動小数点フォーマットのサポートが有効になっていない」とのエラーメッセージが表示されます。

The float formatting support is not enabled, check your MCU Settings from "Project Properties > C/C++ Build > Settings > Tool Settings", or add manually "-u _printf_float" in linker flags.

以下のようにプロジェクトを設定します。

メニューの「Project」-「Properties」で表示されるダイアログで


画像のように「Use float with printf from newlib-nano(-u _puritf_float)」にチェックを入れます。

プロジェクトのビルドと実行


メニューの「Project」-「Build project」 (またはツールバーの「🔨」のアイコン)でビルドします。

メニューの「Run」-「Run As」-「Stm32 Application」(またはツールバーの「▷」のアイコン)で実行します。

PC上のターミナルで文字列を受信


PC上のターミナルソフトRLoginで受信している様子


ビットレートはDevice Configuration Tool(MX)のConnectivity > USART2 > Parameter Settingsで変更できます。
 

0 件のコメント:

コメントを投稿