
前言7 p. |% v9 N+ b6 F5 R+ p" Y 本篇LAT的内容简介了一个由RAM上电后初始值引起的问题。! `& W w; z; z0 L7 p5 ^( s7 H * N( W( R' i( Z 问题 客户反映,某产品试生产时出现问题,故障率在10%左右。该故障可以复现,并且将芯片(MCU)更换到新的电路板也无法解决。因此,客户怀疑是芯片出现质量问题。 ) h- F; u9 H4 {" r* ^' X 分析; Q- a; Z- m) S% K& w; a 粗看下来,故障确实比较象是由于芯片本身质量引起的。但是仔细查看代码,发现程序中有一段值得怀疑。该部分代码利用RAM中某个字节的值来判断芯片是否发生过掉电,并据此执行不同的分支。: E* _2 Q' ?; q2 i 一般而言,在芯片上电以后但是没有进行初始化之前,那么RAM(这里不包括寄存器)中的值是随机的。客户开发时曾询问过这一点,所以开发时加以利用。$ W( H: U( ]# A 那么,究竟该怎么理解这个“随机”呢?/ _+ G, z* U7 \4 A2 A 这里“随机”的意思是,任何值都是可能的。因此,当芯片发生若干次掉电上电时,对同一个RAM字节来说,里面的值可以每次都不一样,也可以每次都一样,也可以有时一样有时不一样。因此,应理解这个“随机”为“不保证为任何值”。 而客户恰恰认为,既然是随机的,那么每次值都应该是不同的。 $ ^, Y& @- @; F4 B9 s8 p* c% \ 处理$ w7 z% V+ ^, H9 q$ z 综上分析过程,尽管思路是完全可行的,但是由于对“随机”的含义理解错误,所以程序中只判定RAM中一个字节的值存在一定的风险。0 l9 P* k/ y3 S 解决方法是在判定条件中,将判断1个字节的值更改一下,例如判断3个字节(或者更多)的值是否相同(可以使用多数判决)。同时,选取这3个字节的时候,尽量使得它们的地址分散一些。这样,误判的概率就大大降低。 对于某些芯片来说,还有其他的判断方法。例如,对于STM32系列来说,在寄存器RCC_CSR寄存器中的最高位一般都是上电标志;此外,对于部分产品,还可以在BKP_DR(或者是RTC_BKP之类,根据产品不同)寄存器中写入特定序列来判断。! [) z- [- U2 \3 | 结论 此例实际上是由于对“随机”一词的理解不同造成的问题,而非芯片质量问题。经过重新修改程序后,该问题不再出现。- l1 O( Y& b' @4 q ) ?" P0 d" U3 K: T w! e( j 4 J8 z9 A& p* J" k$ L) Q% p0 Y; A# o 详细解答请下载文档:https://www.stmcu.org.cn/document/detail/index/id-2167381 r% Q3 U1 ~/ y+ n; \ 更多实战经验文档请见:https://www.stmcu.org.cn/document/list/index/category-657 - }5 x' [" f& m( W' o |
看来楼主要讲讲冷复位和热复位的问题了。 |