Huang0000 发表于 2019-8-3 16:48:15

新手,想搞Flash 当eeprom用

STM32新手,想搞Flash 当eeprom用,调试调到头疼,可以存取数据,但就是值不对:dizzy:

radio2radio 发表于 2019-8-3 17:52:48

下面是我用过的,参考网上的,网上很多。

字符长度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>

Huang0000 发表于 2019-8-3 20:52:10

radio2radio 发表于 2019-8-3 17:52
我用过的,参考网上的,网上很多:
字符长度len要大于4,且是4的倍数,如果要任意数,就要小心处理。



太感谢了,我调试看看,我要存的是一个按键状态的计数值0-55

wenyangzeng 发表于 2019-8-3 21:19:09

ST官方有现成的Flash仿真EEPROM例程可用:


Huang0000 发表于 2019-8-3 21:22:15

wenyangzeng 发表于 2019-8-3 21:19
ST官方有现成的Flash仿真EEPROM例程可用:

OK,谢谢,学习学习

斯文人 发表于 2019-8-4 13:27:12

你可以参考正点原子提供的例子,这个例子是现成的,而且百分百可以用的
页: [1]
查看完整版本: 新手,想搞Flash 当eeprom用