stm32的HAL库函数flash无法写入的问题

2023-11-20

记录一下对flash编程操作时出现的问题以及解决办法

问题:在使用HAL库中的HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data)函数时发现总是没办法写入(明明写之前使用void FLASH_PageErase(uint32_t PageAddress)函数擦除了flash),查阅资料说是可能是因为固件库HAL_FLASH_Program函数有问题,建议换成寄存器直接操作,但是换成后发现仍有问题,读写入地址的数据任然是0xffffffff。

多次尝试发现,在第一次使用FLASH_PageErase擦除flash以及HAL_FLASH_Program写flash,烧录后,读取写入地址数据是0xffffffff,但是紧接着在代码中注释掉FLASH_PageErase这行,再次烧录,就会发现写入地址处的数据是程序中要写的数据,但是reset后就会发现,HAL_FLASH_Program函数的写入状态有问题,如下图所示:

 

以上可以猜测一下,可能是固件库 FLASH_PageErase函数有问题,选择用寄存器直接操作,直接照搬正点原子的寄存器函数,如下所示:

static uint8_t stmflash_get_error_status(void)
{
    uint32_t res;
    res = FLASH->SR;

    if (res & (1 << 0))return 1;    /* BSY = 1      , 忙 */
    if (res & (1 << 2))return 2;    /* PGERR = 1    , 编程错误*/
    if (res & (1 << 4))return 3;    /* WRPRTERR = 1 , 写保护错误 */
    
    return 0;   /* 没有任何错误 操作完成. */
}

static uint8_t stmflash_wait_done(uint32_t time)
{
    uint8_t res;

    do
    {
        res = stmflash_get_error_status();

        if (res != 1)
        {
            break;      /* 非忙, 无需等待了, 直接退出 */
        }
        
        time--;
    } while (time);

    if (time == 0)res = 0XFF;   /* 超时 */

    return res;
}

/**
 * @brief       擦除扇区
 * @param       saddr   : 扇区地址 0 ~ 256
 * @retval      执行结果
 *   @arg       0   : 已完成
 *   @arg       2   : 编程错误
 *   @arg       3   : 写保护错误
 *   @arg       0XFF: 超时
 */
static uint8_t stmflash_erase_sector(uint32_t saddr)
{
    uint8_t res = 0;  /* STM32F103擦除的时候是指定半字地址 */
    res = stmflash_wait_done(0X5FFFFF);     /* 等待上次操作结束, >20ms */

    if (res == 0)
    {
        FLASH->CR |= 1 << 1;    /* 页擦除 */
        FLASH->AR = saddr;      /* 设置页地址(实际是半字地址) */
        FLASH->CR |= 1 << 6;    /* 开始擦除 */
        res = stmflash_wait_done(0X5FFFFF); /* 等待操作结束, >20ms */

        if (res != 1)   /* 非忙 */
        {
            FLASH->CR &= ~(1 << 1); /* 清除页擦除标志 */
        }
    }

    return res;
}

然后主函数中添加如下代码:

/* USER CODE BEGIN 1 */
	__IO uint32_t addr = 0x08020000;
	uint32_t applength = 0;
	uint16_t status;
/* USER CODE END 1 */

/* USER CODE BEGIN 2 */
	printf("更换为正点原子的寄存器擦除函数后的结果:\r\n");
	HAL_FLASH_Unlock();
  stmflash_erase_sector(addr);
	status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, 0x01f360b45);
	HAL_FLASH_Lock();
	applength = *(uint32_t *)addr;
	printf("写入flash中的数据是%x\r\n",applength);
	printf("flash的写函数返回值是%x\r\n",status);
/* USER CODE END 2 */

 烧录后结果以及reset结果如下:

成功解决问题 !

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

stm32的HAL库函数flash无法写入的问题 的相关文章

  • flea-auth使用之用户子模块介绍

    用户子模块 本篇主要介绍笔者 授权模块 flea auth 下的用户子模块 1 总览 表名 中文描述 flea account 账户 flea account attr 账户扩展属性 flea user 用户 flea user attr
  • libevent的消息传递和回调注册函数

    参考原帖地址 https www cnblogs com secondtonone1 p 5554075 html 1 evconnlistener new bind函数 1 evconnlistener new bind 完成socket
  • JDK8下载安装

    参考 JDK8下载安装教程 涵涵想养猫的博客 CSDN博客 jdk8下载安装 下载地址 https www oracle com java technologies javase javase jdk8 downloads html 根据需
  • python 中 os._exit(), sys.exit()

    1 os exit 不抛异常 后面的代码就不执行了 不执行相关清理工作 直接退出 Python 解释器一般来说用在子线程中退出 2 sys exit 引发一个 SystemExit 异常 没有捕获这个异常 会直接退出 捕获这个异常可以做一些

随机推荐

  • 软考:中级软件设计师:程序语言基础:表达式,标准分类,法律法规,程序语言特点,函数传值传址

    软考 中级软件设计师 程序语言基础 表达式 提示 系列被面试官问的问题 我自己当时不会 所以下来自己复盘一下 认真学习和总结 以应对未来更多的可能性 关于互联网大厂的笔试面试 都是需要细心准备的 1 自己的科研经历 科研内容 学习的相关领域
  • 禁止ios浏览器页面上下滚动 (橡皮筋效果)弹性滚动 微信的下拉回弹

    发现之前阻止页面滚动的代码e preventDefault代码失效了 于是自己折腾了一番 找到了解决办法 一 前言 浏览器在移动端有一个默认触摸滚动的效果 让我们感触最深的莫过于微信浏览器里面 下拉时自带橡皮筋的效果 然而在开发的时候我们经
  • 软件测试日常分享

    以下是测试主管 测试经理 质量保证经理的面试问题和答案 供新人和有经验的求职者获得他们梦想的工作 1 测试经理的职责是什么 QA经理的角色包括 从启动到结束管理项目 测试计划 获得客户对交付成果的认可 向客户端批准中间交付物和补丁发布 提交
  • 动手学深度学习——softmax回归(原理解释+代码详解)

    目录 1 softmax回归 1 1 分类问题 1 2 网络架构 1 3 全连接层的参数开销 1 4 softmax运算 1 5 小批量样本的矢量化 1 6 损失函数 1 6 1 对数似然 1 6 2 softmax及其导数 1 6 3 交
  • 算法导论 学习笔记 第七章 快速排序

    快排最坏时间复杂度为 n 但它的平均性能很好 通常是实际排序应用中最好的选择 它的期望时间复杂度为 nlgn 且 nlgn 中隐含的常数因子非常小 且它还能进行原址排序 快排也使用了分治思想 1 分解 数组被划分为两个子数组 使得一个子数组
  • 服务器如何开多个虚拟机,服务器运行多个虚拟机

    服务器运行多个虚拟机 内容精选 换一换 通过内网连接云手机实例时 需要在租户VPC中创建一台弹性云服务器 作为连接云手机的跳板机器 若创建云手机服务器时未使用自定义网络 还需在云手机租户的VPC和服务器所在VPC之间建立对等连接 如图1所示
  • SpringBoot集成Netty时在Handler类中注入service和dao为null

    最近在做一个服务器接收客户端消息 之前一直都只接触web开发 第一次接触服务器开发 接触到Netty 但在Netty的Handler类里注入为null public class HttpRequestHandler extends Simp
  • 【vue3练习 -12】vue3使用readonly(),shallowReadonly()

    作用 把一个响应式 可以是ref定义的 也可以是reactive定义的 的数据变成只读的 不可以修改 使用场景 假如你的组件有个数据 但是你不希望在使用的时候修改他就可以把他变成只读的 用法示例 import readonly shallo
  • SOLO算法解读

    论文 SOLO Segmenting Objects by Locations 论文链接 https arxiv org abs 1912 04488 代码链接 GitHub WXinlong SOLO SOLO and SOLOv2 fo
  • 安全之安全(security²)博客目录导读

    研究方向 安全之安全 研究内容 ARM RISC V安全架构 TF A TEE之安全 GP安全认证 静态代码分析 FUZZ模糊测试 IDA逆向分析 安全与功耗等 欢迎您的关注 一 ARM安全架构 1 ARM安全架构及其发展趋势 转载 2 A
  • uc同步登陆同步退出

    几乎每个应用在整合UC的时候都会遇到无法同步登陆同步退出的情况 今天分析下原因 首先我们的项目会将uc client这个文件夹原封不动的拷贝到项目根目录 public function inteLogin loginname passwor
  • 从零开始学Python(一)基本变量与数据类型

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于Python的相关操作吧 目录 Welcome Huihui s Code World 一 关于Python的基本知识 变量 注释 二 数据类型 1 强类型
  • 蝴蝶效应,青蛙现象,鳄鱼法则,鲇鱼效应,羊群效...

    标题 蝴蝶效应 青蛙现象 鳄鱼法则 鲇鱼效应 羊群效应 刺猬法则 手表定律 破窗理论 二八定律 木桶理论 马太效应 这些你都明白吗 1 蝴蝶效应 上个世纪70年代 美国一个名叫洛伦兹的气象学家在解释空气系统理论时说 亚马逊雨林一只蝴蝶翅膀偶
  • pycharm快捷键及一些常用设置

    Alt Enter 自动添加包 shift O 自动建议代码补全 Ctrl t SVN更新 Ctrl k SVN提交 Ctrl 注释 取消注释 选择的行 Ctrl Shift F 高级查找 Ctrl Enter 补全 Shift Enter
  • 安装ThinkPHP5.1并在框架中使用FFmpeg视频处理工具遇到的问题和解决办法

    一 安装ThinkPHP5 1框架 问题一 安装方法有很多 我这里使用composer安装的 但是遇到了问题 出现了报错 安装方法可是查看 https www kancloud cn manual thinkphp5 1 353948 co
  • FreeRTOS中断管理

    目录 说明 一 中断基础 1 1 中断理解 1 2 中断执行步骤 1 3 中断寄存器选择位 1 4 中断优先级分类 二 中断优先级分组设置 2 1 分类 2 2 特点 三 中断有关寄存器 3 1 SHPR1寄存器 3 2 SHPR2寄存器
  • 【区块链与密码学】第2-3讲:区块链基础技术大剖析之哈希函数

    本课堂内容全部选编自PlatON首席密码学家 武汉大学国家网络安全学院教授 博士生导师何德彪教授的 区块链与密码学 授课讲义 教材及互联网 版权归属其原作者所有 如有侵权请立即与我们联系 我们将及时处理 2 4 1 哈希函数 区块链作为一个
  • gateway集成阿里Sentinel后,控制台如何根据url动态限流

    gateway网关集成Sentinel后 控制台默认限流是根据服务进行的 默认为资源名为ReactiveCompositeDiscoveryClient 服务名称 如下图 所以限流都是根据整个服务进行的 那么如何像单机一样根据url分组限流
  • Git常见问题:Your branch and ‘xxx/xxx‘ have diverged

    报这个错就是因为你和远程库出现分叉了 具体表现是是由于同一个分支有多人修改 多人commit造成的 用户1操作 用户2操作 T1 git co b brv 1 git co b brv 1 T2 git add test2 java git
  • stm32的HAL库函数flash无法写入的问题

    记录一下对flash编程操作时出现的问题以及解决办法 问题 在使用HAL库中的HAL FLASH Program uint32 t TypeProgram uint32 t Address uint64 t Data 函数时发现总是没办法写