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

Dependents:   F446_FunctionGenerator F446_UpSampling_GraphicEqualizer F446_UpSampling_ReverbSystem F446_UpSampling_FrqShifter_Weaver ... more

SerialTxIntr.cpp

Committer:
MikamiUitOpen
Date:
2019-11-23
Revision:
9:a90a9abeaea0
Parent:
7:190d94fba10d
Child:
11:7f5b88c8bd6a

File content as of revision 9:a90a9abeaea0:

//-------------------------------------------------------------
//  Nucleo ボードの USB コネクタに対応するシリアルポート送信割込みで
//  キャラクタの送信をサポ-トするクラス
//
//  ボーレートのデフォルト値は 9,600 boud
//
//  2018/09/28, Copyright (c) 2018 MIKAMI, Naoki
//-------------------------------------------------------------

#include "SerialTxIntr.hpp"

namespace Mikami
{
	// コンストラクタ
	SerialTxIntr::SerialTxIntr(Serial &tx) : tx_(tx)
	{
    	tx_.attach(callback(this, &SerialTxIntr::TxIsr), Serial::TxIrq);
	}
    
	// 送信データ書き込み
	void SerialTxIntr::TxWrite(char c)
	{
    	USART2->CR1 &= ~USART_CR1_TXEIE;    // 送信割込み禁止
	    // 送信レジスタ (DR) が空でかつ送信バッファが空かどうか調べる
    	if ( que_.empty() &&    // 両者が空の場合
        	 ((USART2->SR && USART_SR_TXE_Msk) == USART_SR_TXE) )    
	        USART2->DR = c;                 // 送信レジスタにデータを書き込む
    	else                                // 少なくとも一方が空ではない場合
        	que_.push(c);                   // 送信バッファにデータを格納
	    USART2->CR1 |= USART_CR1_TXEIE;     // 送信割込み許可
	}

	// 文字列の送信
    void SerialTxIntr::TxString(string str)
    {
    	for (int n=0; n<str.size(); n++)
    		TxWrite(str[n]);
    }
    
	// シリアルポート送信割込みサービスルーチン
	void SerialTxIntr::TxIsr()
	{
	    if (!que_.empty())
    	{
        	USART2->DR = que_.front();  // 送信用バッファから取り出したデータを送信レジスタへ書き込む
	        que_.pop();                 // 先頭のデータを消去
    	}
	    else
    	    USART2->CR1 &= ~USART_CR1_TXEIE;    // 送信割込み禁止
	}
}