LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-02-19

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



i2c_lcd_ds1307_031_1.jpg

i2c_lcd_ds1307_031_2.jpg

i2c_lcd_ds1307_031_3.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