CCWO Embedded Space

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

STM32 F401RE USART2 その2

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

USART2 その1では割り込みやDMAを使用しない方法を使用しました。
その2ではリングバッファを用いて受信を行います。
一般的なリングバッファを組んでお手本のとおりにやってみます。

/* 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 ---------------------------------------------------------*/
#define	RING_BUFFER_SIZE		16

char RingBuff[RING_BUFFER_SIZE];

int ReadPoint = 0;			// 読み出しポイント
int WritePoint = 0;			// 書き込みポイント
int DataSize = 0;				// 格納されたデータ・サイズ
/* 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 -----------------------------------------------*/
void PushData(uint8_t dat);		// 1Byteの格納
uint8_t PopData(void);				// 1Byteの取り出し
char sio_getc(void);					// UARTから1文字取得
void sio_putc(char);					// UARTに1文字を出力
void sio_puts(char *);				// UARTに文字列を出力
/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

void PushData(uint8_t dat)
{
	// これ以上格納できない場合はそのまま戻る
	if(DataSize >= RING_BUFFER_SIZE){
		return;
	}
	RingBuff[WritePoint] = dat;	// 書き込みポインタにデータを格納
	DataSize++;						// 保存サイズを1Byte増やす
	WritePoint++;
	// 終端に来たら、先頭に戻る
	if(WritePoint >= RING_BUFFER_SIZE){
		WritePoint = 0;
	}
}

uint8_t PopData(void)
{
	uint8_t ch;
	// データがない場合
	if(DataSize == 0){
		return 0;
	}
	ch = RingBuff[ReadPoint];	// 読み出しデータの取り出し
	DataSize--;
	ReadPoint++;
	// 終端に来たら先頭に戻る
	if(ReadPoint >= RING_BUFFER_SIZE){
		ReadPoint = 0;
	}
	return ch;
}

//=========================================================
//	受信割り込み
//=========================================================
uint8_t RxData;	// 受信データ格納領域

void HAL_USART_RxCpltCallback(USART_HandleTypeDef *huart)
{
	PushData(RxData);
	HAL_USART_Receive_IT(huart, &RxData, 1); //次の受信をスタート
}

char sio_getc()
{
	return PopData();
}

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 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 */
	HAL_USART_Receive_IT(&husart2, &RxData, 1);	// 受信スタート
	
	sio_puts("Serial_rb Test\n");
	sio_puts("Input key->");

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  ch = sio_getc();
	  if(ch > 0){
		  sio_putc(ch);
	  }
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

しかし・・・今度は白い□が大量に現れるだけだと・・・w
デバッグモードで確かめても、今度はputsすら動かくなったぞw全く同じ設定なのに・・・
ちょっとこれはもう少し情報集めてしっかりやってみます。

20160915の記事