桥架支撑架STM32HAL库-针对芯⽚内部EEprom读写操作介绍⽬录
概述
本篇⽂章介绍如何使⽤STM32HAL库,操作芯⽚内部EEprom读写数据,类似操作Flash,可实现掉电保存数据功能。(注:有些型号才有内部EEprom,没有的话,只能使⽤内部FLASH模拟EEprom,或者外挂EEprom芯⽚) 硬件:STM32L051C8T6最⼩系统板
软件:Keil 5.29 + STM32CubeMX6.2.1
便携式存储
⼀、使⽤⽅法
通过参阅《STM32数据⼿册》得知,通过⽬录到芯⽚中的内部eeprom章节,如下所⽰:
在《STM32中⽂参考⼿册》pdf⽂档中到,第3.3⼩节:嵌⼊式闪存,对应的页数57。
这⾥我使⽤的是STM32L051C8T6的eeprom是512byte,通过⼿册得知是属于⼩容量,所以只需看地址分配图与每⼀页对应的⼤⼩(字节)即可。
想更详细的了解,请阅读《STM32数据⼿册》。
⼆、STM32CubeMx配置
顶网
三、Examples
打开STM32CubeMx⽣成的keil⼯程,新建Bsp⽂件夹,同时分别新建bsp_eeprom.c与bsp_eeprom.h⽂件,并把这两个⽂件,添加keil ⼯程中来即可。
添加头⽂件路径
1、bsp_eeprom.h⽂件
/*-------------------------------------------------*/
/* */
/* 实现内部eeprom功能的头⽂件 */
/* */
/*-------------------------------------------------*/
#ifndef __EEPROM_H
#define __EEPROM_H
#include "stm32l0xx.h" //包含需要的头⽂件
#define DATA_EEPROM_START_ADDR 0x08080000 //起始地址
#define USER_DATA_EEPROM_ADDR DATA_EEPROM_START_ADDR + 0x00000000 //⽤户地址
#define DATA_EEPROM_BYTE_SIZE 0x01FF //空间
#define DATA_EEPROM_END_ADDR DATA_EEPROM_START_ADDR + DATA_EEPROM_BYTE_SIZE //结束地址#define iEEPROM_CHECK_NUM 2
桑叶采摘器HAL_StatusTypeDef EEPROM_WriteData(uint32_t Address, uint32_t *wData, uint32_t len);三羟甲基丙烷三丙烯酸酯
HAL_StatusTypeDef EEPROM_ReadData(uint32_t Address, uint32_t *rData, uint32_t len);
HAL_StatusTypeDef EEPROM_WRITE_Verify_CHECK(uint32_t Address, uint32_t *wData, uint32_t len);
HAL_StatusTypeDef EEPROM_Read_Verify_CHECK(uint32_t Address, uint32_t *rData, uint32_t len);
#endif
2、bsp_eeprom.c⽂件
/*-------------------------------------------------*/
/* */
/* 实现内部eeprom功能的源⽂件 */
/* */
/*-------------------------------------------------*/
#include "bsp_eeprom.h" //包含需要的头⽂件
#include <string.h>
#include "usart.h" //包含需要的头⽂件
#include "stdio.h"
/*-------------------------------------------------*/
小型地源热泵/*参数:Address:擦除地址 */
/*参数:wData:擦除数据缓冲区 */
/*参数:len:擦除数据总长 */
/*返回值:⽆ */
/*-------------------------------------------------*/
HAL_StatusTypeDef EEPROM_EraseData(uint32_t start, uint32_t NumberSectors)
{
uint32_t i;
uint32_t NbrOfPages = 0;
uint32_t Address = start;
HAL_StatusTypeDef status = HAL_OK;
printf("EEPROM_EraseData len:%d\r\n", NumberSectors);
NbrOfPages = (DATA_EEPROM_END_ADDR - Address)/FLASH_PAGE_SIZE;
if(NumberSectors > NbrOfPages) return (HAL_ERROR);
for(i=0; i<NumberSectors; i++){ //for循环,需要写⼊多少数据,就循环⼏次
status = HAL_FLASHEx_DATAEEPROM_Erase(Address + i * 4);
}
if (status != HAL_OK)