【蓝桥杯嵌入式】【HAL库】七、AT24C02数据的存储——i2c验证

原理图分析

在这里插入图片描述
由原理图可知,SCL,SDA对应PB6,PB7。此方法为软件模拟iic操作,本次实验将实现对AT24C02指定地址进行数据的存储和读取,并将数据用lcd显示。此工程直接使用的官方例程提供的iic文件,关于iIc,AT24C02的原理在这里不再叙述。

STM32CubeMX配置

时钟,时钟树配置不再叙述。
其实本次实验直接生成工程即可,不需要配置GPIO,因为在iic文件里有配置相关引脚的函数,不过我们在这配置也没关系,模式什么的不用管,想了解的同学可以去查看i2c.c文件的start函数。
在这里插入图片描述
生成工程即可。

代码

我们需要添加用户代码,本次工程涉及lcd,iic两个文件夹:
链接:https://pan.baidu.com/s/1XBkoEnNFpfE1Y-dUVCRW5Q
提取码:6666
在这里插入图片描述
将user文件夹放在工程目录下,并且在工程里添加路径。(往节都有介绍)
main.h添加的头文件:

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lcd.h"
#include "i2c.h"
#include "stdio.h"
/* USER CODE END Includes */

main.c定义变量:

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
uint8_t val = 0;  // 存入数据的初始值
char buf[20];     // 用来显示一行lcd的字符串
/* USER CODE END PTD */

AT24C02的读,写代码:

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
// AT24C02读取指定地址数据
uint8_t AT24C02_Read(uint8_t address)
{
	unsigned char val;
	
	I2CStart(); 
	I2CSendByte(0xa0);
	I2CWaitAck(); 
	
	I2CSendByte(address);
	I2CWaitAck(); 
	
	I2CStart();
	I2CSendByte(0xa1); 
	I2CWaitAck();
	val = I2CReceiveByte(); 
	I2CWaitAck();
	I2CStop();
	
	return(val);
}
// AT24C02在指定地址写数据
void AT24C02_Write(unsigned char address,unsigned char data)
{
	I2CStart(); 
	I2CSendByte(0xa0); 
	I2CWaitAck(); 
	
	I2CSendByte(address);	
	I2CWaitAck(); 
	I2CSendByte(data); 
	I2CWaitAck(); 
	I2CStop();
}
/* USER CODE END 0 */

main函数里的代码:

  /* USER CODE BEGIN 2 */
	I2CInit();  			// -----------
	LCD_Init();
							//i2c和lcd的初始化——白底清屏,红色字体
	LCD_Clear(White);
	LCD_SetBackColor(White);
	LCD_SetTextColor(Red);  // -----------
	
	AT24C02_Write(0, val);  // 先向指定地址写入初始数据
	HAL_Delay(100);         // 写入需要一定的时间,本人测试的延迟1ms也是可以的
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
	  val = AT24C02_Read(0); // 从指定地址读取数据
	  sprintf(buf, "   AT24C02_DATA:%d   ", val); // 将val值放入buf字符串中
	  LCD_DisplayStringLine(Line4, (uint8_t *)(buf)); // 在第四行显示buf的内容
	  val++; 
	  AT24C02_Write(0, val); // 将自身加一后的val值写入指定地址
	  HAL_Delay(1000);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

运行结果

每一秒加一,当超过255时,即溢出,将重新归零。
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值