LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-05-21

目的
出来そうだから作ってみた
標準シリアルの場合は、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




soft_serial_test_031_9600.jpg

soft_serial_test_031_9600_h.jpg

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0