STM32-HAL库06-硬件IIC驱动FM24CL16B非易失存储器

STM32-HAL库06-IIC驱动FM24CL16B非易失存储器

一、所用材料:

STM32VGT6自制控制板
STM32CUBEMX(HAL库软件)
MDK5

二、所学内容:

通过HAL库的硬件IIC对FM24CL16B存储器进行写与读取操作。

三、CUBEMX配置:

第一步:选取IIC1进行配置

第二步:配置SYS

第三步:配置RCC

第四步:配置时钟

第五步:文件配置

四、MDK5程序编写:

1.配置FM24CL16B.h文件

c 复制代码
#ifndef __FM24CL16_H
#define __FM24CL16_H	 

//========移植的时候,根据所选芯片引入相应的头文件==========在main.h里面查看
#include "stm32f4xx_hal.h"
#include "i2c.h"

#define FM_24LC16_Write 0xA0
#define FM_24LC16_Read  0xA1
#define BufferSize 2048

//电机参数内存分配
#define Rs_add	0
#define Rr_add	4


void FM24CL16B_Write_data(uint16_t add , uint8_t data);
uint8_t FM24CL16B_Read_data(uint16_t add);
void Parameter_Write (uint16_t para_add , float para_data);
float Parameter_Read (uint16_t para_add);

#endif

2.配置FM24CL16B.c文件

c 复制代码
#include "FM24CL16B.h"
#include "i2c.h"
#include "stdio.h"

/********************************************
函数名称:FM24CL16写数据
函数参数:add---写入数据的地址(0-2048)
		  data---写入的数据(0-256)
函数解析:向指定地址写入特定数据,并且在写入
		  后读取一次打印至串口
********************************************/
void FM24CL16B_Write_data(uint16_t add , uint8_t data)
{
	HAL_I2C_Mem_Write(&hi2c1, FM_24LC16_Write, add, I2C_MEMADD_SIZE_8BIT,&data,1,0xff);
	HAL_Delay(5);//此处延时必加
	printf("\r\n EEPROM 24C02 Write Test OK \r\n");
	
	FM24CL16B_Read_data(add);
}
/********************************************
函数名称:FM24CL16读数据
函数参数:add---读数据的地址(0-2048)
函数解析:读取指定地址的数据并返回该数据
********************************************/
uint8_t FM24CL16B_Read_data(uint16_t add)
{
	uint8_t Read_data;
	HAL_I2C_Mem_Read(&hi2c1, FM_24LC16_Read, add, I2C_MEMADD_SIZE_8BIT,&Read_data,1, 0xff);
	printf("地址:%d   16进制:0x%02X   10进制:%d \r\n",add,Read_data,Read_data);
	return Read_data;
}
/********************************************
函数名称:浮点数参数写入
函数参数:para_add---写入参数的头地址
		  para_data-写入的参数浮点数值
函数解析:将浮点数参数值写入到指定的参数地址
********************************************/
void Parameter_Write (uint16_t para_add , float para_data)
{
	uint16_t zhengshu ;
	uint8_t zhengshu1 ;
	uint8_t zhengshu2 ;
	uint16_t xiaoshu ;
	uint8_t xiaoshu1 ;
	uint8_t xiaoshu2 ;
	
    zhengshu = (uint16_t)para_data;
    zhengshu1 = zhengshu/256;
    zhengshu2 = zhengshu%256;
    xiaoshu  = (para_data-zhengshu)*1000.0;
    xiaoshu1 = xiaoshu/256;
    xiaoshu2 = xiaoshu%256;
	
	HAL_I2C_Mem_Write(&hi2c1, FM_24LC16_Write,para_add, I2C_MEMADD_SIZE_8BIT,&zhengshu1,1,0xff);
	HAL_Delay(5);//此处延时必加
	HAL_I2C_Mem_Write(&hi2c1, FM_24LC16_Write,para_add+1, I2C_MEMADD_SIZE_8BIT,&zhengshu2,1,0xff);
	HAL_Delay(5);//此处延时必加
	HAL_I2C_Mem_Write(&hi2c1, FM_24LC16_Write,para_add+2, I2C_MEMADD_SIZE_8BIT,&xiaoshu1,1,0xff);
	HAL_Delay(5);//此处延时必加
	HAL_I2C_Mem_Write(&hi2c1, FM_24LC16_Write,para_add+3, I2C_MEMADD_SIZE_8BIT,&xiaoshu2,1,0xff);
	HAL_Delay(5);//此处延时必加
	
	FM24CL16B_Read_data(para_add);
	FM24CL16B_Read_data(para_add+1);
	FM24CL16B_Read_data(para_add+2);
	FM24CL16B_Read_data(para_add+3);
}
/********************************************
函数名称:浮点数参数读取
函数参数:para_add---读取参数的头地址
函数解析:将浮点数参数值从内存中读出并返回
********************************************/
float Parameter_Read (uint16_t para_add)
{
	float para_data;
	uint8_t zhengshu1 ;
	uint8_t zhengshu2 ;
	uint8_t xiaoshu1 ;
	uint8_t xiaoshu2 ;
	
    zhengshu1 =FM24CL16B_Read_data(para_add);
	zhengshu2 =FM24CL16B_Read_data(para_add+1);
	xiaoshu1 = FM24CL16B_Read_data(para_add+2);
	xiaoshu2 = FM24CL16B_Read_data(para_add+3);
	para_data = zhengshu1*256+zhengshu2+(xiaoshu1*256+xiaoshu2)*0.001;
	printf("参数值为:%f",para_data);
	
	return para_data;
}

3.配置main.c文件

c 复制代码
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  MX_TIM5_Init();
  MX_I2C1_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
  __HAL_TIM_CLEAR_IT(&htim5, TIM_IT_UPDATE);
  HAL_TIM_Base_Start_IT(&htim5);							
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE BEGIN 2 */
  Parameter_Write (Rr_add , 1458.0597);//写入Rr_add的参数值,并且会读取一次
  Parameter_Read (Rs_add);			   //读取Rs_add的参数值,此值之前已经写进去过了
  HAL_Delay(10000);
  /* USER CODE END 2 */

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

  /* USER CODE END 3 */
}

4.测试

相关推荐
不能跑的代码不是好代码9 小时前
STM32窗口看门狗(WWDG)知识点及标准库使用指南
stm32·单片机·嵌入式硬件
bingquan333310 小时前
在 Ghidra 中分析STM32裸机固件
stm32·单片机·嵌入式硬件
羽获飞10 小时前
从零开始学嵌入式之STM32——11.STM32---USART串行通讯
stm32·单片机·嵌入式硬件
宵时待雨11 小时前
STM32笔记归纳9:定时器
笔记·stm32·单片机·嵌入式硬件
逐步前行11 小时前
STM32_新建工程(寄存器版)
stm32·单片机·嵌入式硬件
bai54593612 小时前
STM32 CubeIDE 通过PWM占空比控制舵机角度
stm32·单片机·嵌入式硬件
松涛和鸣14 小时前
72、IMX6ULL驱动实战:设备树(DTS/DTB)+ GPIO子系统+Platform总线
linux·服务器·arm开发·数据库·单片机
简单中的复杂14 小时前
【避坑指南】RK3576 Linux SDK 编译:解决 Buildroot 卡死在 host-gcc-final 的终极方案
linux·嵌入式硬件
上海合宙LuatOS14 小时前
LuatOS核心库API——【audio 】
java·网络·单片机·嵌入式硬件·物联网·音视频·硬件工程
Hhh __灏15 小时前
stm32的SRAM内存不足如何分析和优化?堆栈空间如何优化?
单片机