STM32G031でソフトウェアシリアル入力をして「0」「1」の状態でLEDを光らす。(Arduino)

目的
GPIOとソフトウェアシリアルのテスト
速度は、9600bps


![o_con284.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a17632b7-dbdc-d616-b66d-ce6ae88d81ba.jpeg)



```c++


//ser_read_test_031_1


//#define in7 1 //uno
#define in7      PB7  // 1pin
//#define in7      PA9  // 1pin
#define RX1      PA10 // 1pin
#define TX1      PA9  // 1pin


#define DW   digitalWrite

//#define UART_DELAY 832 //  1200bps ok 031
#define UART_DELAY 102   //  9600bps ok 031



int pc_getc()
{

  int a,b,c,d,e,f,g,h;
  int bs;
//  int zt,it;

  //待ちループ
  while( digitalRead(RX1) == 1 ) {}

//    zt = micros();

    delayMicroseconds(156-3);
    a=(digitalRead(RX1));

    delayMicroseconds(104-3);
    b=(digitalRead(RX1));

    delayMicroseconds(104-4);
    c=(digitalRead(RX1));

    delayMicroseconds(104-4);
    d=(digitalRead(RX1));

    delayMicroseconds(104-3);
    e=(digitalRead(RX1));

    delayMicroseconds(104-3);
    f=(digitalRead(RX1));

    delayMicroseconds(104-4);
    g=(digitalRead(RX1));

    delayMicroseconds(104-4);

    h=(digitalRead(RX1));
    delayMicroseconds(156-3);

//    it = micros();


//debug
//String thisString9;
//pc_printf("1041 it=");
//  thisString9 = String(  1041 - (it-zt)   );
//  pc_printf( (char *)thisString9.c_str() );
//pc_printf("\r\n");

    bs=h*128+g*64+f*32+e*16+d*8+c*4+b*2+a;

    return(bs);
}//pc_getc




//仮想シリアルへの一文字出力 9600bps
int pc_putc(char ch) {

  DW(TX1, HIGH);

  DW(TX1, LOW);//START
  delayMicroseconds(UART_DELAY);

  for(int ii=0;ii<8;ii++){
    DW(TX1, (ch>>ii)&1  );
    delayMicroseconds(UART_DELAY);
  }//for

  DW(TX1, HIGH);//Stop
  delayMicroseconds(UART_DELAY);
 
  return(0);

}//pc_putc

//文字列の表示
int pc_printf(char *str1) {

    //文字の中身がゼロか
    while(*str1){

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

    } //while

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



//初期化
void setup()
{
  delay(3000);
  //ポートをhiにする 初期化
  pinMode(TX1, OUTPUT);
  DW(TX1, HIGH);
  pinMode(RX1,INPUT_PULLUP);

  //LEDの初期化
  pinMode(in7, OUTPUT);
  DW(in7, HIGH);

    pc_printf("STRT\r\n"); //debug

} //setup


//メインループ
void loop()
{


  char ch = pc_getc();

  char str2[2]={ ch ,0};
  pc_printf("-----ch=[");
  pc_printf(  str2  );
  pc_printf("\r\n");

  DW(in7, (ch & 1) );

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

} //loop





```


出力がPA0のバージョン


```c++



//ser_read_test_031_1


//#define in7 1 //uno
#define in7      PB7  // 1pin
//#define in7      PA9  // 1pin
#define RX1      PA10 // 1pin
#define TX1      PA0  // 1pin


#define DW   digitalWrite

//#define UART_DELAY 832 //  1200bps ok 031
#define UART_DELAY 102   //  9600bps ok 031



int pc_getc()
{

  int a,b,c,d,e,f,g,h;
  int bs;
//  int zt,it;

  //待ちループ
  while( digitalRead(RX1) == 1 ) {}

//    zt = micros();

    delayMicroseconds(156-3);
    a=(digitalRead(RX1));

    delayMicroseconds(104-3);
    b=(digitalRead(RX1));

    delayMicroseconds(104-4);
    c=(digitalRead(RX1));

    delayMicroseconds(104-4);
    d=(digitalRead(RX1));

    delayMicroseconds(104-3);
    e=(digitalRead(RX1));

    delayMicroseconds(104-3);
    f=(digitalRead(RX1));

    delayMicroseconds(104-4);
    g=(digitalRead(RX1));

    delayMicroseconds(104-4);

    h=(digitalRead(RX1));
    delayMicroseconds(156-3);

//    it = micros();


//debug
//String thisString9;
//pc_printf("1041 it=");
//  thisString9 = String(  1041 - (it-zt)   );
//  pc_printf( (char *)thisString9.c_str() );
//pc_printf("\r\n");

    bs=h*128+g*64+f*32+e*16+d*8+c*4+b*2+a;

    return(bs);
}//pc_getc




//仮想シリアルへの一文字出力 9600bps
int pc_putc(char ch) {

  DW(TX1, HIGH);

  DW(TX1, LOW);//START
  delayMicroseconds(UART_DELAY);

  for(int ii=0;ii<8;ii++){
    DW(TX1, (ch>>ii)&1  );
    delayMicroseconds(UART_DELAY);
  }//for

  DW(TX1, HIGH);//Stop
  delayMicroseconds(UART_DELAY);
 
  return(0);

}//pc_putc

//文字列の表示
int pc_printf(char *str1) {

    //文字の中身がゼロか
    while(*str1){

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

    } //while

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



//初期化
void setup()
{
  delay(3000);
  //ポートをhiにする 初期化
  pinMode(TX1, OUTPUT);
  DW(TX1, HIGH);
  pinMode(RX1,INPUT_PULLUP);

  //LEDの初期化
  pinMode(in7, OUTPUT);
  DW(in7, HIGH);

    pc_printf("STRT\r\n"); //debug

} //setup


//メインループ
void loop()
{


  char ch = pc_getc();

  char str2[2]={ ch ,0};
  pc_printf("-----ch=[");
  pc_printf(  str2  );
  pc_printf("\r\n");

  DW(in7, (ch & 1) );

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

} //loop






```