STM32FLASH读写源码
STM32FLASH读写源码
以下是使用STM32标准外设库(适用于STM32F1/F4等系列)进行FLASH读写的示例代码。代码包含解锁、擦除、写入和读取操作,并进行了详细的中文注释:
#include "stm32f10x.h" // 根据实际型号包含对应头文件
// FLASH操作状态定义
typedef enum {
FLASH_COMPLETE = 0,
FLASH_ERROR
} FLASH_Status;
// FLASH起始地址(示例使用扇区5)
#define FLASH_START_ADDR ((uint32_t)0x08020000) // 对应128KB型号的扇区5起始地址
#define FLASH_SECTOR_TO_USE FLASH_Sector_5 // 选择使用的扇区
// 解锁并初始化FLASH
FLASH_Status FLASH_Init(void) {
// 1. 解锁FLASH
FLASH_Unlock();
// 2. 清除所有错误标志位
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
return FLASH_COMPLETE;
}
// 擦除指定扇区
FLASH_Status FLASH_EraseSector(uint32_t Sector) {
FLASH_Status status = FLASH_COMPLETE;
// 等待上次操作完成
if(FLASH_GetStatus() != FLASH_BUSY) {
// 执行扇区擦除
status = FLASH_ErasePage(Sector); // 对于F1系列使用FLASH_ErasePage()
// F4系列使用 FLASH_EraseSector(Sector, VoltageRange_3);
}
return status;
}
// 写入数据到FLASH(半字/字操作)
FLASH_Status FLASH_Write(uint32_t addr, const uint8_t *data, uint32_t len) {
FLASH_Status status = FLASH_COMPLETE;
// 确保地址和长度有效
if((addr < FLASH_START_ADDR) || (len == 0))
return FLASH_ERROR;
// 写入数据(以半字为单位)
for(int i = 0; i < len; i += 2) {
uint16_t val = *(uint16_t*)(&data[i]); // 组合两个字节
// 执行写入操作
if(FLASH_ProgramHalfWord(addr + i, val) != FLASH_COMPLETE) {
status = FLASH_ERROR;
break;
}
// 验证写入(可选)
if(*(volatile uint16_t*)(addr + i) != val) {
status = FLASH_ERROR;
break;
}
}
return status;
}
// 从FLASH读取数据
void FLASH_Read(uint32_t addr, uint8_t *buf, uint32_t len) {
const uint8_t *flash_ptr = (const uint8_t*)addr;
for(int i = 0; i < len; i++) {
buf[i] = flash_ptr[i];
}
}
/* 使用示例 */
int main() {
// 初始化FLASH
if(FLASH_Init() != FLASH_COMPLETE) {
// 错误处理
while(1);
}
// 擦除扇区
if(FLASH_EraseSector(FLASH_SECTOR_TO_USE) != FLASH_COMPLETE) {
// 错误处理
while(1);
}
// 准备测试数据
uint8_t write_data[] = "STM32 FLASH Test";
uint8_t read_data[sizeof(write_data)];
// 写入数据
if(FLASH_Write(FLASH_START_ADDR, write_data, sizeof(write_data))
!= FLASH_COMPLETE) {
// 错误处理
}
// 读取验证
FLASH_Read(FLASH_START_ADDR, read_data, sizeof(write_data));
// 比较数据(省略比较代码)
// 操作完成后锁定FLASH
FLASH_Lock();
while(1);
}
关键注意事项:
-
扇区选择:
- STM32F1系列:扇区0-3=16KB,扇区4=64KB,扇区5-11=128KB(具体参考手册)
- STM32F4系列:扇区大小不一致(0-3=16KB, 4=64KB, 5-11=128KB)
-
写入对齐:
- 写入操作必须是 半字(16位)或字(32位) 对齐
- 地址必须是 2 或 4 的倍数(F1系列要求半字对齐)
-
临界操作:
- 擦除和写入期间禁止中断(操作前关闭全局中断)
__disable_irq(); // 开始操作前禁用中断 // FLASH操作 __enable_irq(); // 操作完成后恢复中断
- 擦除和写入期间禁止中断(操作前关闭全局中断)
-
库版本差异:
- F4系列使用
HAL_FLASH_Program()替代FLASH_ProgramHalfWord() - F4擦除接口为
HAL_FLASHEx_Erase()
- F4系列使用
-
重要安全措施:
- 绝对避免擦除运行中的代码扇区(通常保留最后几个扇区存储数据)
- 操作前校验地址范围是否合法
- 写入后建议进行数据校验
常见问题处理:
- 写入失败:检查电压稳定性、时钟配置(需使用内部RC振荡器)
- 擦除卡死:操作前清除所有标志位(
FLASH_ClearFlag()) - 数据错位:确保数据长度是2的倍数(不足需补齐)
具体实现请参考对应型号的《参考手册》和《Flash programming manual》文档,不同系列操作细节存在差异。建议使用CubeMX生成初始化代码,再添加擦写功能。
STM32CUBEIDE(16)----内部Flash读写
本例程主要讲解如何对芯片自带Flash进行读写,用芯片内部Flash可以对一些需要断电保存的数据进行保存,无需加外部得存储芯片,本例程采用的是
2023-07-27 09:24:48
使用带有-S选项的stm32flash但得到错误信息是为什么?
使用 stm32flash -a0x51 -w binary.bin -S 0x3000 /dev/i2c-4但回来无法在地址 0x00003000 写入内存对于 0x8003000,我得到擦除记忆
STM32CUBEMX(10)--Flash读写
本例程主要讲解如何对芯片自带Flash进行读写,用芯片内部Flash可以对一些需要断电保存的数据进行保存,无需加外部得存储芯片,本例程采用的是
2022-11-14 16:36:42
STM32 内部Flash读写 程序源码 [已验证]
由于STM32 系列Flash的Erase功能都是按Page擦除,所以想往Flash写入某一段数据,又想保持其他数据不变的话,就要做缓存
资料下载
佚名
2021-12-02 12:06:10
STM32FLASH实验-SPI
STM32FLASH实验-SPI(嵌入式开发考研考什么)-FLASH实验-SPI学习目标:1、学会STM32硬件SPI2、学会对EN25Q64进
资料下载
佚名
2021-08-04 12:58:51
STM32内部Flash读写程序源码相关资料下载
由于STM32 系列Flash的Erase功能都是按Page擦除,所以想往Flash写入某一段数据,又想保持其他数据不变的话,就要做缓存
STM32F10x_SPI (硬件接口 + 软件模拟)读写Flash(25Q16)
STM32F10x_SPI(硬件接口 + 软件模拟)读写Flash(25Q16)
2020-03-25 13:59:46
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机