2019年3月13日水曜日

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

STM32のUARTでprintf関数を使ってみました。

参考にした記事
「ガレスタさんのDIY日記」さんの「STM32でUARTをやってみる6(float型printfをUART経由で出力)
「@take-iwiw」さんの」「STM32F4 Discovery BoardとCube MXの環境構築、Lチカからprintfポーティングまで
「滴了庵日録」さんの「CubeMX環境でprintfを使う

実行環境

  • Nucleo-F446RE
  • STM32CubeMX Version 5.1.0
  • System Workbench for STM32 - C/C++ Embedded Development Tools for MCU Version: 2.8.1.201903050911

プロジェクト:
https://github.com/ryood/STM32Cube_Test/tree/master/SW4STM32/UART_printf_test1

UART自体の基本的な使い方は「STM32CubeとTrueSTUDIOでUART通信」にあります。

ソースコード(一部)

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

<stdio.h>をインクルードします。

/* USER CODE BEGIN PV */
#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 PV */

int __io_putchar()で、HAL_UART_Transmit()をラッピングするコードです。これによってprintf()内部でHAL_UART_Transmit()が呼ばれるようになります。


  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  const char msg[] = "CNT:";
  int cnt = 0;
  while (1)
  {
    /* USER CODE END WHILE */
 float fv = cnt * 0.01f;
 printf("%s\t%d\t%f\r\n", msg, cnt, fv);
 cnt++;
 fv += 0.01;
 HAL_Delay(1000);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

メインループ内で、printf()を呼び出しています。文字列、整数、浮動小数点数を使っています。

<追記:2019.03.13>

ソースコードの「fv += 0.01;」は無駄な演算です。

</追記>


Puttyで受信している様子


メモ:


printf()で浮動少数点数を使うと、「-u _printf_float」せよと、IDEでアラートが表示されます。[MCU GCC Linker]-[Miscellaneous]の[Linder flags]で「-u _printf_float」を指定します。


STM32CubeMX Ver.5.1.0では、Generate Codeすると「syscalls.c」は<projectフォルダ>/Srcに入っています。

0 件のコメント:

コメントを投稿