今天开始测试L051 flash的读写 1、STM32L051内部存储模块地址范围 开始找到F103的FLASH图复习了一遍,然后L051C8T6,64KB的flash, 然后我惊奇的发现还有2KB的EEPROM。 发现L051系列的地址与F103完全不同,F103的flash每页的长度有1KB(小容量<=64KB)和2KB(大容量128KB起)查看各种资料, 查了2个小时, 还是不知道L051的flash 每页长度是 128Byte 还是256Byte???????????????????????? 还是请教了一下大佬,发现直接在J-Flash中可以找到答案,先上个F103的图: 然后来看个L051的图: 图中64KB 的flash 和2KB的EEPROM都能都明显的看出地址,flash 512页,每页128bytes,EEPROM只有4页,每页512bytes.知道了基本的地址,就可以操作起来了。
最后还需要确定的一点事,最小擦除单元是18bytes,还是256bytes
其实在HAL库的 stm32l0xx_hal_flash.h 文件中有过 FLASH_PAGE_SIZE 的定义,就是128bytes :
#define FLASH_SIZE (uint32_t)((*((uint32_t *)FLASHSIZE_BASE)&0xFFFF) * 1024U)
#define FLASH_PAGE_SIZE ((uint32_t)128U)
对于flash的操作,有一些基础知识补充一下:
Read interface organized by word, half-word or byte in every area ? Programming in the Flash memory performed by word or half-page ? Programming in the Option bytes area performed by word ? Programming in the data EEPROM performed by word, half-word or byte ? Erase operation performed by page (in Flash memory, data EEPROM and Option bytes)
STM32L051写必须字,读 字节、半字、字都支持。
一些基本概念: 定义字是根据处理器的特性决定的。 首先ARM是32bit处理器,所以它的字是32bit的。半字自然就是16bit; 字节不论在哪个CPU上都是8bit。 1 Byte = 8 Bits(即 1B=8b) 1 KB = 1024 Bytes Bit意为“位”或“比特”,是计算机运算的基础,属于二进制的范畴; Byte意为“字节”,是计算机文件大小的基本计算单位;
2、读写函数的设计 HAL库中肯定是有对flash和EEPROM进行操作的函数,我们这里新建一个stml0_flash.c 和stml0_flash.h 函数分别放在对应位置,进行自己的函数设计。 库中Flash与EEPROM的函数看样子是分别放在 stm32l0xx_hal_flash.c 和 stm32l0xx_hal_flash_ex.c 中的,我们先使用EEPROM,因为提供EEPROM,就是让用户可以保存一些掉电后的数据的嘛,测试完EEPROM,再车市下flash,因为怕有时候数据不够放……
2.1 读取函数
uint16_t FLASH_ReadHalfWord(uint32_t address)
{
return *(__IO uint16_t*)address;
}
uint32_t FLASH_ReadWord(uint32_t address)
{
return *(__IO uint32_t*)address;
}
2.2 写函数 对EEPROM的写函数: stm32l0xx_hal_flash_ex.h中函数如下:
HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_Unlock(void);
HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_Lock(void);
HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_Erase(uint32_t Address);
HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_Program(uint32_t TypeProgram, uint32_t Address, uint32_t Data);
通过函数看来,可以直接用,但是这里有一个问题
需要测试一下,擦除是否会擦除整个扇区,有待验证!!
|