文章目录
一、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是掉电不丢失的存储设备,写入之后,可以把代码中写入的部分注释掉,只保留读取的部分,烧录进去重新上电,发现依然可以正常读取数据,由此证明实验的正确性。
能力不高水平有限如有错误请批评指正,谢谢大家,如果对你有帮助评论告诉我哈哈