STM32L010とI2Cを使い0x80に「hello...」と出力する。(Keil)


x Mbed2

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

STM32G031とVSCode+STM32CubeでI2Cスレーブの受信文字をシリアル出力(受信)(STM32-I2C-USART)(CH340N)

なぜかわからないがmbed.bldのファイルを変更したら動いた

mbed.bld



https://os.mbed.com/users/mbed_official/code/mbed/builds/2e9cc70d1897



プログラム




//I2C_TEST_STRING_R1
// build https://os.mbed.com/users/mbed_official/code/mbed/builds/2e9cc70d1897

#include "mbed.h"

DigitalOut myled(PA_4);

#define ADDR (0x80)  //I2Cのアドレス

I2C i2c(PA_10, PA_9); //010

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

char ch_hex_a_b[16];
char *ch_hex_a(int x)
{

        int x_bk;

        ch_hex_a_b[4] = 0;

        if     ( x >= 9000 ) { x = x - 9000;   ch_hex_a_b[0] = '9';    }
        else if( x >= 8000 ) { x = x - 8000;   ch_hex_a_b[0] = '8';    }
        else if( x >= 7000 ) { x = x - 7000;   ch_hex_a_b[0] = '7';    }
        else if( x >= 6000 ) { x = x - 6000;   ch_hex_a_b[0] = '6';    }
        else if( x >= 5000 ) { x = x - 5000;   ch_hex_a_b[0] = '5';    }
        else if( x >= 4000 ) { x = x - 4000;   ch_hex_a_b[0] = '4';    }
        else if( x >= 3000 ) { x = x - 3000;   ch_hex_a_b[0] = '3';    }
        else if( x >= 2000 ) { x = x - 2000;   ch_hex_a_b[0] = '2';    }
        else if( x >= 1000 ) { x = x - 1000;   ch_hex_a_b[0] = '1';    }
        else                 {                 ch_hex_a_b[0] = '0';    }

        x_bk = x;

        x     =  DVI10(x);                           // 12 <- 123 / 10
        ch_hex_a_b[3] = '0' +  (  x_bk - (x*10)  );  // 3  <- 120 - 123
        x_bk  =  x;

        x     =  DVI10(x);                           // 1  <- 12 / 10
        ch_hex_a_b[2] = '0' +   ( x_bk - (x*10) );   // 2  <- 12 - 10

        ch_hex_a_b[1] = '0' + x;

        return(ch_hex_a_b);
	
} //ch_hex_a

//一文字出力
int pc_putc(char ch)
{
        
    i2c.write(ADDR, &ch , 1); 
    wait_ms(1);//1mS待つ 連続送信防止用 受信落ち対策

    return(0);

} //pc_putc

//文字列の表示 nana_seg
int pc_printf(char *str1)
{

    //文字の中身がゼロか
    while(*str1) {

    	pc_putc( *str1 ++); 

    } //while

    //戻り値
    return(0);

}//ns_printf

//メインプログラム
int main() {

    //無限ループ
    while(1){

        myled = 1;//LEDをオン

        //I2Cに文字列を出力
        pc_printf("hello world\r\n");

        //I2Cに文字列を出力
        pc_printf(ch_hex_a(1234));

        //I2Cに文字列を出力
        pc_printf("\r\n");

        myled = 0;//LEDをオフ

        wait_ms(1000);//1秒待つ

    }//while

} // main

//容量削減 約-3kバイト
void error(const char* format, ...){}