STM32CubeMX配置IIC总线读写EEPROM学习记录(学不会找我)

1、STM32CubeMX 配置

首先打开STM32CubeMX 选择芯片型号创建工程,我这里选择STM32F03ZET6(正点原子战舰V3) 具体新建工程的过程再也不赘述,太基础。
首先配置System Core目录下的SYS和RCC选项卡以下图:web

配置SYS下的Debug为Serial Wire

配置

配置RCC下的HSE(高速时钟)

我这里配置为外部晶振Crystal/Ceramic Resonator,具体根据板子的硬件配置设置数组

在这里插入图片描述

IIC总线接口配置

STM32F103ZET6有两路硬件IIC,配置Connectivity选项卡下的I2C1为I2C基本参数(parameter Setting)保持默认不变,DMA和NVIC暂不配置,之后单独讲svg

在这里插入图片描述

串口配置

为了方便测试代码效果看现象,增长一个串口配置输出相关信息。
串口配置老生常谈了,上篇文章有详细过程,包括串口的中断和DMA,连接放下面本身去看,这里不讲了函数

上篇文章传送门测试

时钟树

时钟树配置
这个测试比较简单,只用到IIC和USART两个外设,因此STM32CubeMX的配置至此就结束了,设置项目名称,文件路径,IDE,和代码风格就能够生成代码了,具体设置点这里看STM32CubeMX 配置部分的最后有详细说明。ui

2、代码实现(上才艺)

EEPROM的地址

#define ADDR_AT24C02_Write 0xA0
#define ADDR_AT24C02_Read 0xA1

首先是define了EEPROM芯片AT24C02的读写地址,为何就是0xA0和0xA1呢,为何不是别的噻,听我细细道来,这就跟芯片的电路链接有关系了,以下图:spa

在这里插入图片描述
EEPROM的写地址定义为:0 1 0 1 A0 A1 A2 0
EEPROM的读地址定义为:0 1 0 1 A0 A1 A2 1
这其中A0~A2就表明芯片的A0到A2三个引脚的电平状态,我这里都接了地,因此A0 A1 A2都是0,因此带进去就分别是0xA0 和0xA1,具体能够看AT24C02的datasheet。.net

代码

(1)首先我定义了两个数组,分别用于往EEPROM里写数据和存储从EEPROM里读出的数据3d

uint8_t I2C_Buffer_Write[256];
uint8_t I2C_Buffer_Read[256];

(2)下面是关键代码,我把个人代码贴出来给跟你们参考,若有错误请指正:code

void Fill()
{ 
 
  
	uint16_t i;

	sprintf((char *)test,"\r\n\r\n I2C AT24C02 Example\r\n");
	HAL_UART_Transmit(&huart1,test, 39, 100); 
	sprintf((char *)test,"\r\n I2C Write Buffer:\r\n");
	HAL_UART_Transmit(&huart1,test, 22, 100);
	for(i=0; i<255; i++)
	{ 
 
  
	  I2C_Buffer_Write[i]=i;     /* WriteBuffer Initialization */
	}
	for(i=0; i<256; i=i+8)
	{ 
 
  
		if (HAL_I2C_Mem_Write(&hi2c1, ADDR_AT24C02_Write, i, I2C_MEMADD_SIZE_8BIT,I2C_Buffer_Write+i,8, 10000) == HAL_OK)
		{ 
 
  
			sprintf((char *)test,"Success\r\n");
			HAL_UART_Transmit(&huart1,test, 9, 100);
			HAL_Delay(5);
		}
		else
		{ 
 
  
			sprintf((char *)test,"False\r\n");
			HAL_UART_Transmit(&huart1,test, 7, 100);
			HAL_Delay(5);
		}
	}
	HAL_I2C_Mem_Read(&hi2c1, ADDR_AT24C02_Read, 0, I2C_MEMADD_SIZE_8BIT,I2C_Buffer_Read,256, 1000);
	for(i=0; i<255; i++)
	{ 
 
  
		sprintf((char *)test,"%d\r\n",I2C_Buffer_Read[i]);
		HAL_UART_Transmit(&huart1,test,4, 100);
	}

}

此函数的功能也比较简单,经过一个256维的数组往EEPROM里填充数字1~256,而后按地址逐个读取出来放在I2C_Buffer_Read数组里面并经过串口打印出来,另外AT24C02的容量就是256Byte,也就是256*8=2Kbit,这里还涉及到分页存储的概念,每八个字节为一页,大于八个字节的数据,一页一页保存,代码在这你们本身研究。

结果

在这里插入图片描述
在这里插入图片描述

能够看出程序执行正常,每成功写入一字节数据打印出一个Sucess不然打印False,写入完毕后读取出来的数据也是咱们写入的数据。
另外提一下,EEPROM是掉电不丢失的存储设备,写入以后,能够把代码中写入的部分注释掉,只保留读取的部分,烧录进去从新上电,发现依然能够正常读取数据,由此证实实验的正确性。

能力不高水平有限若有错误请批评指正,谢谢你们,若是对你有帮助评论告诉我哈哈

附件

所有代码戳这里下载,谢谢