STM32 F401RE USART2 その1
開発環境
・評価ボード NUCLEO-F401RE
・IDE MDK-ARM V5 and STM32CubeMX
・OS windows 10 pro
・本
定番!ARMキット&PIC用Cプログラムでいきなりマイコン制御[DVD-ROM付き] (マイコン活用シリーズ)
- 作者:芹井 滋喜
- 発売日: 2016/01/29
- メディア: 単行本
UART: Universal Synchronous Receiver Transmitter
USART: Universal Synchronous Asynchronous Transmitter
といいます。
COMポート経由でデバッグが利用できる環境があるならば、最初にUARTプログラムデバッグを行ってから実際のプログラム開発を行うのが常套手段です。
NUCLEOではメインマイコンのUSART2がST-LINKのSTM32F103を通して仮想COMとして認識されるます。
ひとまずSTM32CubeMXの設定をします。
デフォルトでUSART2はPA2とPA3にST-LINKとの通信用に設定されています。
左側ConfigurationツリーのUSART2をSynchronousに変更します。
上側Configurationタブに移動し、ConnectivityのUSART2を選択します。
Baud Rate: 116200 Bits/s
Word Length: 8bit
Parity: None
Stop Bits: 1
に設定します。
次は、ConfigurationタブのNVICを選択します。割り込みの設定。
USART2 global interruptにチェックを入れます。
(System tick timerはすでにチェックされていることが確認できます。)
これで設定は完了です。
/* Includes ------------------------------------------------------------------*/ #include "stm32f4xx_hal.h" #include <stdio.h> #include <string.h> /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private variables ---------------------------------------------------------*/ USART_HandleTypeDef husart2; /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); void Error_Handler(void); static void MX_GPIO_Init(void); static void MX_USART2_Init(void); /* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ char sio_getc(void); // UARTから1文字取得 void sio_putc(char); // UARTに1文字を出力 void sio_puts(char *); // UARTに文字列を出力 char sio_getc() { char ch; while(HAL_USART_Receive(&husart2, (uint8_t *)&ch, 1, 1000)==HAL_TIMEOUT) ; return ch; } void sio_putc(char ch) { HAL_USART_Transmit(&husart2, (uint8_t *)&ch, 1, 1000); } void sio_puts(char *str) { HAL_USART_Transmit(&husart2, (uint8_t *)str, strlen(str), 1000); } /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ int main(void) { /* USER CODE BEGIN 1 */ int ch; /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART2_Init(); /* USER CODE BEGIN 2 */ sio_puts("F401RE-USART2\n"); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
putsでTeraTermに文字列を送信することが出来ました。
しかし、putc,getcの挙動が少し不安です・・・この関数を呼ぶと□がTeraTermに大量に現れて困る・・・文字の取得とエコーバックはできているので原因がよくわからない・・・w
あと、UARTのピン設定は一番最初に解説されているが、UARTの説明自体はかなり後半にあるのでピン設定がわかりにくい・・・というかぜんぜんやりかたがあやふやw