备受广阔人民群众喜爱的四大名著之一《西游记》以法相宗开山祖师玄奘大师西行求法的巨大业绩为蓝本,演义成唐僧师徒四人阅历九九八十一难,含辛茹苦西天取经的神话故事,其间真假美猴王一节,六耳猕猴和孙悟空容颜无二无别,身手神通也与孙大圣一般无二,让人真假难辨,正所谓唐僧紧箍疼不出,天王镜子照不出,观音我也看不出,仍是我佛如来慧眼识人,道出六耳猕猴真身并用金钵盂罩住被孙悟空一棍子打死完事。
被老谋子炒作为16年来真正想拍的电影“影”则叙述了一个关于替身的故事。替身,人称“影子”,与真身互为一体,令旁人真假难辨,如同孪生,在危急关头挺身而出,替主人博回一命。这种体裁形似很受咱们欢迎,尽管不曾看过,可是吴宇森的《变脸》听说也是这种以假换真的故事。
后来,这种以假乱真、男女难辨的方法被上海交通大学微电子学院院长陈进教授发扬光大,这位海归科学家创造性地以打磨替换标签的方法发明晰“汉芯一号”,“骗”过了多位评定专家,套取了高达上亿元的科研基金,在国人亟待在高科技范畴有所突破之际,以一种荒谬古怪的方法制作了轰动一时的严重科研造假事情。
雄兔脚扑朔,雌兔眼迷离;双兔傍地走,安能辨我是雄雌?
时值当下,嵌入式范畴的MCU“管脚兼容”不只能够在软件开发上做到代码复用和开发工具的通用,还能够在硬件规划上直接拿来主义,更能在出产上施行物料替换,以应对芯片断供或供货周期长的难题,由于备受广阔嵌入式体系厂商喜爱,可是,这些“管脚兼容”的芯片真的没有任何不同吗?
1
嵌入式软件工程师实在是一群适当苦逼的集体,这不,都快到深夜十二点了,两位难兄难友还在那里调着程序,有一搭没一搭地交流着,更多的时刻都堕入深深的思索中。
黑夜张开它那巨大的翅膀,笼罩着逐步入眠的大地。窗外,细雨唏嘘如歌,落叶曼妙如舞。室内,安静并非无声,两位筋疲力尽的码农交头接耳。
“三昧道人,你说这两颗芯片到底有什么不同呢?”搭档一只手支着肥壮的脑袋,声响精疲力竭,犹如梦呓。
夜色渐浓,睡意犹如惊涛拍岸,一股股向我袭来。我强打精力,看了看他那张结婚后逐步发胖的脸蛋,瞄了瞄他那日益拱起就要藏不住的肚腩,定了定神,咬文嚼字地说道,“或许是出产工艺不同吧。依据芯片介绍,意法半导体的这颗SPC560B40和飞思卡尔的MPC5604B选用的是飞思卡尔的PowerPC内核和意法半导体的Flash技能,管脚兼容,规划共同,软件通用。他们的仅有差异应该是SPC560B40是意法半导体出产的,MPC5604B是飞思卡尔出产的,两家的制作工艺不同,所以导致了这个差异。”话虽至此,我心里却犯起了嘀咕,“制作工艺不同,最多有些性能上的差异,也不该该在功能上有所不同呀!”
两个电路板接着各自的测验盒,静静地躺在作业台上,不悲不喜,全然不理睬咱们的对话。这两块板子,一块上面焊的是SPC560B40,一块上面焊的是MPC5604B,其它完全共同,烧了同一套程序后发现,选用SPC这颗MCU的电路板能够经过遥控钥匙唤醒,选用MPC这颗MCU的电路板却死活都唤不醒。
2
长夜清寂,微风习习,细雨渐歇,在月色的沐浴中,窗外的草地上翻滚着银闪闪、绿莹莹的波涛。站在窗前,仰视天穹,天上的星星一眨一眨,像极了小孩子的眼睛。
我伸了伸懒腰,把妨碍又碍眼的搭档打发回去,泡了一杯深茶,驱逐一下睡意,沉下心来,预备再捋一捋程序。
遥控唤醒程序说来也很简单,MCU睡觉40ms,主动暂时唤醒后初始化遥控接纳驱动,假如2ms内没有收到到达阈值数量的有用射频位,就再次进入休眠,40ms后再次暂时唤醒。。。假如再这2ms内收到了若干有用射频位,则持续接纳2ms,假使仍能接纳到若干有用射频位,则依照遥控报文时长的2倍设置接纳时刻,假使接纳到有用的报文,则退出休眠,即所谓被遥控钥匙唤醒。
计划很简单,既能确保没有有用信号时安心睡觉,完成较低的休眠电流,又能够在有搅扰时经过“三级过滤”滤除搅扰,还能在存在有用钥匙时及时唤醒。这段程序一直以来跑得挺好,直到这次,由于物料严重,没有满意的SPC,用了一些MPC来救急,才发现用了MPC的这些板子唤不醒了。明显,这两颗所谓管脚兼容、软件通用的MCU必定有一些不为人知的不同!
3
程序员喜爱夜晚,主要是贪恋它的安静。四周一片缄默沉静,堕入熟睡之中的偌大的办公室寂静无声,此时此刻,无丝竹之乱耳,唯有案牍之劳形。面临Bug,心底越静,就越是有Bug立刻就要跃出水面的等待。其实,Bug关于我具有符咒般的法力,它尽管让人茶饭不思,夜以继日,但它不只不让人觉得惧怕,乃至还有一些欢喜之情稠浊其间。或许,正如窘境让人刚强,磨难让人生长相同,Bug便是将程序员百炼成钢的铁石,不磨不足以成器!
不消说,MPC唤不醒,问题就出在主动暂时唤醒后的遥控接纳上。主动唤醒期间的遥控接纳也很简单,先让MCU进入一个以内部时钟为体系时钟的方法,然后设置一个输入捕捉模块和计时器,上升沿触发中止,经过计时器计算两次中止间的时刻距离,判别上升沿之间的位宽,进一步判别位宽是否满意遥控协议标准。在2ms内判别是否存在若干满意标准的位宽,以确认是否经过榜首级滤波,之后还有两级滤波,确保既能够被有用钥匙及时唤醒,又不会被外界搅扰过错唤醒。
为了定位问题终究出在这三级滤波的哪一级上,我添加了一点测验程序,经过榜首级滤波就点亮一个led灯。
尽管led灯供给不了多少信息,可是它就像行进之路上的明灯,能够明明白白地告知咱们:体系还活着!
成果发现,榜首级滤波都能没过去,这说明这个2ms内输入捕捉模块如同没有作业起来。
输入捕捉模块以体系时钟分频出的1MHz为时钟源,暂时唤醒方法下,为了确保休眠电流满意产品标准要求,挑选了内部时钟(16MHz)为体系时钟,正常方法下是以外部晶振+PLL做为体系时钟的,一念至此,我打听性地将暂时唤醒方法下的体系时钟源改为外部晶振,下载程序之后一看,竟然唤醒了,相同的程序烧录到SPC的板子上,也能够正常唤醒!
一股欢喜之情直冲脑门,浓浓的快乐在心底泛动不已,我如释重负地站动身来,外面的月色愈加洁白了,夜色愈加地深重,它带走了全部喧嚣,将安静和空阔播撒在这块大地上。
我伸了个懒腰,正预备走人之际,倒运催地遽然想看看改正时钟源之后的休眠电流怎样,话不多说,我设置好休眠条件,摒心静气地等着产品进入休眠,滴答,滴答,我似乎听得到墙上的时钟走动的声响,决议命运的时刻越来越近了,我似乎又听到了自己心跳的声响,‘砰’,‘砰,‘砰’,‘梆’,我的一颗心掉到了地上,休眠电流上来1.5mA左右,比产品标准要求多出来0.5mA左右。
4
今夜注定无眠!谁让自己快乐太早来着!
电流怎样上来的?我敏锐地意识到是外部晶振的起振时刻问题,内部时钟便是个RC电路,发动时刻很快,可是外部石英晶体方法的晶振就不同了,我查了查数据手册,手册中给出的外部晶振最大起振时刻6ms,没有给出典型值,我又翻到相同是飞思卡尔MCU芯片的S32K1xx上,上面给出的起振时刻是2.5ms。
答案现已呼之欲出了,起振安稳时刻2.5ms,再加上榜首级滤波的2ms,暂时唤醒时刻从之前的2ms多一点一会儿进步到了4.5ms以上,电流不上去才怪!
已然休眠电流是睡觉时刻和暂时唤醒时刻的份额决议,现在暂时唤醒时刻翻倍,只需要将睡觉时刻翻倍就能够了,看了看遥控报文发送机制,每次至少发三条报文,每条100ms,睡觉时刻从40ms调高到80ms,也不会呈现漏掉检测时机的状况,依照这种思路,如此这般改了改,休眠电流总算下来了。
看来MPC的内部时钟和SPC的内部时钟仍是多少有点差异,外部晶振上却是共同。可是这种差异是怎样发生的呢?我抱着试试看的心境,改回选用内部时钟的方法,一起将榜首级滤波唤醒时刻从2ms改成4ms,并修改了有用位数的断定阈值,成果发现,运用MPC芯片的板子也能唤醒了!
奇哉怪哉!之前有用位数是依照2ms设定的,MPC一个也捕捉不到,现在依照4ms设定了,MPC全都能捕捉到了,如同这4ms中的头2ms也能正常接纳相同。以我粗浅的知道,仅有的解说便是MPC的输入捕捉模块在“40ms睡觉-2ms唤醒-40ms睡觉-2ms唤醒。。。。”这种内部时钟快节奏封闭和敞开下的power on和power down有点问题,不过它能够承受“80ms睡觉-4ms唤醒-80ms睡觉-4ms唤醒。。。。”这样的节奏。那么,这种“现象”背面的机制是什么呢?
是不是两家的处理器内部规划也不相同?时钟树、供电网络都有不同,内部IR压降、电磁耦合等问题形成即使经过了制作工艺的签核过程,也会在芯片出产出来后呈现问题?当然这种解说过于粗浅、随意,这种体现应该有着愈加深层的布景和原因,可是再往深了剖析,就绝非我的才能所能窥见的了。在此仰拜高手作答!
跋文
嵌入式产品要求严厉,换芯片兹事体大,万万不要信任管脚兼容这种广告式的营销用语,经此经验,我深刻地体会到:管脚兼容是大话,总有一点小误差。