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.测试

相关推荐
朱嘉鼎6 分钟前
消费级MCU如何管理内存
单片机·嵌入式硬件
R6bandito_42 分钟前
STM32 HAL库原子操作编译问题解决指南
c语言·ide·经验分享·stm32·单片机·嵌入式硬件·mcu
Jerry丶Li43 分钟前
三十、STM32的USART (串口发送+接收)
stm32·单片机·嵌入式硬件
从零点1 小时前
STM32连接以太网失败自动重新连接
stm32·单片机·嵌入式硬件
dlwlrma_5161 小时前
NUCLEO-G0B1RE STM32G0B1RET6的学习(3)——SPI从DMA HAL库到应用层回调函数CallBack的定义
stm32
python百炼成钢2 小时前
13.RTC实时时钟
linux·stm32·单片机·嵌入式硬件·实时音视频
国科安芯2 小时前
FreeRTOS 在 AS32系列RISC-V 架构MCU电机驱动中的应用实践与优化
单片机·嵌入式硬件·安全·架构·压力测试·risc-v·安全性测试
染予2 小时前
GPIO中断实现流程
单片机·嵌入式硬件
门思科技2 小时前
LoRaWAN通信协议详解:架构、加密机制与核心应用
运维·服务器·网络·嵌入式硬件·物联网
小柯博客2 小时前
STM32MP1 没有硬件编解码,如何用 CPU 实现 H.264 编码支持 WebRTC?
c语言·stm32·嵌入式硬件·webrtc·h.264·h264·v4l2