STM32 flash模拟EEprom程序
时间: 2024-05-03 14:21:32 浏览: 209
以下是一个简单的STM32 flash模拟EEprom程序的示例,可以在STM32微控制器上使用:
```c
#include "stm32f10x.h"
#define FLASH_START_ADDR 0x0800F000 // STM32 flash中的EEprom起始地址
#define FLASH_PAGE_SIZE 0x400 // STM32 flash中的EEprom页大小
void writeDataToEEprom(uint16_t data)
{
FLASH_Unlock(); // 解锁flash
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); // 清除flash标志位
// 确定要写入的地址
uint32_t addr = FLASH_START_ADDR;
while (addr < (FLASH_START_ADDR + FLASH_PAGE_SIZE)) {
if ((*(__IO uint16_t*)addr) == 0xFFFF) {
break;
}
addr += 2; // 因为是16位数据,所以地址要加2
}
// 如果flash中已经写满了,则擦除整个页
if (addr >= (FLASH_START_ADDR + FLASH_PAGE_SIZE)) {
FLASH_ErasePage(FLASH_START_ADDR);
addr = FLASH_START_ADDR;
}
// 写入数据
FLASH_ProgramHalfWord(addr, data);
FLASH_Lock(); // 锁定flash
}
uint16_t readDataFromEEprom()
{
uint32_t addr = FLASH_START_ADDR;
// 在flash中查找最后一个非空地址
while (addr < (FLASH_START_ADDR + FLASH_PAGE_SIZE)) {
if ((*(__IO uint16_t*)addr) == 0xFFFF) {
break;
}
addr += 2;
}
// 如果flash中有数据,则返回最后一个数据
if (addr > FLASH_START_ADDR) {
return (*(__IO uint16_t*)(addr - 2));
}
// 如果flash中没有数据,则返回0
return 0;
}
int main(void)
{
uint16_t data = 0;
// 从flash中读取数据
data = readDataFromEEprom();
// 写入数据到flash中
writeDataToEEprom(data + 1);
while (1);
}
```
该示例程序中,`writeDataToEEprom()`函数用于将数据写入STM32 flash模拟的EEprom中,`readDataFromEEprom()`函数用于从STM32 flash模拟的EEprom中读取数据。其中,数据被写入到flash中的起始地址`FLASH_START_ADDR`处,每个页面的大小为`FLASH_PAGE_SIZE`。在写入数据之前,程序会查找flash中最后一个非空地址,如果flash已经写满,则擦除整个页面。在读取数据时,程序会在flash中查找最后一个非空地址,并返回最后一个数据。如果flash中没有数据,则返回0。
需要注意的是,STM32 flash的寿命有限,因此建议在使用flash模拟EEprom时,尽可能减少写操作次数,以延长flash的使用寿命。
阅读全文