C语言写stm32f446内部flash的读写函数
时间: 2023-09-24 12:06:22 浏览: 73
以下是使用C语言编写的STM32F446内部Flash读写函数示例:
```c
#include "stm32f4xx_hal.h"
/* 内部Flash起始地址 */
#define INTERNAL_FLASH_START_ADDR 0x08000000
/* 内部Flash扇区大小 */
#define INTERNAL_FLASH_SECTOR_SIZE 0x4000
/* 内部Flash扇区数量 */
#define INTERNAL_FLASH_SECTOR_NUM 12
/* 内部Flash擦除超时时间(毫秒) */
#define INTERNAL_FLASH_ERASE_TIMEOUT 5000
/* 内部Flash写入超时时间(毫秒) */
#define INTERNAL_FLASH_WRITE_TIMEOUT 500
/**
* @brief 读取内部Flash中指定地址的数据
* @param address 要读取的地址
* @param buffer 读取数据存储的缓冲区
* @param length 要读取的数据长度(单位:字节)
* @return 读取的数据长度
*/
uint32_t InternalFlash_Read(uint32_t address, uint8_t *buffer, uint32_t length)
{
uint32_t i;
for (i = 0; i < length; i++)
{
buffer[i] = *(uint8_t *)(INTERNAL_FLASH_START_ADDR + address + i);
}
return i;
}
/**
* @brief 在内部Flash中写入数据
* @param address 要写入的起始地址
* @param buffer 要写入的数据缓冲区
* @param length 要写入的数据长度(单位:字节)
* @return 写入的数据长度
*/
uint32_t InternalFlash_Write(uint32_t address, uint8_t *buffer, uint32_t length)
{
HAL_StatusTypeDef status;
uint32_t i;
/* 初始化Flash操作 */
HAL_FLASH_Unlock();
/* 擦除Flash扇区 */
FLASH_Erase_Sector(FLASH_SECTOR_11, VOLTAGE_RANGE_3);
/* 写入数据 */
for (i = 0; i < length; i++)
{
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, INTERNAL_FLASH_START_ADDR + address + i, buffer[i]);
if (status != HAL_OK)
{
break;
}
}
/* 等待写入完成 */
HAL_FLASH_Lock();
return i;
}
/**
* @brief 擦除内部Flash中指定地址范围的数据
* @param start_address 要擦除的起始地址
* @param end_address 要擦除的结束地址
* @return 操作结果(0:成功,1:失败)
*/
uint32_t InternalFlash_Erase(uint32_t start_address, uint32_t end_address)
{
HAL_StatusTypeDef status;
FLASH_EraseInitTypeDef erase_init;
uint32_t sector_error;
/* 计算要擦除的扇区号 */
uint32_t start_sector = (start_address - INTERNAL_FLASH_START_ADDR) / INTERNAL_FLASH_SECTOR_SIZE;
uint32_t end_sector = (end_address - INTERNAL_FLASH_START_ADDR) / INTERNAL_FLASH_SECTOR_SIZE;
/* 初始化Flash操作 */
HAL_FLASH_Unlock();
/* 擦除Flash扇区 */
erase_init.TypeErase = FLASH_TYPEERASE_SECTORS;
erase_init.VoltageRange = VOLTAGE_RANGE_3;
erase_init.Sector = start_sector;
erase_init.NbSectors = end_sector - start_sector + 1;
status = HAL_FLASHEx_Erase(&erase_init, §or_error);
if (status != HAL_OK)
{
/* 操作失败 */
HAL_FLASH_Lock();
return 1;
}
/* 等待擦除完成 */
while (FLASH_WaitForLastOperation(INTERNAL_FLASH_ERASE_TIMEOUT) != HAL_OK);
/* 完成操作 */
HAL_FLASH_Lock();
return 0;
}
```
注:以上代码仅供参考,具体实现可能需要根据实际情况进行调整和优化。
阅读全文