こんにちは、しゅうです。
今日は結構短いです!
今まで、HAL_UART_Transmit関数を使っていましたが、それをおなじみprintf関数で行うことができるのでご紹介します。
変数ごとにしか表示できなかったり、引数が多かったりと書いててちょっと面倒でしたので…
過去に先輩がこちらのブログで実践していました!使用しているSTMマイコンは違いますが、コードは全く同じように書いても問題なさそうです。
printf!
コードは前回の記事で使ったものを編集していきます。
最初に、stdio.hをmain.cにインクルードしましょう。
/* USER CODE BEGIN Includes */ #include "stdio.h" /* USER CODE END Includes */
次に__io_putcharという関数を定義します。この関数は、システムコールに関する記述があるsyscalls.cで使われます。main.cで以下のように定義することで、UART通信を標準出力に設定することができます。HAL_UART_Transmit関数の第1引数を自分で設定したUARTの番号になるように注意しましょう、僕の場合は2なのでhuart2となります。
/* USER CODE BEGIN 0 */ int __io_putchar(int ch) { HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 100); return ch; } /* USER CODE END 0 */
そして以下にコメントアウトした部分も含めたコードを記述します。追加したところはハイライトさせてます。最初に、setbuf関数で標準出力stdoutにバッファを使わないように設定します。こうしないとprintfがうまく機能しないらしいです。
そして今までHAL_UART_Transmit関数で頑張って表示させていたものを、printf関数に置き換えます。超楽ですね…
/* USER CODE BEGIN 2 */ uint32_t adc_val; // char msg[30]; // char low_msg[] = "Lower than constant number \n\r"; // char init[] = "Started! \n\r"; setbuf(stdout, NULL); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ // HAL_UART_Transmit(&huart2, (uint8_t *)init, sizeof(init), 100); printf("Started! \n\r"); while (1) { // initiate variables adc_val = 0.0; // memset(msg, '\0', sizeof(msg)); // ADC sequence HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1, 1000); adc_val = HAL_ADC_GetValue(&hadc1); // Adding sensor value to msg variable // sprintf(msg, "Received data: %d \n\r", adc_val); if(adc_val > 1){ // Outputting the sensor value via UART, if value is more than 1 // Toggle the LED between on and off HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // Transmit word string // HAL_UART_Transmit(&huart2, (uint8_t *)msg, sizeof(msg), 100); // Transmit sensor value // HAL_UART_Transmit(&huart2, (uint8_t *)adc_val, sizeof(adc_val), 100); printf("Received value %ld \n\r", adc_val); HAL_Delay(500); }else{ // Output low word string if value is lower or equal to 1 // Transmit word string // HAL_UART_Transmit(&huart2, (uint8_t *)low_msg, sizeof(low_msg), 100); printf("Too low %ld \n\r", adc_val); HAL_Delay(500); } /* USER CODE END WHILE */
ビルドと実行
ビルドして実際に実行した結果がこちらになります。いや本当に楽ですね、知れてよかったです!
まとめ
以上でUART通信でもprintf関数を使ってデバッグすることができるようになりました。
今後は、STM32CubeIDEに搭載されているデバッグ機能を使って定義した変数にどういう値が入っているか確認したいですね。
記事としてまとめられるようになったら公開します。
それではまた次回まで〜!