stm32晶振配置不一致导致 Invalid Rom Table 至芯片锁死解决方案

2023-11-16

参考博文

Invalid ROM Table原因及解决办法
STM32芯片锁死问题

概述

在调试STM32时,出现如下的现象:软件写好之后首次下载程序至芯片时成功,但程序未能正常运行,之后再下载程序时便报错:Invalid ROM Table
Invalid ROM Table

原因

出现该现象的原因为板子外部晶振为25M,而程序软件上以8M为输入晶振频率,导致芯片超频锁死,无法连接、下载

解决方案

  • 断电,将芯片原来通过10k电阻接地的BOOT0引脚直接接3.3V,硬件上置1
  • 上电,连接目标板,Keil中点选Flash->Erase,清除芯片原有程序
    在这里插入图片描述
  • 断电,将BOOT0重新通过10k电阻接地后正常下载修改后的程序即可。

结论

所有软件上引起的芯片锁死等现象基本均可尝试下这一方法。

/----------------------------------------------------------------------------------------------------------/

另外附上Boot1 Boot0的应用原理

存储器采用固定的存储器映射,代码区域起始地址为 0x0000 0000(通过 ICode/DCode 总 线访问),而数据区域起始地址为 0x2000 0000(通过系统总线访问)。Cortex™-M4F CPU 始终通过 ICode 总线获取复位向量,这意味着只有代码区域(通常为 Flash)可以提供 自举空间。STM32F4xx 微控制器实施一种特殊机制,可以从其它存储器(如内部 SRAM) 进行自举。

在 STM32F4xx 中,可通过 BOOT[1:0] 引脚选择三种不同的自举模式,如表 3 所示。
在这里插入图片描述
复位后,在 SYSCLK 的第四个上升沿锁存 BOOT 引脚的值。
复位后,用户可以通过设置 BOOT1 和 BOOT0 引脚来选择需要的自举模式。

启动模式

STM32 三种启动模式对应的存储介质均是芯片内置的,它们是:

1)主闪存存储器 :

STM32内置的Flash,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。

2)嵌入式SRAM

内置SRAM,既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。假如我只修改了代码中一个小小的地方,然后就需要重新擦除整个Flash,比较的费时,可以考虑从这个模式启动代码(也就是STM32的内存中),用于快速的程序调试,等程序调试完成后,再将程序下载到Flash中。

3)系统存储器

这种模式启动的程序功能是由厂家设置的。一般来说,这种启动方式用的比较少。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader,也就是我们常说的ISP程序,这是一块ROM,出厂后无法修改。一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的BootLoader中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。但是这个下载方式需要以下步骤:
Step1:将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader。
Step2:最后在BootLoader的帮助下,通过串口下载程序到Flash中
Step3:程序下载完成后,又有需要将BOOT0设置为GND,手动复位,这样,STM32才可以从Flash中启动。
可以看到,利用串口下载程序还是比较的麻烦,需要跳帽跳来跳去的,非常的不注重用户体验。

要注意的是,一般不使用内置SRAM 启动(BOOT1=1 BOOT0=1),因为SRAM 掉电后数据就丢失。多数情况下SRAM 只是在调试时使用,也可以做其他一些用途。如做故障的局部诊断,写一段小程序加载到SRAM 中诊断板上的其他电路,或用此方法读写板上的Flash 或EEPROM 等。还可以通过这种方法解除内部Flash 的读写保护,当然解除读写保护的同时Flash 的内容也被自动清除,以防止恶意的软件拷贝。

一般 BOOT1 和BOOT0 跳线都跳到0(地)。只是在ISP 下载的情况下,BOOT0=1,BOOT1=0 ,下载完成后,把 BOOT0 的跳线接回0,也即BOOT0=0,BOOT1=0 。

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

stm32晶振配置不一致导致 Invalid Rom Table 至芯片锁死解决方案 的相关文章

  • 如何修改内核DTB文件

    Summary 我目前正在为定制板编译 Linux 内核 内核 模块和 DTB 以及一些定制驱动程序 有时 我会编译内核并意识到 DTB 文件中的兼容性字符串不是自定义驱动程序正在寻找的内容 现在 我可以解决此问题的唯一方法是修改 DTS
  • 适用于arm(cortex-m3)的位置独立可执行文件(-pie)

    我正在使用codesourcery g lite 基于gcc4 7 2版本 为stm32 Cortex m3 编程 我希望动态加载可执行文件 我知道我有两个选择 1 可重定位的elf 需要一个elf解析器 2 具有全局偏移寄存器的位置无关代
  • 使用 gnueabihf 为 ARMv6 构建

    我尝试为 ARMv6 构建应用程序 但失败了 我猜问题是工具链支持硬浮点 但 ARMv6 不支持 好吧 首先我设置 march armv6 编译失败 opt gcc linaro arm linux gnueabihf 4 8 2014 0
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • ARM Linux 如何模拟 PTE 的脏位、访问位和文件位?

    As per pgtable 2 level h https git kernel org cgit linux kernel git torvalds linux git tree arch arm include asm pgtable
  • 将 GCC 内联汇编与采用立即值的指令结合使用

    问题 我正在为 ARM Cortex M3 处理器开发定制操作系统 为了与我的内核交互 用户线程必须生成 SuperVisor Call SVC 指令 以前称为 SWI 用于软件中断 该指令在ARM ARM中的定义是 这意味着该指令需要即时
  • 读取和打印手臂组件中的字符串

    我正在使用 ARMSim 刚刚开始学习汇编 所以如果我看起来一无所知 请原谅我 但我正在尝试从输入文件中读取字符串 然后将其打印到输出屏幕 到目前为止我有 equ SWI Open 0x66 open a file equ SWI Clos
  • 分析 Cortex-M7 (stm32f7) 上的 memcpy 性能

    简洁版本 从 GNU ARM 工具链中提取的 memcpy 的性能指标在 ARM Cortex M7 上对于不同的副本大小似乎差异很大 即使复制数据的代码始终保持不变 这可能是什么原因造成的 长版 我是使用 GNU Arm 工具链 11 2
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • 了解 ctags 文件格式

    我使用 Exhuberant ctags 来索引我的 c 项目中的所有标签 c project 是 Cortex M7 微控制器的嵌入式软件 结果是一个标签文件 我正在尝试阅读该文件并理解所写的内容 根据我找到的 ctags 和 Exhub
  • 了解 U-Boot 内存占用

    我不明白加载 U Boot 时 RAM 中发生了什么 我正在开发 Xilinx Zynq ZC702 评估套件 并尝试使用 U Boot 在其上加载 Linux 内核 于是我使用Xilinx工具Vivado和SDK生成了一个BOOT bin
  • saber sd 如何在没有 SPL 的情况下直接从 uboot 启动

    sabre sd 基于 imx 6 最大内部 RAM 约为 150Kb 然而 uboot 足够大 可以容纳在这个空间中 在这个场景中事情是如何进行的 https community freescale com docs DOC 95015
  • 直接在 ARM 目标上调试单声道应用程序

    我最近在 BeagleBone 嵌入式 ARM 设备上安装了 Mono 希望通过 USB 连接 Kinnect 传感器并使用 C Mono 控制它 我想知道 Mono 我正在使用 MonoDevelop 但我想这个问题也适用于 VS 是否允
  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • 英特尔的最后分支记录功能是英特尔处理器独有的吗?

    最后分支记录是指存储与最近执行的分支相关的源地址和目标地址的寄存器对 MSR 的集合 它们受英特尔酷睿 2 英特尔至强和英特尔凌动处理器系列的支持 http css csail mit edu 6 858 2012 readings ia3
  • 如何在WinMobile6上启用ARMv6非对齐访问?

    ARMv6 引入了一个很棒的功能 未对齐的内存访问 这使得代码中的某些事情变得更加简单和更快 但微软只在winCE6中提供了API 现在大多数 PDA 都基于 WinMobile6 基于 CE 5 x 默认情况下禁用未对齐访问 我尝试在 C
  • 让 TensorFlow 在 ARM Mac 上使用 GPU

    我已经安装了TensorFlow在 M1 上 ARM Mac 根据这些说明 https github com apple tensorflow macos issues 153 一切正常 然而 模型训练正在进行CPU 如何将培训切换到GPU
  • 上下文切换到安全模式(arm trustzone)的成本是多少

    我试图了解在arm中可信 安全 和非安全模式之间来回切换的成本 从非安全世界转移到安全世界时到底需要发生什么 我知道需要设置 ns 位 基于某些特殊指令 需要刷新和更新页表 刷新和更新处理器缓存 还有什么需要发生的吗 处理器缓存 它们是分段
  • 哪些 GCC 优化标志对二进制大小影响最大?

    我正在使用 GCC 为 ARM 开发 C 我遇到了一个问题 我没有启用优化 我无法创建二进制文件 ELF https en wikipedia org wiki Executable and Linkable Format 对于我的代码 因
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者

随机推荐

  • vscode检查python语法

    安装格式化工具 打开命令行窗口安装以下工具 pip install U flake8 pip install U autopep8 在VScode配置中打开首选项 gt 设置 搜索python linting flake8enabled 安
  • 信息安全工程实践笔记--Day2 暴力破解

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 实验目标 一 弱口令分类 1 系统服务弱口令 2 设备弱口令 3 社工型的弱口令 二 弱口令的攻击方式 暴力破解获取密码的方式 三 bp实操 1 bp模块讲解 1
  • opencv中的cv::ximgproc::SuperpixelSLIC,cv::ximgproc::SuperpixelSEEDS,SuperpixelLSC是超像素算法的

    可以研读下源码 集成到建筑物提取中
  • WorkPlus打造智慧企业移动门户,开启高效办公新时代

    在移动互联网时代 企业对于高效办公和便捷访问的需求不断增长 WorkPlus作为领先的品牌 致力于打造智慧企业移动门户 帮助企业实现高效协作与便捷访问 本文将重点介绍WorkPlus如何通过创新解决方案 为企业提供定制化的智慧移动门户 提升
  • kotlin.text.charsets

    java lang NoClassDefFoundError didn t find class kotlin text charsets Android studio项目中引入了自己下载的两个jar 3 10版本的okhttp和2 0版本
  • jQuery调用接口获取城市天气信息

    jQuery调用接口获取城市天气信息 代码如下
  • idea项目提交git报错bad revision ‘head‘

    报错 bad revision head 新建了一个文件夹 将后端项目 前端项目都放到这个文件夹里面去了 然后想提交git VCS gt import into Version control gt Create git Repositor
  • python中的pip、anaconda换国内源图文解析

    一 python中的pip换源 pip的源换成国内的源 1 首先在C Users 用户 自己的用户名目录下新建一个文件夹pip 2 之后在pip文件夹下新建一个pip txt 里边设置好国内的源 保存后改名为pip ini 文件内的内容如下
  • java中找不到符号是什么意思_JAVA小白入门很难发现的错误

    紧跟着上一篇文章 如何编写JAVA小白第一个程序 首先我们可以来做一下错误示范 这个是我们的Hello java文件 打开命令提示符 编译HelloWorld java 首先这肯定不是环境变量搞错了 可是我文件明明在目录下面 怎么就找不到文
  • Pandas50个高级高频操作

    01 复杂查询 实际业务需求往往需要按照一定的条件甚至复杂的组合条件来查询数据 接下来为大家介绍如何发挥Pandas数据筛选的无限可能 随心所欲地取用数据 1 逻辑运算 Q1成绩大于36df Q1 gt 36 Q1成绩不小于60分 并且是C
  • 构造函数&类属性和实例属性&析构函数

    1 构造函数 概念 构造函数包括 new 和 init 构造函数 也被称为构造器 指的是当创建对象的时候 被自动调用的函数 注意 在Python中 以 xxx 方式命名的函数被称为魔术函数 魔术方法 这类函数在使用的时候无需手动调用 在进行
  • 海得服务器虚拟机,海得PLC远程编程调试流程

    原标题 海得PLC远程编程调试流程 海得PLC远程编程调试流程 1 HINET智能网关LAN口默认IP地址是192 168 1 1 工业智能网关 2 假定PLC的IP地址是192 168 10 2 并且要求不能改变 海得plc 3 将HIN
  • 消息队列:Ubuntu16.04安装和Web页面管理RabbitMQ(楼主亲测、真实有效)

    RabbitMQ 总来来说 RabbitMQ的安装还是有一些难度的 不同的方式 安装的方法也是完全不一样 还要解决蛮多依赖 加上现在有些网站 极其不负责 很多博文都没有经过测试检验就直接发出来的 楼主来亲测一下 希望能对大家有好的帮助 一
  • C++ templates之“模板的模板参数”

    定义 指一个模板 它本身的参数类型就是模板 在英语原文中是 template template parameter 例如 template
  • hdu 5792 World is Exploding 2016 Multi-University 5

    Problem acm hdu edu cn showproblem php pid 5792 题意 给一个序列 V 问有多少个由下标组成的四元组 a b c d 满足 a b c d a lt b c lt d Va lt Vb Vc g
  • 在centos7安装anaconda步骤,亲测。

    在centos7上安装anaconda碰到很多的坑 分享出来 也免得以后自己忘记 第一步 首先anaconda官网下载linux安装包 网址为 https www anaconda com 或者在清华镜像下载 https mirrors t
  • konisGraph学习。复杂查询优化记录

    最近有需求是查两个公司之间的投资关系 比如 a和b之间有哪些直接投资和间接投资 例如 a gt b a gt e gt b a gt c gt d gt b b gt f gt a 需求是查出7跳以内的ab之间的投资关系 v的标签是comp
  • inline内联函数的作用和几点注意

    一 关键字inline必须与函数定义体放在一起才能使函数成为内联 仅将inline放在函数声明前面不起任何作用 二 定义在类声明之中的成员函数将自动地成为内联函数 以上可参考 http blog 163 com jinyongming bl
  • 矩阵求导 两种布局 及常用基础公式

    一 矩阵求导的两种形式 刚开始看矩阵求导这一块的时候发现一模一样的两个公式 在不同地方结果老是不一样 给我看懵了好一阵子 后来才发现原来有两种布局模式 都是可以的 矩阵求导的布局方式有两种 分子布局和分母布局 下面以 小写字母 小写粗体字母
  • stm32晶振配置不一致导致 Invalid Rom Table 至芯片锁死解决方案

    参考博文 Invalid ROM Table原因及解决办法 STM32芯片锁死问题 概述 在调试STM32时 出现如下的现象 软件写好之后首次下载程序至芯片时成功 但程序未能正常运行 之后再下载程序时便报错 Invalid ROM Tabl