新手,想搞Flash 当eeprom用
STM32新手,想搞Flash 当eeprom用,调试调到头疼,可以存取数据,但就是值不对:dizzy:下面是我用过的,参考网上的,网上很多。
字符长度len要大于4,且是4的倍数,我是设成整个page,即512 bytes。没有速度要求。
如果要任意数len,就要小心处理。 一般没有必要。
<p>#include "stm32f1xx_hal.h"
#include "flash.h"
#define FLASH_START_ADDRESS 0x0800F000
//FLASH write a String, WORD=4 bytes, len = memory Len in byte, and len >=4
void vPutDataToFlash(char *data, uint32_t len)
{
uint32_t i;
uint32_t address = FLASH_START_ADDRESS;
uint32_t u32Temp;
HAL_FLASH_Unlock();
//initial FLASH_EraseInitTypeDef
FLASH_EraseInitTypeDef f;
f.TypeErase = FLASH_TYPEERASE_PAGES;
f.PageAddress = FLASH_START_ADDRESS;
f.NbPages = 1;
//set PageError
uint32_t PageError = 0;
//erase page
HAL_FLASHEx_Erase(&f, &PageError);
if (PageError == 0)
{
while (1); //error
}
//write to FLASH
for (i=0; i<(len/4); i++)
{
u32Temp = (uint32_t) (data<<0) |
(uint32_t) (data<<8) |
(uint32_t) (data<<16) |
(uint32_t) (data<<24);
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address+(i*4), u32Temp);
}
HAL_FLASH_Lock();
}
void vGetDataFromFlash(char *data, uint32_t len)
{
uint32_t i;
uint32_t u32Temp;
uint32_t address = FLASH_START_ADDRESS;
for (i=0; i<len/4; i++)
{
u32Temp = *(__IO uint32_t*)(address+(i*4));
data = (uint8_t) (u32Temp>>0);
data = (uint8_t) (u32Temp>>8);
data = (uint8_t) (u32Temp>>16);
data = (uint8_t) (u32Temp>>24);
}
}
</p>
radio2radio 发表于 2019-8-3 17:52
我用过的,参考网上的,网上很多:
字符长度len要大于4,且是4的倍数,如果要任意数,就要小心处理。
太感谢了,我调试看看,我要存的是一个按键状态的计数值0-55 ST官方有现成的Flash仿真EEPROM例程可用:
wenyangzeng 发表于 2019-8-3 21:19
ST官方有现成的Flash仿真EEPROM例程可用:
OK,谢谢,学习学习 你可以参考正点原子提供的例子,这个例子是现成的,而且百分百可以用的
页:
[1]