STM32資料 基礎編 3

シリアル通信でデータを受信しよう(割り込み処理)

前回と同じようにシリアル通信を受信するコードを書くことができる

しかし、LEDをつけている間など他の処理をしている間に来たデータについては取りこぼしてしまう

そこで今回は、割り込み処理という手法を使ってデータを取りこぼさないようにしてみよう

今回やること

前回と同じ流れなので、資料に沿って進めてね

作業の流れ

ピンの割り当て

今回もUSART2を使うので、前回と同じようにPA2とPA3に割り当てをしておこう

割り込みの設定

USART2の設定からDMAを追加しよう

ピンの詳細な設定は、画面左から選ぶことができる

小さくて見えない時は縁にカーソルを合わせて拡大してね

設定の場所

設定の内容

プログラム

割り込み受信の開始

HAL_UART_Receive_DMA(&huart2, receive_buffer, len);

この関数の引数

前回扱った送信関数との違いは、最大時間の引数が消えているだけなので同じように使えるよ

引数名 変数型 内容
&huartx UART_HandleTypeDef* UARTのポインタ(xはUARTの番号)
Data uint8_t* 受信するデータのポインタ
Len uint16_t 受信するデータ長
DMAとは

割り込み受信後の処理

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

この関数の引数

この関数の引数はこちらから変える必要はないので毎回コピペで大丈夫

どのUSARTで受信したがが、*huartに入っているのでif文を使って判定することができる

引数名 変数型 内容
&huart UART_HandleTypeDef* UARTのポインタ(xはUARTの番号)

この関数は、データを受信したとき(割り込み受信が完了したとき)に自動で呼び出される

この関数内に受信後の処理(受信したデータを判定など)を書くことで、受信後すぐに処理ができる

サンプルコード

実際にDMAを使って受信したデータを送り返すコードを作成した

TeraTermでアルファベット1文字を送信して、同じ文字が帰ってくることを確かめてみよう

#include "wrapper.hpp"
#include "usart.h"  

uint8_t data[1];

void init(){

    //割り込みの開始
    HAL_UART_Receive_DMA(&huart2, data, 1);
}            
void loop(){

}
//データを受信したら呼び出される
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){

    //受信したデータを送り返す
    HAL_UART_Transmit(&huart2, data, 1, 1000);

    //割り込み受信の再開
    HAL_UART_Receive_DMA(&huart2, data, 1);

}
TeraTermでのデータ送信方法

終わりに

今回は、割り込み処理を使ったデータ受信について紹介しました!

リンク

・メインページ

・前のページ

・次のページ