关于你STM32F407片内FLASH擦除失败的问题

2023-10-30

        近日,发现STM32F407片内FLASH在写入数据时某些情况下会出现扇区擦除不成功的情况,使用正点原子的代码测试也出一样的情况。网上搜索也没找到较为理想的答案。只有一篇文章遇到同样问题,也是使用了一个不太可靠的办法,但是好在可以解决问题。

参见文章:STM32F407片内FLASH擦除失败问题_mob604756f61e6c的技术博客_51CTO博客

        后来我反复测试发现,如果连续写两次数据,第一次写不成功,但是第二次却可以写成功。参考上面的文章,我觉得问题很可能出现在flash解锁和擦除flash之间,很有可能擦除flash之前解锁操作并为完成导致。

        最后我在解锁后加了等待操作完成的语句后,问题解决。完整代码如下:

void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)    
{
    FLASH_EraseInitTypeDef FlashEraseInit;
    HAL_StatusTypeDef FlashStatus=HAL_OK;
    u32 SectorError=0;
    u32 addrx=0;
    u32 endaddr=0;    
    if(WriteAddr<STM32_FLASH_BASE||WriteAddr%4)return;    //非法地址
    
    HAL_FLASH_Unlock();             //解锁    
    FLASH_WaitForLastOperation(FLASH_WAITETIME);    //添加的代码
        
    addrx=WriteAddr;                //写入的起始地址
    endaddr=WriteAddr+NumToWrite*4;    //写入的结束地址
    
    if(addrx<0X1FFF0000)
    {
        while(addrx<endaddr)        //扫清一切障碍.(对非FFFFFFFF的地方,先擦除)
        {
             if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//有非0XFFFFFFFF的地方,要擦除这个扇区
            {   
                FlashEraseInit.TypeErase=FLASH_TYPEERASE_SECTORS;       //擦除类型,扇区擦除
                FlashEraseInit.Sector=STMFLASH_GetFlashSector(addrx);   //要擦除的扇区
                FlashEraseInit.NbSectors=1;                             //一次只擦除一个扇区
                FlashEraseInit.VoltageRange=FLASH_VOLTAGE_RANGE_3;      //电压范围,VCC=2.7~3.6V之间!!
                                
                if(HAL_FLASHEx_Erase(&FlashEraseInit,&SectorError)!=HAL_OK)//出错的地方
                {
                    break;//发生错误了    
                }

                }else addrx+=4;
                FLASH_WaitForLastOperation(FLASH_WAITETIME);                //等待上次操作完成
        }
    }
    FlashStatus=FLASH_WaitForLastOperation(FLASH_WAITETIME);            //等待上次操作完成
    if(FlashStatus==HAL_OK)
    {
         while(WriteAddr<endaddr)//写数据
         {
            if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,WriteAddr,*pBuffer)!=HAL_OK)//写入数据
            {
                break;    //写入异常
            }
            WriteAddr+=4;
            pBuffer++;
        }  
    }
    HAL_FLASH_Lock();           //上锁
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于你STM32F407片内FLASH擦除失败的问题 的相关文章

  • 将结构体偏移属性赋予汇编器

    如何将 C 结构体的偏移量发送到汇编代码 例如 在我的 C 代码中 typedef struct unsigned int a unsigned int b CMyStruct 我向 ASM 函数发送一个 CMyStruct 结构的指针 假
  • 使用 gnueabihf 为 ARMv6 构建

    我尝试为 ARMv6 构建应用程序 但失败了 我猜问题是工具链支持硬浮点 但 ARMv6 不支持 好吧 首先我设置 march armv6 编译失败 opt gcc linaro arm linux gnueabihf 4 8 2014 0
  • ARM Neon:如何从 uint8x16_t 转换为 uint8x8x2_t?

    我最近发现了关于vreinterpret q dsttype src类型转换运算符 https stackoverflow com a 43519190 2436175 但是 这似乎不支持所描述的数据类型的转换这个链接 http infoc
  • 将 GCC 内联汇编与采用立即值的指令结合使用

    问题 我正在为 ARM Cortex M3 处理器开发定制操作系统 为了与我的内核交互 用户线程必须生成 SuperVisor Call SVC 指令 以前称为 SWI 用于软件中断 该指令在ARM ARM中的定义是 这意味着该指令需要即时
  • ARM Cortex A8 PMNC 读取在启用后也给出 0.. 有什么想法/建议吗?

    MODULE LICENSE GPL MODULE DESCRIPTION user mode access to performance registers int init arm init void unsigned int valu
  • 源和目标具有不同的 EABI 版本

    我正在尝试使用 ARM 工具链编译 so 文件 但是我不断收到这个错误 错误 源对象的 EABI 版本为 0 但目标对象的 EABI 版本为 5 我无法更改工具链中的任何内容 因为我必须使用给定的工具链 我以前从未见过这个错误 我使用了这个
  • 可以使用Visual Studio 2012构建ARM桌面程序吗?

    我正在使用 Visual Studio 2012 beta 我的桌面 win32 程序在 ARM 架构中编译得很好 升级到 Visual Studio 2012 RC 后 编译器无法工作并出现以下错误 不支持为 ARM 平台编译桌面应用程序
  • 为什么 i2c_smbus 函数不可用? (I2C——嵌入式Linux)

    有很多参考使用i2c smbus 开发嵌入式 Linux 软件时在 I2C 总线上进行通信的函数 什么时候i2c smbus函数如i2c smbus read word data在软件项目中引用了 ARM8 处理器错误 例如 i2c smb
  • 产生并处理软件中断

    有人可以告诉我如何在Linux下生成软件中断然后用request irq处理它吗 或者也许这是不可能的 您可以使用软中断来代替 您可以通过编辑 include linux interrupt h 来定义您的 sofirq 然后使用函数 ra
  • 使用 Android NDK 使用 -fsigned-char 进行构建安全吗?

    为了与其他平台保持一致 我需要使用signed char在我正在处理的一些本机代码中 但默认情况下在Android NDK上char类型是unsigned 我尝试明确使用signed char类型 但它生成太多警告differ in sig
  • 了解 ctags 文件格式

    我使用 Exhuberant ctags 来索引我的 c 项目中的所有标签 c project 是 Cortex M7 微控制器的嵌入式软件 结果是一个标签文件 我正在尝试阅读该文件并理解所写的内容 根据我找到的 ctags 和 Exhub
  • saber sd 如何在没有 SPL 的情况下直接从 uboot 启动

    sabre sd 基于 imx 6 最大内部 RAM 约为 150Kb 然而 uboot 足够大 可以容纳在这个空间中 在这个场景中事情是如何进行的 https community freescale com docs DOC 95015
  • ARM Chromebook 上的 Android 开发环境?

    我尝试了多次安装和使用安卓工作室 https developer android com studio index html on an ARM Chromebook C100P https archlinuxarm org platfor
  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • 设备树不匹配:.probe 从未被调用

    我无法理解设备树的工作原理 或者具体来说为什么该驱动程序无法初始化 这是在 android 版本 3 10 的 rockchip 供应商内核中 驱动程序 看门狗 rk29 wdt c 为了可读性而减少 static const struct
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • ARM NEON 矢量化失败

    我想在 ARM cortex a9 上启用 NEON 矢量化 但在编译时得到以下输出 未矢量化 不支持相关 stmt D 14140 82 D 14143 77 D 14141 81 这是我的循环 void my mul float32 t
  • 需要一些建议来开始在 ARM(使用 Linux)平台上编程

    我 也许 很快就会在托管 Linux 发行版的 ARM 平台上工作 我不知道哪个发行版 我知道该项目涉及视频流 但我无法告诉你更多信息 其实我只收到通知 还没见到任何人 我从来没有在这样的平台上工作过 所以我的想法是在项目开始之前进行测试
  • 如何在WinMobile6上启用ARMv6非对齐访问?

    ARMv6 引入了一个很棒的功能 未对齐的内存访问 这使得代码中的某些事情变得更加简单和更快 但微软只在winCE6中提供了API 现在大多数 PDA 都基于 WinMobile6 基于 CE 5 x 默认情况下禁用未对齐访问 我尝试在 C
  • 直接写入 ARM Cortex A8 分支预测器中的全局历史缓冲区 (GHB) 或 BTB?

    我有兴趣直接修改 Cortex A8 上的 BTB 分支目标缓冲区 和 GHB 的内容 ARM 手册上有这样的内容 要在指令端 GHB 数组中写入一项 例如 LDR R0 0x3333AAAA MCR p15 0 R0 c15 c1 0 M

随机推荐

  • aiohttp 异步http请求-3.异步批量下载图片

    前言 当我们需要批量下载图片的时候 requests 库会比较慢 如果一个个下载 出现阻塞的时候 后面的都会阻塞卡住 假死状态 当然你用多线程也能提高效率 这里介绍用aiohttp 异步批量下载图片 异步批量下载图片 话不多说 直接看代码
  • DDT数据驱动

    一 DDT介绍 数据驱动思想 数据和用例进行分离 通过外部数据去生成测试用例 适用场景 进行接口测试时 每个接口的传参都不止一种情况 一般会考虑正向 逆向等多种组合 所以在测试一个接口时通常会编写多条case 而这些case除了传参不同外
  • IMU-Allan方差分析

    使用Allan方差来确定MEMS陀螺仪的噪声参数 陀螺仪测量模型为 使用长时间静止的陀螺仪数据对陀螺仪噪声参数进行分析 上式中 三个噪声参数N 角度随机游走 K 速率随机游走 和B 偏差不稳定性 背景 Allan方差最初由David W A
  • Visual Studio(VS)的基本使用

    Visual Studio VS 的基本使用 本文中1 10章节是我观看黄强老师视频所记录的笔记 详细内容请观看视频 30分钟学会Visual Studio 2017 文章目录 Visual Studio VS 的基本使用 1 VS下载 2
  • 贪心+回溯(磁带长度)

    题目内容 设有n个程序 1 2 n 要存放在长度为L的磁带上 程序i存放在磁带上的长度是li 1 lt i lt n 程序存储问题要求确定这n个程序在磁带上的一个存储方案 使得能够在磁带上存储尽可能多的程序 在保证存储最多程序的前提下 要求
  • (SRMD)CVPR-2018:Learning a Single Convolutional Super-Resolution Network for Multiple Degradations

    学习用于多种退化的单个的卷积超分辨率网络 代码地址 GitHub cszn SRMD Learning a Single Convolutional Super Resolution Network for Multiple Degrada
  • 题目78:日志排序

    运维工程师采集到某产品线网运行一天产生的日志n条 现需根据日志时间先后顺序对日志进行排序 日志时间格式为H M S N H表示小时 0 23 M表示分钟 0 59 S表示秒 0 59 N表示毫秒 0 999 时间可能并没有补全 也就是说 0
  • qml的focus问题

    这是应用中令人头痛的焦点问题 如果没有焦点项 键事件就不能被处理 它就不能在一个屏幕中做任何事情 应用程序会挂起 基本上 qml中的基本元素是 item item有两个属性 焦点和活动焦点 activeFocus是只读的 当将焦点设置为一个
  • ubuntu 中 :dpkg 被中断,您必须手工运行 sudo dpkg --configure -a 解决此问题

    E dpkg 被中断 您必须手工运行 sudo dpkg configure a 解决此问题 sudo rm var lib dpkg updates sudo apt get update 转载于 https www cnblogs co
  • Keil5关于.h文件编译时遇见报错打不开时的解决方案

    添加路径即可
  • Centos设置ssh免密登录

    查看安装的ssh软件 rpm qa查询系统安装的所有软件 对前面rpm查询结果进行搜索ssh rpm qa grep ssh 安装netstat工具查询软件进程的端口号 yum y install net tool 使用netstat查询2
  • 品味树莓派:GPIO口定义、电气特性、启动状态等基础说明

    文章目录 目录 GPIO口定义 电气特性 启动状态 总结 目录 树莓派相比成品化的电脑来说有很多独立的GPIO口可供开发使用 可以方便的实现很多实物相关的功能 本文将对树莓派开放给用户的GPIO口的针脚定义 电气特性 启动状态等基础内容做个
  • svm多分类_数据挖掘算法——常用部分分类算法

    分类算法 分类是在一群已经知道类别标号的样本中 训练一种分类器 让其能够对某种未知的样本进行分类 分类算法属于一种有监督的学习 分类算法的分类过程就是建立一种分类模型来描述预定的数据集或概念集 通过分析由属性描述的数据库元组来构造模型 分类
  • OpenSSL之EVP(一)——数据结构及源码结构介绍

    EVP简介 Openssl EVP提供了丰富的密码学中的各种函数 Openssl 中实现了各种对称算法 摘要算法以及签名 验签算法 EVP 函数将这些具体的算法进行了封装 EVP 主要封装了如下功能函数 1 实现了 base64 编解码 B
  • 新浪期货数据接口

    附注 对于期货数据 一直在寻找互联网上能够获得的比较好的数据源 最近发现了 新浪期货 的数据源 可以提供一分钟的期货K线数据 http hq sinajs cn list TICKER 对于国内期货连续 Ticker为正常Ticker加个0
  • Deep Residual Network

    先阅读者两篇写的比较好的博客 https blog csdn net dulingtingzi article details 79870486 https blog csdn net qq 31050167 article details
  • 高德地图绘制标记点,点击弹出弹框进入第三方地图软件

    需求 根据经纬度绘制标记点 点击标记点弹出弹框和底部按钮 点击顶部弹框进入二级界面 点击底部按钮弹出第三方地图软件选择页 实现跨进程跳转 效果图 项目是公司项目 只放出重要部分代码 final Marker marker1 aMap add
  • 计算机图形学入门(八)-着色(插值、高级纹理映射)

    目录 重心坐标 应用纹理 1 纹理分辨率很小 2 纹理分辨率过大 纹理的应用 颜色 环境贴图 Environment Map 法线贴图 凹凸贴图 位移贴图 三维纹理和三维噪声 着色信息的记录 学习视频来源 GAMES101 现代计算机图形学
  • 【操作系统】进程间通信的五种方式

    引言 1 进程对白 管道 记名管道 套接字 1 管道 2 虫洞 套接字 3 信号 4 信号旗语 信号量 5 进程拥抱 共享内存 引言 进程作为人类的发明 自然免不了脱离人类的习性 也有通信需求 如果进程之间不进行任何通信 那么进程所能完成的
  • 关于你STM32F407片内FLASH擦除失败的问题

    近日 发现STM32F407片内FLASH在写入数据时某些情况下会出现扇区擦除不成功的情况 使用正点原子的代码测试也出一样的情况 网上搜索也没找到较为理想的答案 只有一篇文章遇到同样问题 也是使用了一个不太可靠的办法 但是好在可以解决问题