当前位置: 首页 > news >正文

STM32F4操作内部FLASH简洁版

地址布局

在这里插入图片描述

擦除

擦除使用HAL_FLASHEx_Erase()函数,需要解锁操作完后再上锁

擦除的单位是扇区,sector_index对应着上表中的扇区序号

int test_flash_erasr(uint32_t sector_index)
{FLASH_EraseInitTypeDef EraseInitStruct;uint32_t SectorError = 0;EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;  // 擦除整个扇区EraseInitStruct.Sector = sector_index;                // 扇区序号,非地址EraseInitStruct.NbSectors = 1;                        // 连续擦除的扇区数量EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3; // 电压范围HAL_FLASH_Unlock();HAL_StatusTypeDef status = HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError);if (status != HAL_OK){printf("Flash Erase Error: %d\r\n", status);HAL_FLASH_Lock();return -1;}HAL_FLASH_Lock();return 0;
}

写使用HAL_FLASH_Program()函数,需要解锁操作完后再上锁

可以按字节、半字、字和双字数据写入,这里按字写入

void test_flash_write(uint32_t address, uint8_t *buff, size_t size)
{HAL_FLASH_Unlock();uint32_t *data = (uint32_t *)buff;for (size_t i = 0; i < size / 4; i++){HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address + i * 4, data[i]);}HAL_FLASH_Lock();
}

读可以直接按地址取值,这里以dump hex为例

void test_dump_hex(uint8_t *data, size_t size)
{for (size_t i = 0; i < size; i++){if (i % 16 == 0){printf("\r\n%08X: ", i);}printf("%02X ", data[i]);}printf("\r\n");
}test_dump_hex(0x8040000, 128);

测试

    test_dump_hex(0x8040000, 128);test_flash_erasr(FLASH_SECTOR_6);test_dump_hex(0x8040000, 128);test_flash_write(0x8040000, data, 128);test_dump_hex(0x8040000, 128);

结果如下:

00000000: 42 54 4C 44 00 03 E9 07 00 00 06 12 0F 18 04 FF
00000010: 88 49 00 00 22 51 49 AA 00 00 00 30 00 00 00 30
00000020: FF 00 FF FF 00 00 08 00 D0 BA AC AC 00 00 FF FF
00000030: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000040: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000050: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000060: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000070: FF FF FF FF FF FF FF FF FF FF FF FF AC 0B FD EF00000000: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000010: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000020: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000030: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000040: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000050: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000060: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000070: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000000: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000010: 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
00000020: 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
00000030: 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
00000040: 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
00000050: 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
00000060: 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
00000070: 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
http://www.dtcms.com/a/263625.html

相关文章:

  • 【代码审计】安全审核常见漏洞修复策略
  • 位运算经典题解
  • 启用不安全的HTTP方法
  • 图像处理专业书籍以及网络资源总结
  • Java编程之状态模式
  • 《UE5_C++多人TPS完整教程》学习笔记40 ——《P41 装备(武器)姿势(Equipped Pose)》
  • 基于Socketserver+ThreadPoolExecutor+Thread构造的TCP网络实时通信程序
  • mac重复文件清理,摄影师同款清理方案
  • flv.js视频/直播流测试demo
  • 2025 推理技术风向标:DeepSeek-R1 揭示大模型从 “记忆” 到 “思考” 的进化路径
  • 【linux】基础开发工具(1)
  • Flink Savepoints 总结
  • js代码09
  • Spring Boot WebSocket方案终极指南:Netty与官方Starter对比与实践
  • MFC的List Control自适应主界面大小
  • Android Gradle 插件和 Android Studio 兼容性
  • Windows下配置Docker+WSL集成开发环境
  • 【C#】如果有一个数值如 168.0000100,如何去除末尾的无效零,只显示有效的小数位数,让DeepSeek给我们解答
  • 飞算JavaAI—AI编程助手 | 编程领域的‘高科技指南针’,精准导航开发!
  • 小米YU7使用UWB技术,厘米级定位精准迎宾,安全防破解无感控车
  • CentOS系统新手指导手册
  • 微信小程序实现table表格
  • 【锂电池剩余寿命预测】GRU门控循环单元锂电池剩余寿命预测(Pytorch完整源码和数据)
  • 清理 Docker 缓存占用
  • 前端常用构建工具介绍及对比
  • 西交从语义到关系、重塑具身导航策略!RSRNav:基于空间关系推理的图像目标导航
  • android stdio 创建 mediaplayertest
  • SpringBoot+MySQL旅游资源管理系统Java源码
  • Reactor ConnectableFlux支持多订阅者
  • OpenCV CUDA模块设备层-----双曲正切函数tanh()