EEPROM驱动基于STM32hal库

  • G2_960930
    了解作者
  • 2.5KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-05-20 11:32
    上传日期
24C02、24C04等驱动代码,基于STM32F cubeMX +HAL,产品中使用的代码,可直接使用。
eeprom.rar
  • eeprom
  • eeprom.h
    2.2KB
  • eeprom.c
    5.1KB
内容介绍
/** ****************************************************************************** * @file eeprom.c * @author Tony Li * @brief *EEPROM的驱动函数采用的HAL_I2C的MEM读写函数,驱动函数可以完成页内写,全区域读取。 *EEPROM_BufferWrite()实现了eeprom全地址写操作。 *支持24c01,24c02,24c04,24c08,24c16。 *24C32及以上需要调整为16地址模块 *写操作中,页切换的延时时间设计的是8mS。 *读写失败则退出,不影响系统其它模块执行。 ****************************************************************************** * @attention * * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "eeprom.h" #include "sys.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ extern I2C_HandleTypeDef hi2c1; #define EEPROM_I2C_PORT hi2c1 #ifdef EEPROMTEST /* Buffer used for transmission */ uint8_t aTxBuffer[] = " ****I2C_TwoBoards communication based on Polling**** ****I2C_TwoBoards communication based on Polling**** ****I2C_TwoBoards communication based on Polling**** "; /* Buffer used for reception */ uint8_t aRxBuffer[RXBUFFERSIZE]; #define I2C_ADDRESS 0x0 /* Size of Transmission buffer */ #define TXBUFFERSIZE (COUNTOF(aTxBuffer) - 1) #define RXBUFFERSIZE TXBUFFERSIZE static uint16_t Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength); #endif bool eepromInit(void) { EEPROMWrEnable(); return true; } bool EEPROM_BufferWrite(uint8_t *pBuffer,uint16_t WriteAddr,uint16_t NumByte){ uint16_t Amount_Page,PageBegin;//要写入的页数,页内起始地址 uint8_t Amount_Byte;//按页写入数据剩余的字节数 uint8_t count;//写入计数 uint16_t AddrBegin; PageBegin=WriteAddr/EEPROMPAGESIZE;//起始页数 AddrBegin=WriteAddr%EEPROMPAGESIZE;//页内偏移地址 count=EEPROMPAGESIZE-AddrBegin;//页内写入数量 Amount_Byte=0; EEPROMWrEnable(); if(AddrBegin+NumByte<=EEPROMPAGESIZE)//写入的内容不跨页 { if(PwrGood()!=true) return HAL_ERROR; if(HAL_I2C_Mem_Write(&EEPROM_I2C_PORT,M24CxxDevAddr|(WriteAddr>>7&0xfe), (uint16_t) WriteAddr, (uint16_t)MEMADDRSIZE, pBuffer, (uint16_t)NumByte, (uint32_t)EEPROMTIMOUT)==HAL_OK){ delay_ms(8); return true; } else return false; } else //跨页写 { //写入第一页 PageBegin=WriteAddr; count=EEPROMPAGESIZE-AddrBegin; if(PwrGood()!=true) return false; if(HAL_I2C_Mem_Write(&EEPROM_I2C_PORT,M24CxxDevAddr|(PageBegin>>7&0xfe), \ (uint16_t) PageBegin, (uint16_t)MEMADDRSIZE, pBuffer, (uint16_t)count, (uint32_t)EEPROMTIMOUT)!=HAL_OK) { return false; } delay_ms(20); PageBegin+=count; pBuffer+=count; NumByte-=count; Amount_Page=NumByte/EEPROMPAGESIZE; Amount_Byte=NumByte%EEPROMPAGESIZE; //写入后续满页 if(Amount_Page!=0) { do { if(PwrGood()!=true) return false; if(HAL_I2C_Mem_Write(&EEPROM_I2C_PORT,M24CxxDevAddr|(PageBegin>>7&0xfe), \ (uint16_t) PageBegin, (uint16_t)MEMADDRSIZE, pBuffer, (uint16_t)EEPROMPAGESIZE, (uint32_t)EEPROMTIMOUT)!=HAL_OK) { return HAL_ERROR; } else { delay_ms(20); Amount_Page--; PageBegin+=EEPROMPAGESIZE; NumByte-=EEPROMPAGESIZE; pBuffer+=EEPROMPAGESIZE; } } while(Amount_Page!=0); } //写入尾页 if(NumByte>0) { if(PwrGood()!=true) return false; if(HAL_I2C_Mem_Write(&EEPROM_I2C_PORT,M24CxxDevAddr|(PageBegin>>7&0xfe), \ (uint16_t) PageBegin, (uint16_t)MEMADDRSIZE, pBuffer, (uint16_t)NumByte, (uint32_t)EEPROMTIMOUT)!=HAL_OK) { return false; } else { delay_ms(8); return true; } } } return false; } bool EEPROM_BufRead(uint8_t *pBuffer,uint16_t ReadAddr,uint16_t NumByte){ uint8_t i; for(i=0;i<6;i++){ if(HAL_I2C_Mem_Read(&EEPROM_I2C_PORT,M24CxxDevAddr|(ReadAddr>>7&0xfe), (uint16_t) ReadAddr, (uint16_t)MEMADDRSIZE, pBuffer, (uint16_t)NumByte, (uint32_t)EEPROMTIMOUT)==HAL_OK){ return true; } else { delay_ms(5); if(i>=6) return false; } } return false; } #ifdef EEPROMTEST /** * @brief Compares two buffers. * @param pBuffer1, pBuffer2: buffers to be compared. * @param BufferLength: buffer's length * @retval 0 : pBuffer1 identical to pBuffer2 * >0 : pBuffer1 differs from pBuffer2 */ static uint16_t Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength) { while (BufferLength--) { if ((*pBuffer1) != *pBuffer2) { return BufferLength; } pBuffer1++; pBuffer2++; } return 0; } void EEPROM_TEST(void){ EEPROM_BufferWrite(aTxBuffer,I2C_ADDRESS,RXBUFFERSIZE); EEPROM_BufRead(aRxBuffer,I2C_ADDRESS,RXBUFFERSIZE); Buffercmp(aTxBuffer,aRxBuffer,7); } #endif
评论
    相关推荐
    • STM32 程序
      STM32一些自己写过的程序并应用过可以使用的,包括直流电机驱动,温度显示,oled显示,adc实验,PWM输出,定时器中断,全部都写在了main函数中,不过写的有一点乱。(pwm实验可以看我的博客)
    • STM32
      STM32
    • STM32
      STM32 该存储库用于容纳我的学习项目,以便使用STM32开发板进行嵌入式系统编程。
    • stm32 sim 7600
      stm32 ota sim 7600 stm32 ota sim 7600stm32 ota sim 7600stm32 ota sim 7600stm32 ota sim 7600stm32 ota sim 7600stm32 ota sim 7600stm32 ota sim 7600stm32 ota sim 7600stm32 ota sim 7600stm32 ota sim 7600...
    • STM32
      关于 ...用于存放学习STM32过程中相关的笔记 作者:nekonana 列表 ::: tip该列表为总体列表,包含已更新和待更新项目 有什么新的想法都会开个待更新项目开坑::: STM32开发环境选择 STM32资料库建立
    • stm32 pack
      keil5 中使用的 STM32包 其中包括 STM32F0 STM32F1 STM32F3 STM32L0 STM32L1
    • stm32cubemx
      stm32cubemx st的代码生成器,安装后可以进行图形化的代码生成,项目生成!
    • STM32CubeMX
      ST(意法半导体)公司为方便STM32的使用和学习,以及HAL库的推广,自行研发的可以通过配置,自动生成初始化代码的工具软件
    • STM32 JoyStickMouse
      今天终于把 STM32 的例程 JoyStickMouse 跑起来了,上传一份备忘。 注意要根据 stm32f10x_conf.h 中的注释去掉一些没用到的文件
    • stm32 demo
      stm32demo 内置adc采集 使用oled及串口显示,可以用于小型项目的demo。 及课程设计。