Nucleo ボードの USB コネクタに対応するシリアルポート受送信割込みで,複数のキャラクタ受送信をサポ-トするクラス.   このライブラリを登録した際のプログラム: Demo_F446_AD_DA_Ctrl.

Dependents:   F446_FunctionGenerator F446_UpSampling_GraphicEqualizer F446_UpSampling_ReverbSystem F446_UpSampling_FrqShifter_Weaver ... more

Committer:
MikamiUitOpen
Date:
Tue Sep 18 00:13:29 2018 +0000
Revision:
4:fb847a82f735
Parent:
0:6b652858f92d
Child:
5:151d281afa55
5: defined namespace Mikami.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:6b652858f92d 1 //-------------------------------------------------------------
MikamiUitOpen 0:6b652858f92d 2 // Nucleo ボードの USB コネクタに対応するシリアルポート送信割込みで
MikamiUitOpen 0:6b652858f92d 3 // キャラクタの送信をサポ-トするクラス
MikamiUitOpen 0:6b652858f92d 4 //
MikamiUitOpen 0:6b652858f92d 5 // ボーレートのデフォルト値は 9,600 boud
MikamiUitOpen 0:6b652858f92d 6 //
MikamiUitOpen 4:fb847a82f735 7 // 2018/09/18, Copyright (c) 2018 MIKAMI, Naoki
MikamiUitOpen 0:6b652858f92d 8 //-------------------------------------------------------------
MikamiUitOpen 0:6b652858f92d 9
MikamiUitOpen 0:6b652858f92d 10 #include "SerialTxIntr.hpp"
MikamiUitOpen 0:6b652858f92d 11
MikamiUitOpen 4:fb847a82f735 12 namespace Mikami
MikamiUitOpen 0:6b652858f92d 13 {
MikamiUitOpen 4:fb847a82f735 14 // コンストラクタ
MikamiUitOpen 4:fb847a82f735 15 SerialTxIntr::SerialTxIntr(Serial &tx) : tx_(tx)
MikamiUitOpen 4:fb847a82f735 16 {
MikamiUitOpen 4:fb847a82f735 17 tx_.attach(callback(this, &SerialTxIntr::TxIsr), Serial::TxIrq);
MikamiUitOpen 4:fb847a82f735 18 }
MikamiUitOpen 0:6b652858f92d 19
MikamiUitOpen 4:fb847a82f735 20 // 送信データ書き込み
MikamiUitOpen 4:fb847a82f735 21 void SerialTxIntr::TxWrite(char c)
MikamiUitOpen 0:6b652858f92d 22 {
MikamiUitOpen 4:fb847a82f735 23 USART2->CR1 &= ~USART_CR1_TXEIE; // 送信割込み禁止
MikamiUitOpen 4:fb847a82f735 24 // 送信レジスタ (DR) が空でかつ送信バッファが空かどうか調べる
MikamiUitOpen 4:fb847a82f735 25 if ( que_.empty() && // 両者が空の場合
MikamiUitOpen 4:fb847a82f735 26 ((USART2->SR && USART_SR_TXE_Msk) == USART_SR_TXE) )
MikamiUitOpen 4:fb847a82f735 27 USART2->DR = c; // 送信レジスタにデータを書き込む
MikamiUitOpen 4:fb847a82f735 28 else // 少なくとも一方が空ではない場合
MikamiUitOpen 4:fb847a82f735 29 que_.push(c); // 送信バッファにデータを格納
MikamiUitOpen 4:fb847a82f735 30 USART2->CR1 |= USART_CR1_TXEIE; // 送信割込み許可
MikamiUitOpen 0:6b652858f92d 31 }
MikamiUitOpen 4:fb847a82f735 32
MikamiUitOpen 4:fb847a82f735 33 // シリアルポート送信割込みサービスルーチン
MikamiUitOpen 4:fb847a82f735 34 void SerialTxIntr::TxIsr()
MikamiUitOpen 4:fb847a82f735 35 {
MikamiUitOpen 4:fb847a82f735 36 if (!que_.empty())
MikamiUitOpen 4:fb847a82f735 37 {
MikamiUitOpen 4:fb847a82f735 38 USART2->DR = que_.front(); // 送信用バッファから取り出したデータを送信レジスタへ書き込む
MikamiUitOpen 4:fb847a82f735 39 que_.pop(); // 先頭のデータを消去
MikamiUitOpen 4:fb847a82f735 40 }
MikamiUitOpen 4:fb847a82f735 41 else
MikamiUitOpen 4:fb847a82f735 42 USART2->CR1 &= ~USART_CR1_TXEIE; // 送信割込み禁止
MikamiUitOpen 4:fb847a82f735 43 }
MikamiUitOpen 4:fb847a82f735 44
MikamiUitOpen 4:fb847a82f735 45 // static メンバの実体の宣言/初期化
MikamiUitOpen 4:fb847a82f735 46 queue<char> SerialTxIntr::que_;
MikamiUitOpen 0:6b652858f92d 47 }