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

在 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 字节对齐的要求,这是由硬件设计和写入机制决定的。如果你的数据不满足对齐要求,需要在写入之前手动对其进行填充或调整,确保写入操作的正确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950713.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

若依 ruoyi-vue HandlerInterceptor 拦截器 文件接口自定义权限

文件资源添加自定义权限 package com.huida.framework.config;import com.huida.framework.interceptor.FileInterceptor; import com.huida.framework.interceptor.RequestInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springfr…

网络安全-web渗透环境搭建-BWAPP(基础篇)

01--所需系统环境: 虚拟主机系统部署(vmware,虚拟主机创建、虚拟主机网络配置(桥接,便于网络中多个主机都能访问虚拟主机)、虚拟软件功能,快照、克隆、镜像文件加载,ova文件制作&am…

【计算机网络】课程 实验四 配置快速生成树协议(RSTP)

实验四 配置快速生成树协议(RSTP) 一、实验目的 1.理解快速生成树协议RSTP的工作原理。 2.掌握如何在交换机上配置快速生成树。 二、实验分析与设计 【背景描述】 某学校为了开展计算机教学和网络办公,建立了一个计…

API架构风格的深度解析与选择策略:SOAP、REST、GraphQL与RPC

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

目标检测文献阅读-DETR:使用Transformer进行端到端目标检测

目录 摘要 Abstract 1 引言 2 DETR结构 2.1 Backbone 2.2 Encoder 2.3 Decoder 2.4 FFN 3 目标检测集合预测损失 3.1 二分图匹配损失 3.2 损失函数 总结 摘要 本周阅读的论文题目是《End-to-End Object Detection with Transformers》(使用Transformer进行端到端目…

服务器双网卡NCCL通过交换机通信

1、NCCL变量设置 export CUDA_DEVICE_MAX_CONNECTIONS1 export NCCL_SOCKET_IFNAMEeno2 export NCCL_IB_DISABLE0 #export NCCL_NETIB export NCCL_IB_HCAmlx5_0,mlx5_1 export NCCL_IB_GID_INDEX3 export NCCL_DEBUGINFOGPUS_PER_NODE4MASTER_ADDR192.168.1.2 MASTER_PORT600…

B树及其Java实现详解

文章目录 B树及其Java实现详解一、引言二、B树的结构与性质1、节点结构2、性质 三、B树的操作1、插入操作1.1、插入过程 2、删除操作2.1、删除过程 3、搜索操作 四、B树的Java实现1、节点类实现2、B树类实现 五、使用示例六、总结 B树及其Java实现详解 一、引言 B树是一种多路…

数据分析思维(八):分析方法——RFM分析方法

数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python&#xff0c;更重要的是数据分析思维。没有数据分析思维和业务知识&#xff0c;就算拿到一堆数据&#xff0c;也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》&#xff0c;本文内容就是提取…

微信小程序用的SSL证书有什么要求吗?

微信小程序主要建立在手机端使用&#xff0c;然而手机又涉及到各种系统及版本&#xff0c;所以对SSL证书也有要求&#xff0c;如果要小程序可以安全有效的访问需要满足以下要求&#xff1a; 1、原厂SSL证书&#xff08;原厂封&#xff09;。 2、DV单域名或者DV通配符。 3、兼…

手动安装 Maven 依赖到本地仓库

文章目录 手动安装 Maven 依赖到本地仓库1. 下载所需的 JAR 文件2. 安装 JAR 文件到本地仓库3. 验证安装4. 在项目中使用该依赖 手动安装 Maven 依赖到本地仓库 遇到的问题&#xff1a; idea导入一个新的工程&#xff0c;发现pom文件中的一些依赖死活下载不下来&#xff0c;这…

VSCode Live Server 插件安装和使用

VSCode Live Server是一个由Ritwick Dey开发的Visual Studio Code扩展插件&#xff0c;它提供了一个带有实时重载功能的本地开发服务器。在VSCode中安装和使用Live Server插件进行实时预览和调试Web应用程序。这将大大提高前端开发效率&#xff0c;使网页设计和开发变得更为流畅…

UART串口数据分析

串口基础知识详细介绍&#xff1a; 该链接详细介绍了串并行、单双工、同异步、连接方式 https://blog.csdn.net/weixin_43386810/article/details/127156063 该文章将介绍串口数据的电平变化、波特率计算、脉宽计算以及数据传输量的计算。 捕获工具&#xff1a;逻辑分析仪&…

Internet协议原理

文章目录 考试说明Chapter 0: 本书介绍Chapter 1: Introduction And Overview 【第1章&#xff1a;引言与概述】Chapter 2: Overview Of Underlying Network Technologies 【第2章&#xff1a;底层网络技术的回顾】Chapter 3: Internetworking Concept And Architectural Model…

DeepSeek-V3 通俗详解:从诞生到优势,以及与 GPT-4o 的对比

1. DeepSeek 的前世今生 1.1 什么是 DeepSeek&#xff1f; DeepSeek 是一家专注于人工智能技术研发的公司&#xff0c;致力于打造高性能、低成本的 AI 模型。它的目标是让 AI 技术更加普惠&#xff0c;让更多人能够用上强大的 AI 工具。 1.2 DeepSeek-V3 的诞生 DeepSeek-V…

linux之自动挂载

如果想要实现自动挂载&#xff0c;应该挂在客户端&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 客户端&#xff1a; [rootlocalhost ~]# yum install nfs-utils -y &#xff08;下载软件&#xff09; [rootlocalhost ~]# systemctl start nfs-utils.servic…

RHCSA知识点汇总

第0章&#xff1a;Linux基础入门 0.1 什么是计算机 计算机的组成&#xff1a; 控制器&#xff1a;是整个计算机的中枢神经&#xff0c;根据程序要求进行控制&#xff0c;协调计算机各部分工作及内存与外设的访问等。 输入设备&#xff1a;将文字、数据、程序和控制命令等信…

交响曲-24-3-单细胞CNV分析及聚类

CNV概述 小于1kb是常见的插入、移位、缺失等的变异 人体内包含<10% 的正常CNV&#xff0c;我们的染色体数是两倍体&#xff0c;正常情况下&#xff0c;只有一条染色体表达&#xff0c;另一条沉默&#xff0c;当表达的那条染色体发生CNV之后&#xff0c;表达数量就会成倍增加…

【Linux-多线程】POSIX信号量-基于环形队列生产消费模型

POSIX信号量 POSIX信号量和System V信号量作用相同&#xff0c;都是用于同步操作&#xff0c;达到无冲突的访问共享资源的目的。但POSIX可以用于线程间同步 1.快速认识信号量接口 POSIX信号量分为两种类型&#xff1a; 命名信号量&#xff08;Named Semaphores&#xff09;&…

Linux下文件操作相关接口

文章目录 一 文件是什么普通数据文件 二 文件是谁打开的进程用户 三 进程打开文件的相关的接口c语言标准库相关文件接口1. fopen 函数2. fread 函数3. fwrite 函数4. fclose 函数5. fseek 函数 linux系统调用接口1. open 系统调用2. creat 系统调用3. read 系统调用4. write 系…

UE蓝图节点备忘录

获取索引为0的玩家 获取视图缩放 反投影屏幕到世界 获取屏幕上的鼠标位置 对指定的物体类型进行射线检测 判断物体是否有实现某个接口 上面节点的完整应用 通过PlayerControlle获取相机相关数据 从相机处发射射线撞击物体从而获取物体信息 抽屉推拉功能 节点说明 ##门的旋转开关…