用c语言写flash的读写函数
时间: 2023-05-26 22:06:28 浏览: 188
flash 闪存 读写时序 C 语言例子
5星 · 资源好评率100%
以下是一个简单的示例来实现flash的读写函数,假设我们的flash芯片大小为64 KB,每个扇区大小为1 KB,我们使用STM32的HAL库。
```
#include "stm32f1xx_hal.h"
#include <stdbool.h>
#define FLASH_START_ADDR ((uint32_t)0x08000000) // Flash起始地址
#define FLASH_SECTOR_SIZE ((uint32_t)0x400) // 扇区大小
#define FLASH_NUM_SECTORS ((uint32_t)64) // 扇区数量
#define FLASH_TIMEOUT ((uint32_t)1000) // 超时时间(ms)
// 函数:flash擦除
bool flash_erase(uint32_t sector_num)
{
// 检查扇区号是否超过范围
if(sector_num >= FLASH_NUM_SECTORS)
{
return false;
}
FLASH_EraseInitTypeDef erase_init;
erase_init.TypeErase = FLASH_TYPEERASE_SECTORS;
erase_init.Banks = FLASH_BANK_1;
erase_init.Sector = sector_num;
erase_init.NbSectors = 1;
erase_init.VoltageRange = FLASH_VOLTAGE_RANGE_3;
uint32_t page_error = 0;
HAL_StatusTypeDef status = HAL_FLASHEx_Erase(&erase_init, &page_error);
return (status == HAL_OK);
}
// 函数:flash写入
bool flash_write(uint32_t addr, const void *data, uint32_t size)
{
// 检查写入地址是否超过范围
if(addr + size > FLASH_START_ADDR + FLASH_NUM_SECTORS * FLASH_SECTOR_SIZE)
{
return false;
}
// 检查地址是否对齐
if(addr % 4 != 0)
{
return false;
}
HAL_StatusTypeDef status = HAL_OK;
// 禁止所有中断
__disable_irq();
// Debounce时间内等待直到Flash可写
HAL_FLASH_Unlock();
while(status == HAL_OK && size > 0)
{
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, *(uint32_t *)data);
addr += 4;
data += 4;
size -= 4;
}
HAL_FLASH_Lock();
// 重新允许所有中断
__enable_irq();
return (status == HAL_OK);
}
// 函数:flash读取
bool flash_read(uint32_t addr, void *data, uint32_t size)
{
// 检查读取地址是否超过范围
if(addr + size > FLASH_START_ADDR + FLASH_NUM_SECTORS * FLASH_SECTOR_SIZE)
{
return false;
}
// 检查地址是否对齐
if(addr % 4 != 0)
{
return false;
}
// 拷贝数据
size_t i;
for(i = 0; i < size / 4; ++i)
{
((uint32_t *)data)[i] = *(volatile uint32_t *)(addr + i * 4);
}
return true;
}
```
以上示例代码只是一个简单的参考,实际使用时需要结合具体的需要进行自定义修改。另外,flash操作是有一定危险性的,使用时需要非常小心。
阅读全文