STM32L0 内部EEPROM写读
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写读相关推荐
- eeprom stm8l 擦除 读写_[STM8L]EEPROM操作读与写
原标题:[STM8L]EEPROM操作读与写 带有片上EEPROM,常用来保存参数,事实上STM8L整个程序存储区都可以用于作为EEPROM,只是默认情况下被闭了. 不同型号的STM8L器件其内部默认 ...
- pic单片机c语言读eeprom,PIC16F877单片机内部EEPROM读写实例
;PIC16F877单片机内部EEPROM读写实例*************************************************************************** ...
- lpc1778/lpc1788写内部EEPROM的一个注意点
广州致远电子股份有限公司编著的<深入浅出Cortex-M3---LPC178x/177x(下册)>一书中,介绍芯片内置EEPROM 容量为4KB 在使用测试过程中,发现向第63扇区(从0扇 ...
- AT89S8253片内EEPROM字节读、字节写、页读、页写驱动代码、注意事项及注释
在编写AT89S8253片内EEPROM读写驱动程序时,要特别注意数据读写指令MOVX: 当EECON寄存器的EEMEN位置位时,MOVX访问EEPROM: 当EECON寄存器的EEMEN位清零时,M ...
- STC89C52RC内部EEPROM编程
这个实验的目的是通过写入一个字节到单片机内部EEPROM,然后再将该字节读取出来,赋值给8位LED端口,点亮部分LED灯. STC89C52单片机内部EEPROM 的读写过程 ISP/IAP1 写入 ...
- STC89C52RC内部EEPROM的读写
本文为原创,转载请注明出处! 本例在win10操作系统下,使用keil4"c51v956"版本下完成 STC89C52RC的扇区分布: /********STC89C52扇区分布* ...
- 51单片机读写内部EEPROM详解
文档共包含三个程序. 第一个程序最简单易懂,看懂了基本就会读写51单片机内部EEPROM了. 第二个程序和第一个读写EEPROM原理差不多,包含有LCD1602操作方法,有写字符串的方法. 第三个程序 ...
- 单片机c语言实训例子基于mega16,基于AVR单片机的mega16内部EEPROM操作C语言程序设计...
原标题:基于AVR单片机的mega16内部EEPROM操作C语言程序设计 #include #include #include #define uchar unsigned char #define ...
- 解决STM32F0/F1内部FLASH写操作导致中断程序无法响应的问题
必看链接:试图搞懂MDK程序下载到flash(二)–分散加载文件scatter 参考链接:STM32F10x单片机Flash写操作导致中断不响应问题 最近本人在写STM32F0系列的FLASH写操作的 ...
最新文章
- 里程碑!SpaceX 载人首飞发射成功,马斯克填补美国载人飞行近十年空白
- Typora 收费,WTF? 还是需要支持下
- Spring 配置文件的差异
- 如何用纯 CSS 创作一个荧光脉冲 loader 特效
- Android5.0源码分析—— Zygote进程分析
- Excel VBA 学习总结 - 数据验证与正则表达式
- Kali桥接模式DHCP自动获取IP失败(VMware)
- [转载] python数字类型(一)
- L1-028 判断素数 (10 分)—团体程序设计天梯赛
- 3.2 语音识别概述
- 《python核心编程》学习笔记
- 学习笔记 —— 吴恩达《机器学习》课程
- 三种1:4传输线变压器巴伦的分析
- (转)电脑内外接口全程图解
- 数据库删除数据 truncate 与 delete
- vim 剪贴板历史插件
- 四、字符串(7):重复的子字符串
- 萤石云回放时服务器无响应,萤石云手机回放看不了
- 基于时延估计的动力型下肢假肢分段控制策略研究
- 鸿蒙初开 原文,《鸿蒙初开,天地混沌》 译文
热门文章
- 艺赛旗(RPA)iS-RPA新手课堂 - 这个“鼠标”得会用
- 查看笔记本当前链接Wifi的密码
- 2021年施工员-装饰方向-通用基础(施工员)考试资料及施工员-装饰方向-通用基础(施工员)考试试卷
- 什么是jsf_什么是JSF? JavaServer Faces简介
- 论文笔记:ReDet: A Rotation-equivariant Detector for Aerial Object Detection
- Revit建模软件:如何在Revit中准确放置族组件?
- Linux-centos-7安装
- CV-CUDA使用gpu读取并处理图片
- 利用洪特规则计算原子离子磁矩过程详解
- 人脑是怎样认知图像的?——视觉计算理论(最新模式识别之一,Marr)