STM32L0 内部EEPROM写读

说明

STM32L0内部的EEPROM写操作由解锁,写入,加锁过程组成,读过程则无需解锁。至于STM32L0内部的非易失空间区分为FLASH和EEPROM,主要体现在用ST-LINK等工具进行整片擦除时,只擦除FLASH的空间,EEPROM的部分不会被擦除,如同外部EEPROM芯片,MPU的代码升级不影响EEPROM的内容。后面以内部EEPROM的写读作为范例。

基础写读函数

定义内部EEPROM的地址空间:

//STM32L031K6T6
#define EEPROM_BASE_ADDR    0x08080000
#define EEPROM_BYTE_SIZE    0x03FF

基础字节写函数

//Byte write
void EEPROM_WRITE(uint16_t BiasAddress, uint8_t *Data, uint16_t len)
{uint16_t i;HAL_StatusTypeDef status = HAL_OK;HAL_FLASHEx_DATAEEPROM_Unlock();for(i=0;i<len;i++){status +=HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE, EEPROM_BASE_ADDR+BiasAddress+i, *Data);Data++;}HAL_FLASHEx_DATAEEPROM_Lock();
}

基础字节读函数

//Byte read
void EEPROM_READ(uint16_t BiasAddress,uint8_t *Buffer,uint16_t Len)
{uint8_t *wAddr;wAddr=(uint8_t *)(EEPROM_BASE_ADDR+BiasAddress);while(Len--){*Buffer++=*wAddr++;}
}

带校验写读函数

如果考虑到写读过程中,可以出现错误的情况,为了保证操作的正确性,需要采用校验方式进行写读。
对于写过程,需要将写入的数据,读回做比较。
对于读过程,需要将两次读回的数据,进行比较。
如果比较正确,则操作完成。
如果错误,可重新进行写或读操作,并在设定的重新操作次数范围内,进行重新操作识别,如果正确,则报告正确,如果错误,则报告错误。

设定重复校验次数

#include <string.h>
#define iEEPROM_CHECK_NUM 2

带操作校验的写函数

HAL_StatusTypeDef EEPROM_WRITE_W_CHECK(uint16_t BiasAddress, uint8_t *Data, uint16_t len)
{uint8_t buff[len];uint16_t i;for (i=0;i<iEEPROM_CHECK_NUM;i++){EEPROM_WRITE(BiasAddress, Data, len);EEPROM_READ(BiasAddress, buff, len);if (memcmp(Data, buff, len)==0){return HAL_OK;}}return HAL_ERROR;
}

带操作校验的读函数

HAL_StatusTypeDef EEPROM_Read_W_CHECK(uint16_t BiasAddress, uint8_t *Data, uint16_t len)
{uint8_t buff0[len];uint8_t buff1[len];uint16_t i;for (i=0;i<iEEPROM_CHECK_NUM;i++){EEPROM_READ(BiasAddress, buff0, len);EEPROM_READ(BiasAddress, buff1, len);if (memcmp(buff0, buff1, len)==0){memcpy(Data, buff0, len);return HAL_OK;}}return HAL_ERROR;
}

其中BiasAddress为0对应内部EEPROM的0地址(EEPROM_BASE_ADDR定义了其基址),Data为数据字节指针,len为操作字节长度。

需要注意的是,基于工艺制程和设计,EEPROM的使用也分为两种,其中一种和FRAM相似,可以直接进行写入而不需要提前擦除,STM32内部的EEPROM也是这一种;另外一种和FLASH相似,需要先进行基于Page的擦除后才能正确写入,对于有的EEPROM,支持基于Page最小为Byte单元的擦除。

HAL提供的内部EEPROM擦除函数, 只是进行一个word的擦除,即在某个地址上将数据改写为0x00000000, 和直接调用写函数在该地址写入0x00000000效果一样。HAL的内部EEPROM擦除函数如下:

/*** @brief  Erase a word in data memory.* @param  Address specifies the address to be erased.* @note   To correctly run this function, the @ref HAL_FLASHEx_DATAEEPROM_Unlock() function*         must be called before.*         Call the @ref HAL_FLASHEx_DATAEEPROM_Lock() to the data EEPROM access*         and Flash program erase control register access(recommended to protect *         the DATA_EEPROM against possible unwanted operation).* @retval HAL_StatusTypeDef HAL Status*/
HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_Erase(uint32_t Address)
{HAL_StatusTypeDef status = HAL_OK;/* Check the parameters */assert_param(IS_FLASH_DATA_ADDRESS(Address));/* Wait for last operation to be completed */status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);if(status == HAL_OK){/* Clean the error context */pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;/* Write 00000000h to valid address in the data memory */*(__IO uint32_t *) Address = 0x00000000U;status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);}/* Return the erase status */return status;
}  

上述的代码,如果要用于STM32内部FLASH的操作,还需要增加页擦除操作。

-End-

STM32L0 内部EEPROM写读相关推荐

  1. eeprom stm8l 擦除 读写_[STM8L]EEPROM操作读与写

    原标题:[STM8L]EEPROM操作读与写 带有片上EEPROM,常用来保存参数,事实上STM8L整个程序存储区都可以用于作为EEPROM,只是默认情况下被闭了. 不同型号的STM8L器件其内部默认 ...

  2. pic单片机c语言读eeprom,PIC16F877单片机内部EEPROM读写实例

    ;PIC16F877单片机内部EEPROM读写实例*************************************************************************** ...

  3. lpc1778/lpc1788写内部EEPROM的一个注意点

    广州致远电子股份有限公司编著的<深入浅出Cortex-M3---LPC178x/177x(下册)>一书中,介绍芯片内置EEPROM 容量为4KB 在使用测试过程中,发现向第63扇区(从0扇 ...

  4. AT89S8253片内EEPROM字节读、字节写、页读、页写驱动代码、注意事项及注释

    在编写AT89S8253片内EEPROM读写驱动程序时,要特别注意数据读写指令MOVX: 当EECON寄存器的EEMEN位置位时,MOVX访问EEPROM: 当EECON寄存器的EEMEN位清零时,M ...

  5. STC89C52RC内部EEPROM编程

    这个实验的目的是通过写入一个字节到单片机内部EEPROM,然后再将该字节读取出来,赋值给8位LED端口,点亮部分LED灯. STC89C52单片机内部EEPROM 的读写过程 ISP/IAP1 写入 ...

  6. STC89C52RC内部EEPROM的读写

    本文为原创,转载请注明出处! 本例在win10操作系统下,使用keil4"c51v956"版本下完成 STC89C52RC的扇区分布: /********STC89C52扇区分布* ...

  7. 51单片机读写内部EEPROM详解

    文档共包含三个程序. 第一个程序最简单易懂,看懂了基本就会读写51单片机内部EEPROM了. 第二个程序和第一个读写EEPROM原理差不多,包含有LCD1602操作方法,有写字符串的方法. 第三个程序 ...

  8. 单片机c语言实训例子基于mega16,基于AVR单片机的mega16内部EEPROM操作C语言程序设计...

    原标题:基于AVR单片机的mega16内部EEPROM操作C语言程序设计 #include #include #include #define uchar unsigned char #define ...

  9. 解决STM32F0/F1内部FLASH写操作导致中断程序无法响应的问题

    必看链接:试图搞懂MDK程序下载到flash(二)–分散加载文件scatter 参考链接:STM32F10x单片机Flash写操作导致中断不响应问题 最近本人在写STM32F0系列的FLASH写操作的 ...

最新文章

  1. 里程碑!SpaceX 载人首飞发射成功,马斯克填补美国载人飞行近十年空白
  2. Typora 收费,WTF? 还是需要支持下
  3. Spring 配置文件的差异
  4. 如何用纯 CSS 创作一个荧光脉冲 loader 特效
  5. Android5.0源码分析—— Zygote进程分析
  6. Excel VBA 学习总结 - 数据验证与正则表达式
  7. Kali桥接模式DHCP自动获取IP失败(VMware)
  8. [转载] python数字类型(一)
  9. L1-028 判断素数 (10 分)—团体程序设计天梯赛
  10. 3.2 语音识别概述
  11. 《python核心编程》学习笔记
  12. 学习笔记 —— 吴恩达《机器学习》课程
  13. 三种1:4传输线变压器巴伦的分析
  14. (转)电脑内外接口全程图解
  15. 数据库删除数据 truncate 与 delete
  16. vim 剪贴板历史插件
  17. 四、字符串(7):重复的子字符串
  18. 萤石云回放时服务器无响应,萤石云手机回放看不了
  19. 基于时延估计的动力型下肢假肢分段控制策略研究
  20. 鸿蒙初开 原文,《鸿蒙初开,天地混沌》 译文

热门文章

  1. 艺赛旗(RPA)iS-RPA新手课堂 - 这个“鼠标”得会用
  2. 查看笔记本当前链接Wifi的密码
  3. 2021年施工员-装饰方向-通用基础(施工员)考试资料及施工员-装饰方向-通用基础(施工员)考试试卷
  4. 什么是jsf_什么是JSF? JavaServer Faces简介
  5. 论文笔记:ReDet: A Rotation-equivariant Detector for Aerial Object Detection
  6. Revit建模软件:如何在Revit中准确放置族组件?
  7. Linux-centos-7安装
  8. CV-CUDA使用gpu读取并处理图片
  9. 利用洪特规则计算原子离子磁矩过程详解
  10. 人脑是怎样认知图像的?——视觉计算理论(最新模式识别之一,Marr)