STM32Flash读写BUG,坑—————4字对齐

embedded/2025/1/13 17:37:25/

在 STM32 的 Flash 存储中,数据通常需要 4 字节对齐,这是由于其 Flash 存储的硬件设计和写入操作的限制决定的。
以下是更详细的原因与解释:

1. STM32 的 Flash 写入单位

STM32 的 Flash 通常以字(Word,4 字节 = 32 位)为基本操作单位。这意味着:

  • Flash 写操作是以 字(Word, 32 位)为最小单元进行的。
  • 即使你写入的数据小于 4 字节,底层的硬件仍然会以 4 字节为一组操作。
    因此,如果写入的数据没有 4 字节对齐,可能会导致:
  • 无法正确写入,或者写入错误(由于未对齐的数据会覆盖相邻的区域)。
  • 数据损坏,因为 Flash 的写入粒度为 4 字节,非对齐操作会导致其他区域被意外擦写。

2. 具体对齐要求的原因

以下是 STM32 Flash 对 4 字节对齐的需求来源:

  1. Flash 的最小写入单元
    • 对于许多 STM32 系列芯片,Flash 的最小写入单元是 4 字节(即 32 位)。
    • 例如:
      • STM32F1 系列:最小写入单元是 16 位(2 字节)。
      • STM32F4/F7/H7 系列:最小写入单元是 32 位(4 字节)。
      • 有些高端 STM32 芯片(如 H7 系列)甚至支持 64 位对齐。
    • 因此,Flash 写入时,数据地址通常必须满足 4 字节对齐
  2. Flash 擦除机制
    • Flash 的擦除是以扇区(Sector)或页(Page)为单位的。
    • 即使你只修改 1 个字节,底层硬件也需要先擦除整个扇区,然后重新写入。
    • 如果数据不对齐,可能会导致其他数据被意外覆盖。
  3. 总线访问限制
    • Cortex-M 内核(ARM 架构)的总线访问通常也要求数据地址对齐,尤其是对于 32 位数据,地址必须是 4 字节对齐的。
    • 如果不对齐,可能会触发硬件异常(如总线错误,BusFault)。

3. 如何保证数据对齐

在实际开发中,可以采取以下措施来保证数据对齐:

  1. 数据地址对齐
    使用编译器或语言提供的对齐属性。例如,在 C 语言中,可以使用 __attribute__((aligned(4))) 强制变量地址对齐:
    uint32_t flash_data __attribute__((aligned(4))) = 0x12345678;
    
  2. 写入时确保对齐
    • 如果需要写入非 4 字节对齐的数据,可以将数据填充(Padding)为 4 字节对齐后再写入。
    • 例如,使用数组或者结构体填充到 4 字节:
      uint8_t data[4] = {0x12, 0x34, 0x56, 0x78};
      HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, *(uint32_t *)data);
      
  3. 结构体对齐
    如果使用结构体来存储数据,注意对齐方式,并设置合适的对齐规则。例如:
    typedef struct {uint32_t data1;uint32_t data2;
    } FlashData;
    
  4. Flash 写入函数约束
    STM32 的 HAL 库(或 LL 库)中通常会要求传入的数据是 32 位的,函数会强制你按照 4 字节对齐来传入数据。

4. 注意事项

  • 如果你尝试写入非对齐数据,STM32 的 Flash 控制器通常会拒绝操作或者抛出错误。
  • 还需注意的是,在 Flash 写入操作之前,必须先擦除相应的扇区或页,才能避免数据覆盖。
  • 对于需要频繁更新的数据,可以考虑将非对齐数据通过 RAM 或其他中间缓存调整对齐后,再写入 Flash。

总结

在 STM32 的 Flash 写入中,数据必须满足 4 字节对齐的要求,这是由硬件设计和写入机制决定的。如果你的数据不满足对齐要求,需要在写入之前手动对其进行填充或调整,确保写入操作的正确性。


http://www.ppmy.cn/embedded/153615.html

相关文章

搜索引擎的设计与实现【源码+文档+部署讲解】

目 录 目 录 1 绪论 1.1 项目背景 1.2 国内外发展现状及分类 1.3 本论文组织结构介绍 2 相关技术介绍 2.1什么是搜索引擎 2.2 sqlserver数据库 2.3 Tomcat服务器 3 搜索引擎的基本原理 3.1搜索引擎的基本组成及其功能 3.2搜索引擎的详细工作流程 4 系统分析与…

对受控组件和非受控组件的理解?应用场景?

受控组件与非受控组件的理解与应用 在 React 中,组件可以通过两种方式管理表单元素的状态:受控组件和非受控组件。这两者在处理表单输入数据时有很大的区别,理解它们的应用场景和优劣对于开发者来说非常重要。 目录结构: 受控组…

做一个 简单的Django 《股票自选助手》显示 用akshare 库(A股数据获取)

图: 股票自选助手 这是一个基于 Django 开发的 A 股自选股票信息查看系统。系统使用 akshare 库获取实时股票数据,支持添加、删除和更新股票信息。 功能特点 支持添加自选股票实时显示股票价格和涨跌幅一键更新所有股票数据支持删除不需要的股票使用中…

Bash语言的面向对象编程

Bash语言的面向对象编程 引言 Bash是一种广泛使用的Unix shell,它不仅是一个命令行解释器,同时也是功能强大的脚本语言。尽管Bash并不是专门为面向对象编程(OOP)设计的,但我们仍然可以通过一些技巧和约定在Bash中实现…

【数通】MPLS

MPLS 是什么? 多协议标签技术 标准解释:是一种旨在提高大型网络或边缘站点传输数据的速度和效率的技术。是可以加快并简化从数据中心跨网络主干到边缘以及两者之间任何位置的连接。MPLS 在虚拟专用网(VPN)中工作,并与…

【IPy模块01】Python运维模块之IP 地址、网段的基本处理

实用的IP地址处理模块IPy IP地址规划是网络设计中非常重要的一个环节,规划的好坏会直接影响路由协议算法的效率,包括网络性能、可扩展性等方面,在这个过程当中,免不了要计算大量的IP地址,包括网段、网络掩码、广播地址…

【教程】Unity 本地化多语种 | Localization 工具组

开发平台:Unity 6.0 编程平台:Visual Studio 2022 编程语言:CSharp 6.0 工具包类:Localization   一、前言 本地化多语言类型是软件面向国际化所必须的功能项。Unity 在 2022 版本后推出 Localization 工具包,以降低…

Python脚本自动创建GitHub标签

在软件开发过程中,版本控制和标签管理是非常重要的环节。本文将介绍如何使用Python脚本自动为GitHub仓库创建标签,这对于自动化部署和版本追踪非常有用。 背景 在大型项目中,我们经常需要为不同的环境(如测试环境、生产环境)创建标签。手动创建这些标签不仅耗时,而且容…