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