使用Platformio平台的libopencm3开发框架来开发STM32G0,以下为EEPROM M24C02的使用方法。

1 新建项目

  • 建立eeprom项目

在PIO的Home页面新建项目,项目名称eeprom,选择开发板为 MonkeyPi_STM32_G070RB,开发框架选择libopencm3;

  • 项目建立完成后在src目录下新建main.c主程序文件;
  • 修改下载和调试方式,这里开发板使用的是DAPLink仿真器,因此修改platformio.ini文件如下:
1
2
upload_protocol = cmsis-dap
debug_tool = cmsis-dap

2 编写程序

首先从之前的I2C项目中拷贝sw_i2c库文件夹到当前项目的lib目录下:

本次不使用串口打印,直接使用SEGGER rtt打印,因此将SEGGER RTT也放置在lib目录下,便于调试打印:

1
2
3
4
5
6
7
void log(const char* fmt, ...)
{
va_list va;
va_start(va, fmt);
SEGGER_RTT_vprintf(0,fmt,&va);
va_end(va);
}
2.1 EEPROM 写数据
1
2
3
4
5
6
7
8
static inline bool m24cxx_write_one_byte(uint8_t addr, uint8_t data)
{
uint8_t buffer[2];

buffer[0] = addr;
buffer[1] = data;
return sw_i2c_transfer(M24CXX_DEVICE_ADDR, buffer, 2, 0, 0);
}
2.2 EEPROM 读数据
1
2
3
4
static inline bool m24cxx_read_one_byte(uint8_t addr, uint8_t *ptr)
{
return sw_i2c_transfer(M24CXX_DEVICE_ADDR, &addr, 1, ptr, 1);
}

3 连接硬件进行测试

将EEPROM模块与开发的I2C引脚连接好:

先执行程序进行写入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
int main(void)
{
sys_clock_setup();

log("init sw i2c.\r\n");

sw_i2c_init();

log("eeprom read testing.\r\n");

uint8_t addr = 0x01;
uint8_t read_data=0;
uint8_t write_data = 0x88;

#if 0
m24cxx_read_one_byte(addr,&read_data);

if(read_data == write_data){
log("eeprom write ok\r\n");
}else{
log("ERR:EEPROM write failed.\r\n");
}

#endif

log("eeprom write.\r\n");

m24cxx_write_one_byte(addr, write_data);

delay_ms(5);//wait write done

while(1){/*do nothing*/}///!!!not go here.
return 0;
}

然后将读取部分的程序注释打开:

1
2
3
4
5
6
7
8
9
10
#if 1
m24cxx_read_one_byte(addr,&read_data);

if(read_data == write_data){
log("eeprom write ok\r\n");
}else{
log("ERR:EEPROM write failed.\r\n");
}

#endif

将开发板断电后重新上电可以看到测试正确:

注:写入数据根据M24C02的数据手册,其 Write time 为5ms,因此写入后要进行等待其写入完成;