CCWO Embedded Space

CCWOの日々の開発を発信するブログ

STM32 F401RE USART2 その1

開発環境
・評価ボード NUCLEO-F401RE
・IDE MDK-ARM V5 and STM32CubeMX
・OS windows 10 pro
・本

ファンクションジェネレータもしくは外部からの波形入力がいる10章(周波数の測り方),11章(パルス幅の測り方)は一旦おいておいて、デバッグが不便なのでUARTを先にやりたいと思います。
UART: Universal Synchronous Receiver Transmitter
USART: Universal Synchronous Asynchronous Transmitter
といいます。
COMポート経由でデバッグが利用できる環境があるならば、最初にUARTプログラムデバッグを行ってから実際のプログラム開発を行うのが常套手段です。
f:id:CCWO:20160915173832p:plain
NUCLEOではメインマイコンのUSART2がST-LINKのSTM32F103を通して仮想COMとして認識されるます。
ひとまずSTM32CubeMXの設定をします。
f:id:CCWO:20160915174646p:plain
デフォルトでUSART2はPA2とPA3にST-LINKとの通信用に設定されています。
f:id:CCWO:20160915174748p:plain
左側ConfigurationツリーのUSART2をSynchronousに変更します。
上側Configurationタブに移動し、ConnectivityのUSART2を選択します。
f:id:CCWO:20160915174924p:plain
Baud Rate: 116200 Bits/s
Word Length: 8bit
Parity: None
Stop Bits: 1
に設定します。
次は、ConfigurationタブのNVICを選択します。割り込みの設定。
f:id:CCWO:20160915175045p:plain
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 */

}

f:id:CCWO:20160915183514p:plain
putsでTeraTermに文字列を送信することが出来ました。
しかし、putc,getcの挙動が少し不安です・・・この関数を呼ぶと□がTeraTermに大量に現れて困る・・・文字の取得とエコーバックはできているので原因がよくわからない・・・w
あと、UARTのピン設定は一番最初に解説されているが、UARTの説明自体はかなり後半にあるのでピン設定がわかりにくい・・・というかぜんぜんやりかたがあやふやw