stm32F030 FLASH 模拟eeprom代码
时间: 2023-09-09 20:13:11 浏览: 103
stm32f030内部FLASH模拟EEProm.rar
以下是基于STM32F030芯片实现FLASH模拟EEPROM的代码示例:
```c
#include "stm32f0xx.h"
#define FLASH_START_ADDR ((uint32_t)0x08007800) // FLASH起始地址
#define FLASH_END_ADDR ((uint32_t)0x08008000) // FLASH结束地址
#define FLASH_PAGE_SIZE ((uint32_t)0x400) // FLASH页大小
#define EEPROM_START_ADDR FLASH_START_ADDR // EEPROM起始地址
#define EEPROM_END_ADDR FLASH_END_ADDR // EEPROM结束地址
#define EEPROM_PAGE_SIZE FLASH_PAGE_SIZE // EEPROM页大小
#define EEPROM_SIZE (EEPROM_END_ADDR - EEPROM_START_ADDR) // EEPROM大小
// 初始化FLASH
void FLASH_Init(void)
{
// 解锁FLASH
FLASH_Unlock();
// 设置FLASH擦除和编程时的操作
FLASH_EraseSetPrgVoltage(FLASH_PROGRAM_VOLTAGE_RANGE_3);
// 禁用FLASH擦除和编程的错误中断
FLASH_DisableInterruptions();
// 锁定FLASH
FLASH_Lock();
}
// 读取EEPROM数据
uint32_t EEPROM_Read(uint32_t addr)
{
return *(volatile uint32_t *)addr;
}
// 写入EEPROM数据
void EEPROM_Write(uint32_t addr, uint32_t data)
{
// 判断地址是否在EEPROM范围内
if (addr >= EEPROM_START_ADDR && addr < EEPROM_END_ADDR)
{
uint32_t page_num = (addr - EEPROM_START_ADDR) / EEPROM_PAGE_SIZE; // 计算页号
uint32_t page_addr = EEPROM_START_ADDR + page_num * EEPROM_PAGE_SIZE; // 计算页起始地址
// 判断该页是否已经擦除
if ((*(volatile uint32_t *)page_addr) != 0xFFFFFFFF)
{
// 解锁FLASH
FLASH_Unlock();
// 擦除该页
FLASH_ErasePage(page_addr);
// 锁定FLASH
FLASH_Lock();
}
// 写入数据
*(volatile uint32_t *)addr = data;
}
}
int main(void)
{
uint32_t data = 0;
FLASH_Init(); // 初始化FLASH
// 读取和写入EEPROM数据
data = EEPROM_Read(EEPROM_START_ADDR);
EEPROM_Write(EEPROM_START_ADDR, data + 1);
while (1)
{
// 循环
}
}
```
以上代码实现了对FLASH的初始化、读取和写入EEPROM数据的功能。在写入EEPROM数据时,首先判断地址是否在EEPROM范围内,然后计算出页号和页起始地址,判断该页是否已经擦除,如果没有擦除,则擦除该页,最后写入数据。需要注意的是,在写入数据时,需要使用`volatile`关键字,以确保编译器不会对该变量进行优化。此外,需要在初始化时使用`FLASH_Unlock()`和`FLASH_Lock()`解锁和锁定FLASH,以确保能够对FLASH进行擦除和编程操作。
阅读全文