0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Boot引脚引发的血案

GReq_mcu168 来源:玩转单片机 作者:玩转单片机 2021-01-20 16:52 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

血案现场描述:

程序下载到程序之后,没有正常运行。

怀疑下载过程或者程序出现问题,但是同样的工具,同样的程序,下载到另一块单片机没有任何问题。

那么问题出在哪?

方法尝试:

遇到诡异的问题时,鱼鹰都是建议直接在线调试。

因为下载过程是正常的,说明调试器可以正常连接单片机,同时单片机也可以正常工作,否则调试器无法连接单片机并下载。

(通过以下界面,可以查看调试器是否已连接,包含调试器的产品序列号,固件版本等,右边窗口表示连接的单片机芯片 ID 信息,目前这个界面因为没有调试器,没有相关信息)

ee051c72-59c3-11eb-8b86-12bb97331649.png

因为调试器可以正常连接芯片,那么进入在线调试模式就是顺理成章的事情了。

当你在线调试时,你会发现如下窗口:

ee41800e-59c3-11eb-8b86-12bb97331649.png

(该图是一个群友的截图,放在这里方便描述)

通过上一篇笔记《编译优化:这些锅俺不背!》我们可以知道,这个工程下载的工程应该是正确的,MDK 也可以正常设置断点位置。

但奇怪的是,程序竟然没有停在断点处。这是个很诡异的问题。

同时这个现象也解释了为什么程序工作不正常,既然程序没有运行到 main 函数,那么肯定无法正常工作。

有经验的工程师应该都知道,main 函数并不是单片机运行的第一条指令,所以我们就会怀疑是否是中断向量表有问题(第一条指令地址存放在中断向量处)。

但是根据前面所说,这个程序下载到别的单片机是正常运行的,所以可以排除这个原因。

那么这个问题到底是怎么回事?

我们其实可以从调试截图中得到另一个信息,单片机在 0x1FFFxxxx 地址处运行(正常应该在 0x0800xxxx)!!!

eeacfb9a-59c3-11eb-8b86-12bb97331649.png

并且当你单步运行时,你会发现汇编指令是可以执行的。同时我们可以看到汇编指令是正常的,并不都是 0 或者 0xff,这些数据能够被解析器正确解析成汇编指令。

这就说明一个问题,单片机确实在运行指令,只不过,我们无法通过 MDK 看到源码,也无法进行源码级别的调试。

分析到这里,有经验的道友应该有点方向了。

在单片机中,还有什么代码是可以被执行,我们用户又没有源码的?

没错,就是芯片生产时固化在单片机内部的 ISP 程序。

很多时候,当我们没有合适的调试器更新程序时,我们会选择使用串口下载程序。

并且我们很清楚如何通过设置 boot0 引脚来完成升级,我们也很清楚单片机中有一段代码专门干这事,而每一本芯片参考手册里也都写了如何使用串口升级。

ef223540-59c3-11eb-8b86-12bb97331649.png

但是我们却不知道这段程序到底位于哪里?我们无法亲眼看到这段程序执行并把我们的程序下载到单片机中。

所以当我们看到问题截图时,我们无法第一时间明白:单片机正在执行串口升级程序。

ef80e9be-59c3-11eb-8b86-12bb97331649.png

(事实上,我们可以从参考手册看到系统存储地址的空间)

到此,我们应该知道单片机为什么不能正常工作了,因为它跑错地方了!

那为啥会运行到系统存储器去了呢?

肯定和开机时 boot 引脚电平有关。

问题解决:

既然定位到 boot 引脚电平可能有问题,那么就可以通过检查 boot 情况来确定问题。

最终那位群友说是因为贴片时贴错了位置,导致应该设置为低电平却设置成高电平导致。

确实,这个群友经过我的提醒定位到问题了,但是现场情况可能比那位群友的要糟糕。

比如,鱼鹰在第一次遇到这个问题时,也是出现了同样的现象,但是那时的单片机 boot0 使用万用表检测的电压确实是低电平,但它还是到系统存储区执行了(那时并不知道这是 ISP 程序,只知道执行位置错了,当问题解决了,鱼鹰才晓得这段代码是干啥的)。

一般人遇到这种问题,可能就不知所措,开始继续怀疑是不是自己软件的问题了。但鱼鹰不同,摸爬滚打多年,经验丰富(自夸,哈哈),坚信自己的判断:一定是 boot 0 引脚问题。

所以,鱼鹰拿来示波器(为什么要使用示波器?我们要知道,万用表只能检测出平均的电压,瞬间的电平变化,万用表是无法发现的),从上电开始观察。

因为问题复现率很高,鱼鹰很快通过示波器的单次触发功能发现了在上电那一刻,boot0 引脚会突然出现一个高电平,如果此时刚好是单片机采样 boot0 的时刻,那么单片机进入串口下载程序也就不奇怪了。

到此,身为软件工程师的责任结束了,我们已经定位到有异常电平导致单片机工作不正常,此时就要由硬件工程师上场分析为什么会出现这个异常电平了。

至于异常电平是如何产生的,又是如何解决的,就不是我们软件工程师要了解的了,毕竟我们不是专业的。

总结:

以上问题,在第一次遇到时,鱼鹰确实一脸懵逼,但使用在线调试这个大杀器,再结合扎实的基础,解决起来也不是那么困难。但是对于其他人而言,可能就是一件毫无头绪的事情,可能尝试各种方法还是一无所获,毕竟其他硬件都没有问题,只是 boot 引脚电平问题,而我们平时一般不会关注它。

正因为如此,每次遇到这种截图,鱼鹰都是让他们检查boot引脚再说。

而今天鱼鹰记录这个问题,就是希望让更多人可以知道这个事(求转发),从而更快的定位问题。

责任编辑:lq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 引脚
    +关注

    关注

    16

    文章

    2119

    浏览量

    56008
  • 调试器
    +关注

    关注

    1

    文章

    329

    浏览量

    25202
  • Boot
    +关注

    关注

    0

    文章

    154

    浏览量

    37911

原文标题:Boot 引脚引发的血案

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    更新 U-boot 时出现的问题求解

    我在尝试更新 U-boot 时遇到问题。最初我无法启动 Fedora,但后来我读到了这并尝试更新 U-boot。但是,当我按照官方文档我卡在迷你机屏幕上,什么也做不了。我担心董事会来了 DOA......
    发表于 04-01 07:20

    深入解析U-Boot image.c:RK平台镜像处理核心逻辑

    在瑞芯微(RK)平台的嵌入式开发中,U-Boot作为核心的启动加载程序,负责完成镜像解析、校验、加载等关键流程。而image.c正是U-Boot中处理镜像(uImage)的核心文件,尤其针对RK平台
    的头像 发表于 02-24 16:46 1785次阅读
    深入解析U-<b class='flag-5'>Boot</b> image.c:RK平台镜像处理核心逻辑

    深入解析U-Boot命令处理核心文件:功能、调试与开发价值

    在嵌入式系统开发中,U-Boot 作为主流的引导加载程序,其命令处理、交互逻辑和自动启动流程是核心功能模块。本文将围绕command.c、cli.c和autoboot.c三个关键文件,从核心
    的头像 发表于 02-03 15:44 989次阅读
    深入解析U-<b class='flag-5'>Boot</b>命令处理核心文件:功能、调试与开发价值

    解析Rockchip平台U-Boot核心文件:boot_rkimg.c到底做了什么?

    在嵌入式开发中,U-Boot 作为引导程序的 “中流砥柱”,负责初始化硬件、加载内核并启动系统。对于 Rockchip 平台的设备(如常见的开发板、智能终端),boot_rkimg.c 是 U-Boot 中专门处理启动流程的核心
    的头像 发表于 02-03 15:29 947次阅读
    解析Rockchip平台U-<b class='flag-5'>Boot</b>核心文件:<b class='flag-5'>boot</b>_rkimg.c到底做了什么?

    选错PCB基材引发血案

    PCB电路板主要由 覆铜箔层压板 (Copper Clad Laminates,CCL)、 半固化片 (PP片)、 铜箔 (Copper Foil)、 阻焊层 (又称阻焊膜)(Solder Mask)、 表面处理 、 字符 组成。 PCB电路板的主要材料是覆铜板, 而覆铜板(敷铜板)是由铜箔(成本占比30%-40%)、玻璃布(基板,成本占比20%-25%)、树脂(粘合剂,成本占比25%-30%)和填料构成的。基板是由高分子合成树脂和增强材料组成的绝缘层板;在基板的表面覆盖着一层导电率较高、焊接性良好的纯铜箔,常用厚
    的头像 发表于 01-29 09:06 983次阅读
    选错PCB基材<b class='flag-5'>引发</b>的<b class='flag-5'>血案</b>

    CW32F003 有没有BOOT引脚

    CW32F003 有没有BOOT引脚,是不是和STM32F0 不一样
    发表于 12-26 06:39

    深入理解 RK3506 U-Boot 重定位:从代码到原理

    在嵌入式系统中,U-Boot 作为引导加载程序,其启动流程的核心环节之一就是 重定位(Relocation) 。对于 RK3506 这类基于 ARM Cortex-A 架构的芯片,重定位的本质是将
    的头像 发表于 11-28 07:05 968次阅读
    深入理解 RK3506 U-<b class='flag-5'>Boot</b> 重定位:从代码到原理

    将JTAG引脚用作普通IO

    ,GPIO_InitStruct); } 完全禁用SWD后,将无法通过调试器更新程序 建议保留SWD功能(AFIO_MAPR_SWJ_CFG_JTAGDISABLE) 若必须禁用所有调试接口,需保留BOOT0引脚用于ISP编程
    发表于 11-13 06:39

    在CW32F020K6U7硬件设计中,若未连接 VDDA,仅使用 VDD供电,会引发哪些问题?

    在CW32F020K6U7硬件设计中,若未连接 VDDA,仅使用 VDD供电,可能引发哪些问题?
    发表于 11-12 07:21

    fn_u-boot-spl.bin和u-boot-spl.bin区别是什么?请问如何从u-boot-spl.bin生成fn_u-boot-spl.bin?

    fn_u-boot-spl.bin = bootrom头 + u-boot-spl.bin ;生成过程见后面代码片段; bootrom头(格式详见) + u-boot-spl.bin(标准的一级
    发表于 07-11 07:58

    STM32H747的BOOT1是哪个管脚?

    STM32H747 datasheet里面没有BOOT1,只有BOOT0。请问boot1是哪个管脚?还是就是没有,没有的话 BOOT0 上下拉分别什么启动配置?
    发表于 07-11 07:44

    emmc烧录完成后,将BOOT引脚切换到emmc模式,识别不到设备,怎么解决?

    软硬件版本信息 错误日志 U-Boot SPL 2022.10-00008-gd20cb609 (Feb 13 2025 - 20:49:08 -0500) ddr 1866 00000000
    发表于 06-24 08:26

    CYPD3120如何使用MUXB正确读取引脚电压电平?

    立即引发应用程序事件 APP_EVT_RP_CHANGE 和 APP_EVT_VBUS_OVP_FAULT。 我认为这是因为端口使用 AMUXA 来感应 VBUS。 如何使用 MUXB 正确读取引脚电压电平?
    发表于 05-26 08:29

    飞凌嵌入式ElfBoard ELF 1板卡-uboot编译u-boot/u-boot.bin/u-boot.imx

    u-boot文件就是编译流程章节讲的,链接器将链接各.o文件之后生成的.elf文件,该文件中包含了大量的调试信息、地址信息和注释信息,不能被直接执行,需要转换成为可执行的u-boot.bin文件,而
    发表于 05-22 11:24