Boot 引脚引发的血案
血案现场描述:
程序下载到程序之后,没有正常运行。
怀疑下载过程或者程序出现问题,但是同样的工具,同样的程序,下载到另一块单片机没有任何问题。
那么问题出在哪?
尝试方法:
遇到诡异的问题时,鱼鹰都是建议直接在线调试。
因为下载过程是正常的,说明调试器可以正常连接单片机,同时单片机也可以正常工作,否则调试器无法连接单片机并下载。
(通过以下界面,可以查看调试器是否已连接,包含调试器的产品序列号,固件版本等,右边窗口表示连接的单片机芯片 ID 信息,目前这个界面因为没有调试器,没有相关信息)
因为调试器可以正常连接芯片,那么进入在线调试模式就是顺理成章的事情了。
当你在线调试时,你会发现如下窗口:
(该图是一个群友的截图,放在这里方便描述)
通过上一篇笔记《编译优化:这些锅我不背!》我们可以知道,这个工程下载的工程应该是正确的,MDK 也可以正常设置断点位置。
但奇怪的是,程序竟然没有停在断点处。这是个很诡异的问题。
同时这个现象也解释了为什么程序工作不正常,既然程序没有运行到 main 函数,那么肯定无法正常工作。
有经验的工程师应该都知道,main 函数并不是单片机运行的第一条指令,所以我们就会怀疑是否是中断向量表有问题(第一条指令地址存放在中断向量处)。
但是根据前面所说,这个程序下载到别的单片机是正常运行的,所以可以排除这个原因。
那么这个问题到底是怎么回事?
我们其实可以从调试截图中得到另一个信息,单片机在 0x1FFFxxxx 地址处运行(正常应该在 0x0800xxxx)!!!
并且当你单步运行时,你会发现汇编指令是可以执行的。同时我们可以看到汇编指令是正常的,并不都是 0 或者 0xff,这些数据能够被解析器正确解析成汇编指令。
这就说明一个问题,单片机确实在运行指令,只不过,我们无法通过 MDK 看到源码,也无法进行源码级别的调试。
分析到这里,有经验的道友应该有点方向了。
在单片机中,还有什么代码是可以被执行,我们用户又没有源码的?
没错,就是芯片生产时固化在单片机内部的 ISP 程序。
很多时候,当我们没有合适的调试器更新程序时,我们会选择使用串口下载程序。
并且我们也很清楚如何通过设置 boot0 引脚来完成升级,我们也很清楚单片机中有一段代码专门干这事,而每一本芯片参考手册里也都写了如何使用串口升级。
但是我们却不知道这段程序到底位于哪里?我们无法亲眼看到这段程序执行并把我们的程序下载到单片机中。
所以当我们看到问题截图时,我们无法第一时间明白:
单片机正在执行串口升级程序 。(事实上,我们可以从参考手册看到系统存储地址的空间)
到此,我们应该知道单片机为什么不能正常工作了,因为它跑错地方了!
那为啥会运行到系统存储器去了呢?
肯定和开机时 boot 引脚电平有关。
问题解决:
既然定位到 boot 引脚电平可能有问题,那么就可以通过检查 boot 情况来确定问题。
最终那位群友说是因为贴片时贴错了位置,导致应该设置为低电平却设置成高电平导致。
确实,这个群友经过我的提醒定位到问题了,但是现场情况可能比那位群友的要糟糕。
比如,鱼鹰在第一次遇到这个问题时,也是出现了同样的现象,但是那时的单片机 boot0 使用
万用表检测的电压确实是低电平 ,但它还是到系统存储区执行了(那时并不知道这是 ISP 程序,只知道执行位置错了,当问题解决了,鱼鹰才晓得这段代码是干啥的)。一般人遇到这种问题,可能就不知所措,开始继续怀疑是不是自己软件的问题了。但鱼鹰不同,摸爬滚打多年,经验丰富(自夸,哈哈),坚信自己的判断:一定是 boot 0 引脚问题。
所以,鱼鹰拿来示波器(为什么要使用示波器?我们要知道,万用表只能检测出平均的电压,瞬间的电平变化,万用表是无法发现的) ,从上电开始观察。
因为问题复现率很高,鱼鹰很快通过示波器的单次触发 功能发现了在上电那一刻,boot0 引脚会突然出现一个高电平,如果此时刚好是单片机采样 boot0 的时刻,那么单片机进入串口下载程序也就不奇怪了。
到此,身为软件工程师的责任结束了,我们已经定位到有异常电平导致单片机工作不正常,此时就要由硬件工程师上场分析为什么会出现这个异常电平了。
至于异常电平是如何产生的,又是如何解决的,就不是我们软件工程师要了解的了,毕竟我们不是专业的。
以上问题,在第一次遇到时,鱼鹰确实一脸懵逼,但使用在线调试这个大杀器,再结合扎实的基础,解决起来也不是那么困难。但是对于其他人而言,可能就是一件毫无头绪的事情,可能尝试各种方法还是一无所获。正因为如此,每次遇到这种截图,鱼鹰都是让他们检查boot引脚再说。
而今天鱼鹰记录这个问题,就是希望让更多人可以知道这个事(求转发),从而更快的定位问题。
希望今天这篇笔记对你有所启发,咱们下期再见!
程序如何下载到单片机中?单片机常用的四种烧写程序方式介绍
单片机是一种可编程控制器,搭好硬件电路后,可以利用程序实现很多非常复杂的逻辑功能,与纯硬件电路相比,简化了硬件外围的设计、方便了逻辑的设计、丰富了逻辑的输出。不同厂家的单片机需要不同编程IDE来实现编程。在学习单片机之前,要先清楚单片机程序是如何烧写到单片机内部的,在烧写的过程中需要用到什么工具?因为不通用的烧写工具可能价格较贵,比如说Micorchip单片机使用的ICD系列编程器,单台价格在600-1000元人民币之间。今天和大学来认识一下单片机最常用的四种烧写方式和所使用到的工具。
1.使用JTAG接口实现
JTAG接口是一种标准的测试协议,可以实现编程时在线调试,利用单步追踪可以很方便的查找代码的Bug,大多数的单片机都支持这种接口。这种接口除了电源线和复位引脚之外,还要用到单片机的四个引脚,分别是:TDI、TMS、TCK、TDO,他们所代表的含义如下所示:
TDI--数据输入 ,所有写入寄存器的数据都是通过TDI接口串行输入的;TMS--模式选择 ,Jlink输出给目标CPU的时钟信号;TCK--时钟信号 ,所有数据的输入输出都是以该时钟信号为基准的;TDO--数据输出 ,所有从寄存器读出的数据都是通过TDO接口串行输出的;以上这四个引脚都是协议里强制要求的,而且协议建议在设计电路时要选用上拉电阻。JTAG接口有多种形式,常用的20引脚、14引脚和10引脚。以20引脚JTAG为例,所设计的JTAG烧写电路如下图所示:
JTAG接口
上图中JTAG接口都通过电阻上拉了,有的单片机的这几个引脚在内部已经上拉,所以这几个上拉电阻可以省略,减少了成本和PCB空间的占用。
JTAG接口烧录方式常用的工具为J-Link,实物图如下图所示。
Jlink实物图
相信大家都见过或者听过这个烧写工具,这个工具很通用,但是大家在使用的时候一定要注意版权信息,因为这个工具是有版权的,前两年因为版权风波,网购平台还集中整治过一次。
2.SWD接口烧录方式
SWD是一种串行调试接口,与JTAG相比,SWD只需要两根线,分别为:SWCLK和SWDIO。他们的含义如下:
SWDIO --串行数据线,用于数据的读出和写入;SWDCLK --串行时钟线,提供所需要的时钟信号;一般来说,大多数单片机的JTAG接口和SWDIO接口是复用的,SWD也是用J-Link工具来实现的。所以在使用的时候,只需要在软件界面做一下选择,使用SWD方式还是JTAG方式,硬件上无需改动。除了J-Link外,意法半导体的ST-Link也是支持SWD模式的。
SWD接口
SWD的接口如上图所示,可以看出,SWD和JTAG是相互复用的,由于SWD只需要两根线所以大大减少了对单片机GPIO口的占用,SWD方式也是可以在线调试的。
3.ISP烧写方式,用UART实现
使用过国产51单片机的朋友都清楚这种烧写方式,这种烧写方式是通过单片机的UART串口来实现的,所需要的工具也比较简单-USB/TTL。这个USB/TTL的芯片可以通过MAX232、CH340G等芯片来实现,通过MAX232实现的UART烧写电路如下所示:
UART串口烧写电路
在与单片机连接的时候,一定要注意交叉连接,所谓交叉连接即,单片机的TXD接串口RXD,单片机的RXD接串口TXD,否则数据通信失败。51单片机在使用该方式下载时需要断一下点再上电才能下载。
STM32单片机可以使用UART来实现程序下载,但是需要选择BOOT的模式,现在通过CH340G芯片可以实现自动ISP的下载方式,即不需要手动设置BOOT模式。
4.SWIM单总线下载方式
这种下载方式是针对STM8系列的单片机,这种方式只需要一根线即可实现程序的下载,所使用的工具为ST-Link,如下图所示:
ST-Link
以上为几种常见的烧写方式以及所使用的工具,欢迎大家留言评论,如果转载请注明作者信息和头条出处,感谢支持。
相关问答
单片机boot 引脚功能?单片机的boot引脚是用于引导启动芯片的引脚,通常在启动时用来加载程序或者固件。当boot引脚被拉低时,单片机会从外部设备如Flash存储器中加载程序或者固件。...
C语言中,怎么定义 单片机的 寄存器-ZOL问答例如52单片机的寄存器有4组,分别为00H-07H,08H-0FH,10H-17H,18H-1FH,各组均8字...是采用_Boot来定义某一位。用C语言举例子如下:typedefstru...
为何 单片机的 程序要烧进去,而计算机的程序不用烧进去-ZOL问答所有程序都在计算机上编写编译好,单片机并不再计算机上。所以要烧写。而计算机有操作系统,所有的应用程序都是运行在这个操作系统上的。操作系统首...
关于bios设置中的 Boot priority order問題-ZOL问答总而言之,启动顺序就像银行拿号排队一样,虽然你可能取了第二个号(secondboot)...USBLS120这是单片机USB设备~一般用不上,太高级了,呵呵~IDEHDD是IED接口的.....
BIOS里头显示的EC是什么东西?-ZOL问答EC(EmbedController,嵌入式控制器)是一个16位单片机,它内部本身也有一定容量的Flash来存储EC的代码。EC在系统中的地位绝不次于南北桥,在系统开启的过程中,EC...
晶圆bsl是什么意思?BSL(Bootstraploader)是MSP430FLASH系列单片机独有的一项功能。在程序空间、RAM之外有1K左右的引导区,用来存放430的BOOTROM文件(这是一个引导ROM,类似网....
软件是怎么编写的?要怎么学?我一毕业在导师的推荐下去了一家做芯片的公司,做了九个月发现实在不喜欢,转了JAVA开发,做了几年,工资比当时涨了六倍不止,也算是真正的喜欢软件编程!首先...如...
iar avr V5.XX full怎么破解选自AVR研讨会演讲提纲!双龙老耿(1)为什么选用AVR单片机?Flash程序存储器可擦写1000次以上,不再有报废品产生。PIC有的是OTP,只能烧录一次。A...
如何解决I2C器件死锁的问题?正常情况下,I2C总线协议能够保证总线正常的读写操作。但是在某些异常情况下会导致I2C总线锁死。例如主控制器突然复位、或者I2C总线上存在干扰、或者电源异常...
有用过Zilog的Z8系统 单片机的 吗,肿么烧录程序-ZOL问答2种方法:串口ISP下载,有专门的下载工具,用串口1直接就可以下载,boot0要接地。还有就是用JINK下载,也很方便,还能在线仿真。STM32功能很强大,性价比不错,祝你好...