Nucleo ボードの USB コネクタに対応するシリアルポート受送信割込みで,複数のキャラクタ受送信をサポ-トするクラス. このライブラリを登録した際のプログラム: Demo_F446_AD_DA_Ctrl.
Dependents: F446_FunctionGenerator F446_UpSampling_GraphicEqualizer F446_UpSampling_ReverbSystem F446_UpSampling_FrqShifter_Weaver ... more
Diff: SerialTxIntr.cpp
- Revision:
- 13:deeef404ff49
- Parent:
- 11:7f5b88c8bd6a
--- a/SerialTxIntr.cpp Mon Jan 27 07:43:38 2020 +0000 +++ b/SerialTxIntr.cpp Wed Feb 05 08:45:08 2020 +0000 @@ -2,50 +2,48 @@ // Nucleo ボードの USB コネクタに対応するシリアルポート送信割込みで // キャラクタの送信をサポ-トするクラス // -// ボーレートのデフォルト値は 9,600 boud -// -// 2020/01/27, Copyright (c) 2020 MIKAMI, Naoki +// 2020/02/05, Copyright (c) 2020 MIKAMI, Naoki //------------------------------------------------------------- #include "SerialTxIntr.hpp" namespace Mikami { - // コンストラクタ - SerialTxIntr::SerialTxIntr(Serial &tx) : tx_(tx), USART_(USART2) - { - tx_.attach(callback(this, &SerialTxIntr::TxIsr), Serial::TxIrq); - } + // コンストラクタ + SerialTxIntr::SerialTxIntr(Serial &tx) : tx_(tx), USART_(USART2) + { + tx_.attach(callback(this, &SerialTxIntr::TxIsr), Serial::TxIrq); + } - // 送信データ書き込み - void SerialTxIntr::TxWrite(char c) - { - USART_->CR1 &= ~USART_CR1_TXEIE; // 送信割込み禁止 - // 送信レジスタ (DR) が空でかつ送信バッファが空かどうか調べる - if ( que_.empty() && // 両者が空の場合 - ((USART_->SR && USART_SR_TXE_Msk) == USART_SR_TXE) ) - Write(c); // 送信レジスタにデータを書き込む - else // 少なくとも一方が空ではない場合 - que_.push(c); // 送信バッファにデータを格納 - USART_->CR1 |= USART_CR1_TXEIE; // 送信割込み許可 - } + // 1文字の送信 + void SerialTxIntr::TxChar(char c) + { + DisableTxIntr(); // 送信割込み禁止 - // 文字列の送信 + // 送信レジスタ (TDR) が空でかつ送信バッファが空かどうか調べる + if ( que_.empty() && IsTdrEmpty() ) // 両者が空の場合 + WriteTDR(c); // 送信レジスタにデータを書き込む + else // 少なくとも一方が空ではない場合 + que_.push(c); // 送信バッファにデータを格納 + + EnableTxIntr(); // 送信割込み許可 + } + + // 文字列の送信 void SerialTxIntr::TxString(string str) { - for (int n=0; n<str.size(); n++) - TxWrite(str[n]); + for (int n=0; n<str.size(); n++) TxChar(str[n]); } - // シリアルポート送信割込みサービスルーチン - void SerialTxIntr::TxIsr() - { - if (!que_.empty()) - { - Write(que_.front()); // 送信用バッファから取り出したデータを送信レジスタへ書き込む - que_.pop(); // 先頭のデータを消去 - } - else - USART_->CR1 &= ~USART_CR1_TXEIE; // 送信割込み禁止 - } + // シリアルポート送信割込みサービスルーチン + void SerialTxIntr::TxIsr() + { + if (!que_.empty()) + { + WriteTDR(que_.front()); // 送信用バッファから取り出したデータを TDR へ書き込む + que_.pop(); // 先頭のデータを消去 + } + else + DisableTxIntr(); // 送信割込み禁止 + } } \ No newline at end of file