gpt4 book ai didi

c - 通过闪存进行 STM32F1 EEPROM 仿真

转载 作者:行者123 更新时间:2023-11-30 19:04:47 29 4
gpt4 key购买 nike

我正在尝试通过 STM32F1 上的闪存模拟 EEPROM,如 here 所述(对于STM32F4)例如,但我正在努力更改STM32F1RB(中密度)规范的代码。我正在使用 SW4STM32、CubeMX 和 HAL API。

__attribute__((__section__(".user_data"))) const char userConfig[64];

//data type have to be consistent with the TYPEPROGRAM, i.e:
//TYPEPROGRAM_BYTE uint8_t data
//TYPEPROGRAM_HALFWORD uint16_t data
//TYPEPROGRAM_WORD uint32_t data
//TYPEPROGRAM_DOUBLEWORD uint64_t data
void Write_Flash(uint32_t data[],uint8_t flashTypeProgram)

{
uint8_t addressGap;
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
FLASH_Erase_Sector(FLASH_SECTOR_6, VOLTAGE_RANGE_3);
for (i=0;i<64/pow(2, flashTypeProgram);i++)
{
addressGap=pow(2, flashTypeProgram)*i;
HAL_FLASH_Program(flashTypeProgram, &userConfig[0]+addressGap, data[i]);
}
HAL_FLASH_Lock();
//TYPEPROGRAM_BYTE Program byte (8-bit) at a specified address $0
//TYPEPROGRAM_HALFWORD Program a half-word (16-bit) at a specified address $1
//TYPEPROGRAM_WORD Program a word (32-bit) at a specified address $2
//TYPEPROGRAM_DOUBLEWORD Program a double word (64-bit) at a specified address $3
}
[...]
flashTypeProgram=TYPEPROGRAM_WORD;
dataSize=(sizeof dataBuffer) / (sizeof *dataBuffer);
for (i=0;i<dataSize;i++) {
dataBuffer[i]=0x1010101; //0x1010101 puts 1 in each byte of userConfig
}
Write_Flash(dataBuffer,flashTypeProgram);

我研究了使用 HAL API 将数据写入闪存的方法,但由于我不想“毁掉”我的主板,弄乱错误的内存部分,所以我想确保在尝试之前我了解所有内容我自己的。

首先,假设我想要存储 5 KB 的数据。我应该如何允许数据区?从主存储区的末尾开始?例如,我可以为我的数据分配第 127 至 122 页?像这样吗?

MEMORY
{
DATA (RWX) : ORIGIN = 0x08048800, LENGTH = 5k /* 0x08048000 is the beginning of page 107 */
...
}

允许 5 个页面用于闪存存储会很好吗?

接下来,我不太明白这一行:

__attribute__((__section__(".user_data"))) const char userConfig[64];

我知道这是为了让用户能够读取Flash存储的数据,但为什么这样分配呢?我的意思是,64*sizeof(char) = 64 字节,对吧?他如何在允许 128 kB 存储的同时只分配 64 字节用于读取目的?

提前,谢谢!

最佳答案

首先,您应该说您正在尝试在数据闪存中写入一些内容。主要区别在于您必须删除整个页面才能写入内容。在将数据复制到 EEPROM 期间,没有此类限制。

我发现您仅使用来自其他来源的 HAL 库,并且我认为您无法完全控制您正在做什么。 请参阅 STM32F1xx 的 Flash 编程手册。其中写有在数据 Flash 编程过程中具体应该做什么以及哪些寄存器很重要的步骤。

别害怕,你不会破坏任何东西。

请不要修改以下部分。它只表示Flash从哪里开始以及有多少字节。您应该只对修改 Flash 内容的代码(您将编写的代码)感兴趣。

MEMORY
{
DATA (RWX) : ORIGIN = 0x08048800, LENGTH = 5k /* 0x08048000 is the beginning of page 107 *

我面前没有 HAL API,但我想它需要一个整数作为数据写入的地址。

首先请将您的代码减少到最小形式。从循环中退出并尝试仅对半字(2 个字节)进行编程 - 该 CPU 中的编程是在半字上执行的,因此您的地址必须与两个对齐。

下面一行只是一些内存的声明。您不需要它来对数据闪存进行编程。

 __attribute__((__section__(".user_data"))) const char userConfig[64];

您看过我推荐给您的手册吗?

关于c - 通过闪存进行 STM32F1 EEPROM 仿真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51139751/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com