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

一、STM32CubeMX 配置

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

配置SYS下的Debug为Serial Wire

配置

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

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

在这里插入图片描述

IIC总线接口配置

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

在这里插入图片描述

串口配置

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

上篇文章传送门

时钟树

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

二、代码实现(上才艺)

EEPROM的地址

#define ADDR_AT24C02_Write 0xA0
#define ADDR_AT24C02_Read 0xA1

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

在这里插入图片描述
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。

代码

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

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

(2)下面是关键代码,我把我的代码贴出来给跟大家参考,如有错误请指正:

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是掉电不丢失的存储设备,写入之后,可以把代码中写入的部分注释掉,只保留读取的部分,烧录进去重新上电,发现依然可以正常读取数据,由此证明实验的正确性。

能力不高水平有限如有错误请批评指正,谢谢大家,如果对你有帮助评论告诉我哈哈

猜你喜欢

转载自blog.csdn.net/Haders_0610/article/details/109332182