不要忽略默认的MCU设置
调试是嵌入式设计的重要组成部分;跨越硬件/软件的界限。在系统级别上,嵌入式设计的功能越来越多地由固件定义,因此避免bug需要具有特定规程的工程师在项目的设计阶段紧密合作。它还意味着,当bug不可避免地出现时,要抵制指责他人的冲动。
也许正是软件定义硬件的本质使得现代嵌入式设计成为如此有趣的职业。每一个新的微控制器(MCU)似乎提供更高的集成和更先进的功能,但它是完全无用的,直到它被编程。虽然这种级别的集成和配置显然是一个促成因素,并在产品设计中带来了巨大的进步,但它偶尔也会给工程师带来不可预见的问题。
嵌入组件(如MCUs)提供的功能和可配置特性的级别也在不断增加,这些组件提供了许多并非每个设计都需要的特性。这些额外的函数可能会被忽略,很少会造成问题。
正如大多数工程师所理解的那样,这些特性通常由寄存器控制,这些寄存器可以通过软件修改。因此,它们在开机时将有一个默认设置,如果保持不变,将继续在这些默认设置下运行。在许多情况下,这可能不会出现问题,但是如果这些特性仍然没有使用,或者没有经过测试,那么就有可能以某种无法预见的方式感受到它们的影响。系统中可能会出现bug,这些bug是由可能被忽略的完全合法的特性引起的。
即使在理想的情况下,查找错误也是困难的、耗时的和昂贵的。通常情况下,故障可以根据其影响来确定,这将为工程师追踪故障原因提供足够的证据。这个原因是与硬件还是软件有关,这在很大程度上是无关紧要的,但或许仍有争议;重要的是它被发现并得到了纠正。
如果错误的原因是没有正确初始化的低级特性,那么查找它将变得更加困难。要了解硬件平台的初始状态如何影响整个设计,需要对整个系统有更高的了解,而跟踪这些难以捉摸的条件确实会消耗资源。
例如,考虑一个访问串行闪存的MCU上的SPI总线,这是在许多嵌入式系统中使用的一个相对简单的特性。如果在存储值中检测到一个错误,这将表明存储器,而不是MCU,正在遭受故障。这是一个客户的经验,连续读取闪存的状态寄存器显示它正在检测读/写错误。可以理解的是,它被假定存储器设备是失败的,一个理论被事实证明,如果一个短的延迟被引入状态寄存器读之间,故障的数量似乎减少了。此外,电力循环似乎暂时消除了故障。
工程师们相信这些症状指向了串行存储器的故障,尽管它仍然在规定的周期限制之内,只完成了大约60k的写入周期。当串行闪存设备被返回到Adesto进行进一步测试时,没有发现错误,甚至在超过300k写周期被执行之后。
为了追踪真正的故障,Adesto的工程师调查了客户的应用程序并探测了SPI信号。似乎是内存设备的故障,实际上是系统噪音问题,而且可以很容易地纠正。虽然部分原因是由于MCU和闪存之间的PCB磁道阻抗不匹配,但噪音并不完全是由于PCB设计不好或信号完整性问题造成的。
即使它看起来是一个PCB或电路设计问题,噪音实际上是在SPI信号上的过冲和过冲,由信号的过度驱动强度引起的。超调足以中断闪存设备的电荷泵,并导致读取和写入错误。在某些情况下,SPI信号上的超调和欠调也可以解释为信号转换,这也会导致读或写错误。
显示SPI线上出现的超调和欠调的跟踪图像
一个可能的解决方案是把一个RC电路上的信号跟踪,以减慢过渡。然而,人们发现这种设计是基于一种相对较新的MCU,它允许在固件中修改I/O引脚的驱动强度。降低信号的驱动强度足以消除SPI信号线上的超调和欠调,有效地消除系统级噪声源。
这里最重要的一点并不是闪存设备真的在尽力与大量的系统噪声作斗争,而是MCU上的可配置特性可能会引入一些效果,这些效果很容易被解释为设计的一个单独部分的故障。在这种情况下,故障通过一种稳健的设计方法被发现,并通过Adesto工程师的努力得到解决。
也许这里真正的教训是,看起来是硬件故障的问题可以通过软件很容易地解决。一个组件中的故障可以追溯到另一个组件中的错误配置。硬件和软件工程师、客户和供应商之间的工作关系应该足够牢固,能够承受使用最新技术进行设计所带来的挑战。即使默认设置意味着有帮助,它们也应该被验证。对这些设置进行优化可以显著提高系统性能和可靠性。
阅读完整的案例研究。”数字接口中的系统级噪声是如何导致串行闪存存储器中的假错误的”,在Embedded.com上。
本文由Paul Hill(高级营销总监)和Gordon MacNee (EMEA应用程序经理)撰写雷竞技安卓下载