STM32L010で9600bpsのソフトウェアシリアルのライブラリ化


x Mbed2

目的
ソフトウェアシリアルのテスト
シリアルの出力先は、PA_2

メインプログラム




//SER_LB_9600_010_1

#include "mbed.h"

#include "SER_9600_010_1.h"

//メイン関数
int main()
{

    pc.baudNS(9600);
    
    //無限ループ
    while(1) {

        //文字列の表示
        pc.printNS("HELLO WORLD\r\n");
        
        //4桁の値の表示
        pc.printNS(  1234  );
        //リターン
        pc.printNS("\r\n");

        //1秒の待ち
        wait_ms(1000);

    } //while

} //main

//容量削減
void error(const char* format, ...) {}





SER_9600_010_1.hのプログラム



//SER_9600_010.h

//10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(n) ((n*205)>>11)

char ch_hex_a_b[16];
char *ch_hex_a(int x)
{

    ch_hex_a_b[4] = 0;

    if       ( x >= 9000 ) {x = x - 9000; ch_hex_a_b[0] = '9';
    } else if( x >= 8000 ) {x = x - 8000; ch_hex_a_b[0] = '8';
    } else if( x >= 7000 ) {x = x - 7000; ch_hex_a_b[0] = '7';
    } else if( x >= 6000 ) {x = x - 6000; ch_hex_a_b[0] = '6';
    } else if( x >= 5000 ) {x = x - 5000; ch_hex_a_b[0] = '5';
    } else if( x >= 4000 ) {x = x - 4000; ch_hex_a_b[0] = '4';
    } else if( x >= 3000 ) {x = x - 3000; ch_hex_a_b[0] = '3';
    } else if( x >= 2000 ) {x = x - 2000; ch_hex_a_b[0] = '2';
    } else if( x >= 1000 ) {x = x - 1000; ch_hex_a_b[0] = '1';
    } else                 {              ch_hex_a_b[0] = '0';
    }//if

    ch_hex_a_b[3] = '0' + (  x - (DIV10(x) * 10)  );  // 3  <- 120 - 123
    x = DIV10(x);                                     // 12 <= 123 / 10
    ch_hex_a_b[2] = '0' + (  x - (DIV10(x) * 10)  );  // 2  <- 12 - 10
    ch_hex_a_b[1] = '0' +  DIV10(x);                  // 1  <- 12 / 10

    return(ch_hex_a_b);

} //ch_hex_a


#define UART_DELAY 101 //  1/9600 98-105

DigitalOut TX(PA_2);

//クラスの定義
struct _pc
{
  void baudNS(int sp);      //メソッドの宣言
  int  putcNS(char ch);      //メソッドの宣言
  int  printNS(char *str1);  //メソッドの宣言
  int  printNS(int num);     //メソッドの宣言 オーバーロード
};


//ポートをhiにする 初期化
//メソッドの定義
void _pc::baudNS(int sp)
{
  TX=1;
  wait_ms(1);
}//baudNS


//仮想シリアルへの一文字出力 9600bps
//メソッドの定義
int _pc::putcNS(char ch)
{
    TX=1;
    TX=0;//Start
    wait_us(UART_DELAY);

    for(int ii=0; ii<8; ii++) { //Data x 8
        TX=(ch>>ii)&1;
        wait_us(UART_DELAY);
    }; //for

    TX=1;//Stop
    wait_us(UART_DELAY);

    return(0);
}//putcNS


//文字列の表示
//メソッドの定義
int _pc::printNS(char *str1)
{
    //文字の中身がゼロか
    while(*str1) {

        //一文字出力
        putcNS(*str1 ++);

    } //while

    //戻り値
    return(0);  
}//printNS


//文字列の表示 オーバーロード 4桁
//メソッドの定義
int _pc::printNS(int num)
{
    if(num < 0) { putcNS('-'); num = 0 - num;   }
    
    char *str1 = ch_hex_a(num);
    
    //文字の中身がゼロか
    while(*str1) {

        //一文字出力
        putcNS(*str1 ++);

    } //while

    //戻り値
    return(0);  
}//printNS


//実体の作成
_pc pc;