我是蓝色药丸面包板的忠实粉丝。 它们在价格/性能方面非常好。 实际上,
愚人节的一篇文章中关于演奏balalaika的踏板固件引起了我对它们的热爱。

用这种板子打开包装盒,然后迅速采取措施解决某些问题-按事物的顺序。 没错,最近我拿起了下一块板,用经过充分调试和测试的“固件”对其进行了刷新,并且……得到了一个身份不明的USB设备。 我拿了另一块板,“刷新”它,设备在那里工作。 事情将结束,但我想知道这是什么。 因此,随着周末的到来,我开始详细研究为什么它不起作用。
通常,在“闪烁”电路板之前,我要确保制造商进行的测试有效:LED闪烁。 因此,我确定处理器总体上还可以运行。 那要怪什么呢? 也许是USB线或石英。
线路还可以,石英没有启动。 但这可能由于许多原因而没有开始。 它的启动是通过编程完成的,已经在
main()函数的肠子中了,很好,我们开始调试程序。
一切都会好起来,但是调试器不会转到
main()函数。 该程序挂在启动和此功能之间的某个位置。

我们停止程序:非常期望,我们在
HardFault处理程序中。


是什么把我们带到这里的? 重置地址计数器:

我们开始认真遵循该程序。 在这一切都死掉的这条线上,我们至少使用
Step操作,至少使用
Step Over 。

乔利·凯尔(Jolly Keil)...没事。 再次重置所有内容(RST),在反汇编器窗口上单击鼠标并单步执行。 在这种情况下,我们可以理解
__scatterload函数中的所有内容都将消失。

通常,如果一切都死于此功能中,则已经有理由查看控制器的类型是否混乱。 但是,不是的,这是正确的(我也仔细检查了设置,但是该固件在其他板上也可以使用)。

好啊 同样,我们重置所有内容并已经跟踪此功能。 经过几次试验,悬挂和冲洗,我们发现了罪恶线...

是的是的 将寄存器保存在堆栈中时,所有操作都会消亡。 同时,在左侧可以看到SP为0x200030A0。 我们看一下控制器的文档:

让我们看看为SRAM分配了哪个窗口:

没错 堆栈指针(SP)在允许的范围内。 那么要怪什么呢? 让我们尝试用0x200030A0(例如,用0x200020A0)替换SP值,因为调试器允许这样做... Chpok! 指定行上的挂起已停止! 因此,我们的内存芯片不是20 KB。 多少钱 经过几次检查,我们发现SP的最后一个工作值为0x20002800。 即10 KB。 这对应于STM32F103C6晶体。 摆在我们面前的是一个微电路。 las
一切都会好起来的,但是在我相当大的盒子中,这批电路板很容易区分。 它们具有特殊的跳线颜色和非常漂亮的翠绿色LED(其余的绿色则不太令人满意)。 因此,很容易从其他板堆中分配它们。 当然,我检查了他们。 当然,整个聚会都被削减了(我花了一打)。
目前尚不清楚该怎么办。 当我在十几块未经过定期测试的板子中得到三块板时:LED不闪烁(所以现在我没有选择性地检查它们,而是完全对其进行检查),我花了一个星期对付卖方。 他“变傻了”。 一直对我想做的事情感兴趣,答应提供建议。 我一次又一次地对他重复说,我愚蠢地连接了电源,七个板眨眼,三个板眨眼。 所以他们死了。 然后他又有了他的桶风琴。 等一个星期。 但是,一切都显而易见。 没有通过人员测试。 在这里,专职考试通过了,他不需要很多内存。 如何证明假货来了还不清楚。 如果您能证明这一点,那么根据Ali Express的规则,您都需要将货物退回。 总的来说,一切看起来都像绝望。 最重要的是,最终卖方没有恶意。 后来我又从他那里拿了一批。 那里一切都很好。 他本人很失望。
我以一种或另一种方式通知公众这种情况。 检查电路板的整体性能,以及实际规格。 确实,不匹配该怎么办尚不清楚。
该文章还有另一个实际好处。 它显示了如何快速找到板突然无法工作的原因,如果问题不是控制器完全无法操作(它通过SWD调试端口进行响应)。