1、需求背景
FLASH跨页写入是一个常见的需求,特别是在需要向FLASH中写入任意长度数据,且这些数据可能跨越多个FLASH页时。由于FLASH的写入通常是以页为单位的擦除操作,因此跨页写入时需要特别注意边界条件。
下面是一个简单的示例,以STM32F103为例,展示了如何编写一个通用函数,用于向STM32F103的FLASH中写入任意长度的数据,且不采用先读取后写入的方式。这个函数使用字(32位)作为编程单位。
首先,你需要知道STM32F103的FLASH页大小。通常,每一页的大小是1KB(即1024字节)或者2KB 或者16KB,但请查阅你的具体型号的数据手册以确认。此外,STM32F103的FLASH编程是以半字(16位)或字(32位)为单位的,这里我们使用字编程。
#include "stm32f1xx_hal.h"
// 假设STM32F103的FLASH页大小为1024字节(1KB)
#define FLASH_PAGE_SIZE (1024U)
// 检查给定的地址是否在FLASH范围内
HAL_StatusTypeDef IsAddressInFlash(uint32_t address) {
if ((address >= FLASH_START_ADDRESS) && (address < (FLASH_START_ADDRESS + FLASH_END_ADDRESS))) {
return HAL_OK;
} else {
return HAL_ERROR