STM32G031の独自のソフトウェアシリアルでHello Worldと出力 9600bps


目的
出来そうだから作ってみた
標準シリアルの場合は、SWDと衝突してフラッシュに書き込めなくなり
使い勝手が悪い。(リセット非対応の時)
ソフトウェアシリアルを使うとSWD,I2C,リセットが
同時使用出来て使い勝手がよくなるため
7,8 SWD
5,6 I2C
4 reset
2,3 電源
1 シリアル出力

とりあえず9600bps  ウエートと102us


#define DW   digitalWrite

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

//104 9600
//208 4800
//416 2400
//832 1200

//#define UART_DELAY 832 //  1200bps ok 031
//#define UART_DELAY 418 //  2400bps ok 031
//#define UART_DELAY 202 //  4800bps ok 031
#define UART_DELAY 102   //  9600bps ok 031
//#define UART_DELAY 96 //  1/9600

//#define swdclk   PA14 // 8pin
//#define swdio    PA13 // 7pin
#define swdclk   PA12 // 6pin
#define swdio    PA11 // 5pin
//#define t_led1   PA12 // 6pin
//#define t_led2   PA11 // 5pin
#define en       PA0  // 4pin
#define in7      PB7  // 1pin

int q_st; //スタートタイム debug
int q_et; //エンドタイム   debug


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

  DW(in7, HIGH);

    q_st =  micros(); //debug

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

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

  DW(in7, HIGH);//Stop
  delayMicroseconds(UART_DELAY);

    q_et =  micros(); //debug 引いた数が0で1041usなら正解

  return(0);

}//pc_putc


void setup() {

  //仮想シリアルの出力ポート

  //ポートをhiにする 初期化
  pinMode(in7, OUTPUT);
  DW(in7, HIGH);

}//setup

char *ss1; //文字のポインター
int ii; //ループカウンター

//dbbug
int l_num,aaa,bbb,ccc; //debug

//debug
void jj_loop() {
        pc_putc('A');
        l_num = (q_et-q_st)/10;
        //l_num = 104;
        bbb=DVI10(l_num);
        ccc=l_num-(bbb*10);
        aaa=DVI10(bbb);
        bbb=bbb-(aaa*10);
        pc_putc( '0' + aaa  );
        pc_putc( '0' + bbb  );
        pc_putc( '0' + ccc  );
        pc_putc( 'X' );
        pc_putc( 'u' );
        pc_putc( 'S') ;
        pc_putc( '\r' );
        pc_putc( '\n' );
        delay(1000);
}//loop


//無限ループ
void loop() {

  ss1="Hello World !\r\n";
  ii=0; //ループカウンター
  while(ss1[ii]!=0){

    //一文字出力
    pc_putc(ss1[ii]);ii++;

  } //while

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

}//loop