本帖最后由 jf_1137202360 于 2023-4-13 15:48 编辑
参见链接
前言
不久前由于某个测试需要,申请了正点原子STM32精英V2开发板,该开发板是V1的迭代版本,已经很多年了,而且久居电商销售头部,也是很多小伙伴的第一块学习板。 理论上板子应该是比较稳定的了,可是很遗憾,一上电就发现了致命BUG,这多少有点扣了印象分了,哪怕是用一段时间才发现也好理解点,一上来就BUG确实是有点只能说BUG体制吧。 下面就分析下过程吧! 当然后面有点有感而发,本来不想发,但是还是共勉吧。
过程 拿到板子后接上JTAG, 使用MDK配置好环境,点击下载进入仿真环境,不对劲! 仿真进入了ISP(0x1FFFFxxx)的地址,反复测试偶尔还能正常进入0x08000000的正确地址,但是大部分时候是进入ISP的。
对STM32还是比较熟悉的,这一看就是启动模式不对,进入了系统memory,芯片内部的bootrom中去了。
赶紧检查下BOOT的短路帽,是接的GND端的没问题, 然后怀疑是不是短路帽接触不好,是不是没有有效短接,用万用表测试了B0对应的插针,确实是0,这就奇怪了。 赶紧拿来原理图看一下
刚才测试的是R10的右端,这个说明不了就是BOOT0的引脚电平, 看下原理图R10的左端才是直接连接到芯片的BOOT0引脚的,所以要确认该点的电平,
万用表一测,确实电压不对,是2.981V。 那问题就确认了,2.981 芯片会认为是高,BOOT1是正常的,所以短路帽B0和B1 接GND时,实际芯片的BOOT0和BOOT1引脚是10,所以进的芯片内部代码区域.
好了问题定位了那就要查找为什么BOOT0的电平不对了?
没有什么玄学也没有什么奇怪的,那就只有可能BOOT0这条链路还有其他东西。 当然刚开始可能还会怀疑焊接问题,比如锡渣短路,或者怀疑PCB问题比如断路,初步看了没啥异样基本都可以排除。
所以继续看原理图, 果然BOOT0还到了一个地方
这里做了串口ISP下载的处理电路,通过RTS和DTR去控制RESET和拉高BOOT0进入ISP。 好的,那就基本怀疑问题和它有关了。
再结合上面的那一部分原理图,我们看到芯片BOOT0引脚的电平,并不是短路帽处(R10右边)的电平,而是R10左边的电平,也就是短路帽短接(3和5短接),R10左端还是有电平,其值 受Q3是否导通的影响,(考虑BOOT0默认为输入高阻态)
Q3导通时,则电平理论上应该是3.3V*10/11V=3V,实际上3.3V只有3.28V左右,还有Q3导通也有一些压降,所以分压要比3V小一点,和实测的2.981V刚好对应。 而如果Q3不导通那么没问题,BOOT0的电平就是R10左右两端电平都一样都是0, 上述是假设BOOT0是输入高组态的情况,实际上BOOT0是有上拉内阻的,所以不可能是无限大,所以要看下手册BOOT0的上拉内阻是多少还要和R10分压,不管怎么样确认下BOOT0的属性,是上下拉还是高阻,输入电阻是多大这个是有必要的,因为R10的10K不是随便选的,是要考虑分压后满足BOOT0的高低电平要求的,作为设计人员一切了然于胸是基本要求。
好的再继续往后分析一下,那么什么时候Q3会导通呢? R42右边RTS#输出低时就会导通,而RTS# 什么时候输出低呢,默认应该是不接USB就会输出低,还有就是RTS受上位机控制,具体细节需要参考CH340C的手册,这里就不再赘述了。 也就是Q3是在不同情况是会导通的,这时上述原理图就有问题,此时JTAG就不能正常仿真了,所以现象也是有时是正常有时不正常。
至此问题分析清楚了,怎么修改呢? 实际上我们要遵循等价替换原则,原来只有跳线帽短接1,3或者3,5来控制BOOT0的电平,串接R10是为了限流保护等原因。 那么新增的左侧的串口自动控制的电路,理论上应该也是和右边跳线帽一样的等价关系,也是控制R10的右边,而现在是控制的R10的左边,导致分压后电平不对了,这是根本原因,所以修改方法是BOOT0处的点应该是放在R10的右边。 还有一种修改方法是减少R10的值,使得1K和R10分压能识别为低,由于现在不好改BOOT0点的位置,所以暂时只能以该方式修改了,但是原理图改版的话肯定是使用前者,这原理上才是恰当的。
总结
实际上以上问题已经扣掉不少印象分了,但是毕竟原子也是个人从社区分享,开发学习板做起的,不能要求太高。可能离企业,工业化标准还有一些差距,但是毕竟现在也是开了公司,公司化运作了,所以还是要转变思维,从做学习板能用就行,到做产品,好用稳定才行的转变。
上述过程分析不难,对于熟悉STM32尤其是熟悉STM32的BOOT的话,是比较容易发现的,如果不熟悉的话有可能要分析一段时间了。
以上不是重点,重点是为什么这么严重的设计问题居然过了这么久还没发现,并且经过了V1和V2版本迭代,卖了几万套了,都估计有好多年了?
是没有人发现这个问题吗?答案是否定的,实际上论坛都有大量的用户反馈了,可惜官方忽略了。
实际上有以下值的总结的地方,算是有感而发吧
1. 为什么这个问题一直没有发现? 实际上是有人发现的,只是官方不重视,去官方论坛去搜索,就发现了四五条同样问题的帖子,而官方的回答都是,”是不是BOOT0接的3V3了”,而发帖者反馈接的确实是GND后,官方就没有回复了,不了了之。或者官方的答复就是,”我们自己测试没问题”,然后就没有然后了。这些官方回答是让我最感觉到遗憾的,如果是我们的公司出现这种情况或者我的下属这样回复客户反馈的问题,那么可能需要严重反思了。既然都建立了论坛,并且用户反馈了,官方却不重视,这就白白浪费掉了这么好的反馈信息,说实话用户反馈产品的使用信息,这是很难得的,我们往往想要去搜集都很费劲,而现在有人反馈了官方居然忽略,而是站在“我们测试没问题”的这种思想上? 确实让人感觉到遗憾。这一点,现在成为了一个公司转变为做产品如果不改变的化,产品就很难做好。 总结两句: 忽略了用户的产品迭代算不上迭代。 对于提出的问题应该站在有问题的角度去分析,而不是站在没有问题的角度去分析。
2. 为什么官方测试不出来? 实际上这个问题应该很容易测试出来的,我拿到板子一用就发现了,那么只有可能官方出厂测试很简单,没有遍历各种情况,或者说是偶发问题直接就pass掉了,我怀疑可能是后者,毕竟这个也是有可能是正常的。对于做产品,测试是重要的一环,就提到此,官方需要去思考了。
3. 设计上为什么会出现这个问题? 实际上这里有两个关键点,一是其实官方应该没有仔细去考虑设计原理,原理图应该是参考STM32官方的,因为STM32官方就是串联了10K电阻,那么设计人员有没有去问为什么是10K呢,为什么不是1K呢? 这一点值得所有设计人员思考,尤其现在很多都是参考官方原型设计,很多设计人员都是copy,并没有去考虑根本原理,这也是国内设计人员的一大现状,很是遗憾。 对于一上来就不管三七二十一放10K,1uF的人员本人是很是反感的,尤其是当追问他为什么放这么多,得到的回复是“官方就是这样的,之前的设计就是这样的,别人就是这样的,网上就是这样的,别人用都没问题,之前都没问题”,个人会非常反感。 所以为什么不去考虑为什么官方是10k呢,别人放10k,你放10K就一定行吗? 以前没问题就代表没问题吗? 别人用没问题在你的设计中也没问题吗? 你加了串口的处理电路为什么不去反思下是否有影响呢?
还有就是设计的等价原则没有考虑,原来跳线帽控制的是R10右端,现在串口控制的是R10的左端,所以原理上就说不通,所以设计一定要考虑等价关系,既然都是控BOOT0电平,所以不管是跳线帽还是串口控制,理论上都应该是控制同样的点,所以一些设计原则国内很少有人去总结分析,为什么国外很多企业会分享很多什么设计原则,设计策略等等,为什么我们国内很少有人去做这些事,一方面和环境氛围有关,一方面也和个人有关,作为个人,技术的积累实际就是这些总结的积累。有这些经验总结了说实话一看就知道有问题。一个公司的技术积累也是类似的,在于标准,在于文档,在于规范,而不在于人,人可以走前者不会。
以上一点有感而发,原子的分享精神,比如开放了很多视频,文档,还是值得点赞的,开发了很多学习板,也为嵌入式开发做出了一些贡献,尤其是对很多小白入门来说都是不错的资源和选择,个人还是比较欣赏的。 不过现在已经创立了公司,已经开始做产品了,就不只能停留在学习板的这个阶段了,如何转化为做产品的思维还有很长的路需要走,当然自己从事技术开发超过10年,软件,硬件;电力,汽车;航天等行业都呆过,确实对国内的技术氛围技术现状有些表示遗憾,但是没办法只能提醒自己尽量做到最好,也对自己带的人提出了同样的要求,自己也共勉吧。
|