参考にした記事
「ガレスタさんの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 件のコメント:
コメントを投稿