STM32 F401RE USART2 その2
開発環境
・評価ボード NUCLEO-F401RE
・IDE MDK-ARM V5 and STM32CubeMX
・OS windows 10 pro
・本
定番!ARMキット&PIC用Cプログラムでいきなりマイコン制御[DVD-ROM付き] (マイコン活用シリーズ)
- 作者:芹井 滋喜
- 発売日: 2016/01/29
- メディア: 単行本
その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の記事