STM32G031のArduinoでの時計,DS1307で時刻表示( AQM0802A i2c)(STM32G031J6M6)


STM32G031のArduinoでの時計,DS1307で時刻表示( AQM0802A i2c)(STM32G031J6M6)

1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり


注意!!注意!!注意!!注意!!注意!!注意!!
正しく設定しないと
STM32G031J6M6に書き込めなくなります。

オプションビット
nBOOT_SEL -> Unchecked
NRST_MODE -> 1

注意!!注意!!注意!!注意!!注意!!注意!!

詳しくは、
STM32G031のArduinoでのUSARTシリアル通信(STM32G031J6M6)
https://qiita.com/caa45040/items/8b77fe33e80a54b47c3d

x上級者向け
xシリアル共有の為にゴミがでるのでバッファクリアを追加


#include <Wire.h>

//STM32G031J6M6
#define sdaPin PA12    // ArduinoA4
#define sclPin PA11    // ArduinoA5

// デバイスアドレス(スレーブ)
#define ADDR    0x68    // 2進数 1101000
#define I2Cadr  0x3e  // 固定

int u_key;      // 受信データを格納するchar型の変数
int ch_in_key() {

  // 受信データがあった時だけ、処理を行う
  while(!Serial.available()) {}       // 受信データがあるか?
  u_key = Serial.read();            // 1文字だけ読み込む

  return(u_key);
}

char ch_b[8+1]; //文字列のバッファー
char *ch_input()
{
    int  ch_i=0;      //文字列のループカウンター
    int  ch_y;        //一文字分の一時バッファー
    while(1) {
        ch_y = ch_in_key();
        if(ch_y == 13){ch_b[ch_i]=0;Serial.println();break;}
        ch_b[ch_i]=ch_y;ch_i++;
        Serial.write( ch_y );
        if(ch_i >= 8){ch_b[ch_i]=0;Serial.println();break;}     
    } //while
    return(ch_b);
} //ch_input

char ch_hex_b[3];
char *ch_hex(int l_num)
{
    ch_hex_b[0] = '0' + (l_num >> 4);
    ch_hex_b[1] = '0' + (l_num & 0xf);
    ch_hex_b[2] = 0;
    return(ch_hex_b);
}

void setup() {

  // !!! swdclk(PA14) or swdio(PA13) use, not erase 3seconds !!!
  delay(3000); // not delete //STM32G031J6M6

  Serial.begin( 9600 );     // シリアル通信を初期化する。通信速度は9600bps


  // マスタとしてI2Cバスに接続する
  //Wire.begin(); //stm32f767
  Wire.begin(sdaPin,sclPin); //STM32G031J6M6

}

int h;
int m;
int a;
int b;

int p_val;
char data_read[16];
char cmd[2]={0,0};
int ii;     //ループカウンタ

char INIT_com[]={0x0,0x38,
0x0,0x39,
0x0,0x4,
0x0,0x14,
0x0,0x70,
0x0,0x56,
0x0,0x6C,
0x0,0x38,
0x0,0xC,
0x0,0x1,
0x40,0x41,0x99,0x99};
char INIT_cls[]={0x0,0x1};

char *ch_pp; //キャラクターのポインター変数

void lcd_data1(byte x) {
  Wire.beginTransmission(I2Cadr);
  Wire.write(0b01000000); // CO = 0, RS = 1
  Wire.write(x);
  Wire.endTransmission();
}

void lcd_data2(byte x,byte y) {
  Wire.beginTransmission(I2Cadr);
  Wire.write(0b01000000); // CO = 0, RS = 1
  Wire.write(x);
  Wire.endTransmission();
  Wire.beginTransmission(I2Cadr);
  Wire.write(0b01000000); // CO = 0, RS = 1
  Wire.write(y);
  Wire.endTransmission();
}

int char_buf1; 

void loop() {

///*INIT start *********  

    Serial.println( "" );  //改行

    //受信バッファーが0になるまで読み飛ばす
    while(1) {
      if( Serial.read() == -1 ){break;}
    } //while

    Serial.print("H 0-23>");

    for(ii=0;ii<5000;ii++){
        delay(1);
        if(Serial.available() == 1) {break;}
    }//for
    //Serial.print("[");
    //Serial.print(ii);
    //Serial.println("]");
    if(ii == 5000){Serial.println( "" );}
    if(ii != 5000) { //jump bbb


    h=atoi( ch_input() ); //文字列の入力
    if(h != 99 ) { //jump aaa

    Serial.print("M 0-59>");
    m=atoi(ch_input() ); //文字列の入力

    a=(m/10)*16+(m%10);
    b=(h/10)*16+(h%10);

      // I2Cスレーブに対して送信処理を開始する
  Wire.beginTransmission(ADDR);

    // レジスタのアドレスを指定する(0-63の内、先頭から)
    Wire.write(0x00);

    // ---------------------------------
    //  タイマーキーパーレジスタ
    // ---------------------------------
    // 2進化10進数(BCD)で指定します。(03以外)

    // [00]Seconds(45秒)
    Wire.write(0);
    // [01]Minutes(59分)
    Wire.write(a);
    // [02]Hours(23時)
    Wire.write(b);
    // [03]Day(月)
    // 1:日 2:月 3:火 4:水 5:木 6:金 7:土
    Wire.write(3);
    // [04]Date(31日)
    Wire.write(1);
    // [05]Month(12月)
    Wire.write(1);
    // [06]Years(2017年)
    Wire.write(0x20);

  // I2Cスレーブへの送信完了
  Wire.endTransmission();

    } //jump aaa
    } //jump bbb


//*/  //INIT end *********

    for(ii=0;ii<11;ii++){
        //Serial.print(String(INIT_com[ii*2], HEX));
        //Serial.print(" ");
        //Serial.print(String(INIT_com[(ii*2)+1], HEX));
        //Serial.println("");     

  Wire.beginTransmission(I2Cadr);
  Wire.write(INIT_com[ii*2]); // CO = 0,RS = 0
  Wire.write(INIT_com[(ii*2)+1]);
  Wire.endTransmission();
        delay(1);
    } //for

    //while(1){} // debug

while(1){

  //画面のクリア
  Wire.beginTransmission(I2Cadr);
  Wire.write(0); // CO = 0,RS = 0
  Wire.write(1);
  Wire.endTransmission();

  // レジスタのアドレスを先頭にする
  Wire.beginTransmission(ADDR);
    Wire.write(0x00);
  Wire.endTransmission();

  // I2Cスレーブに8byteのレジスタデータを要求する
  Wire.requestFrom(ADDR, 8);

  // 8byteのデータを取得する
  for (ii = 0; ii < 8; ii++) {
    while (Wire.available() == 0 ) {}
    data_read[ii] = Wire.read();
  }


        ii=2;
        while(1){
            Serial.print(ch_hex(data_read[ii]));
            ch_pp = ch_hex(data_read[ii]);
            lcd_data2(ch_pp[0],ch_pp[1]);
            ii--;
            if(ii==-1){break;}else{Serial.print(":");lcd_data1(':');}
        }
        Serial.println("");


  delay(1000);

}//while

} //loop