【案例分享】下拉电阻太大导致MCU启动失败
很多芯片的IO引脚会内置上拉或者下拉电阻,并且该值的范围区间很大。使用时需要考虑内部上下拉电阻的影响。
问题描述
公司之前做过的一个产品,产品测试过程中,只测试了大约5台样机,由于发货时间较紧,就没有测试更多的机器。发往客户的设备大约100台左右,有客户反馈大有几台设备无法正常启动,需要我们分析。
原因分析
设备刚上电就无法启动,有可能是我们的生产漏测了,但是查看生产记录,测试都正常的,有测试通过记录。拿到客户的故障机机器后,问题马上就能复现,经过测试发现,我们的设备有两种启动模式,生产烧录验证的时候,使用SD卡启动模式,用户正常使用的时候,使用SPI NANDFlsh 启动模式。经过验证,我们是使用SPI NAND 的时候无法启动,更换好的已经烧录好的NAND 芯片,依然无法启动。因此我们将怀疑的方向朝向启动的配置模式上。
我们用的MCU有4种启动模式,由两个IO引脚上电时的电平决定启动模式,为引脚电平为11时候,使用SD卡启动,电平为00的时候,使用NAND 启动。我们测试MCU的配置引脚,发现可以正常启动的设备配置引脚电平为0.5V左右,启动失败的设备的电平为0.9V~1.4V不等,查看芯片的手册,手册中要求,输入高电平最低值为2V,输入低电平的最高值为0.8V。很明显我们的配置引脚的电平出现了问题。
图 1:芯片Vih和Vil电平要求
经过原理图分析,当初为了物料统一,我们的原理图将所有的下拉电阻都换成20K,但是我们忽略了MCU的IO其实一般都有一个内置的上拉电阻,巧合的是,内置的上拉电阻范围很广,规格书上写范围是40K~100K,根据分压原理VIO=VCCx,如果我们的下拉使用20K,Vio的电压在0.55~1.1V之间,虽然这些电平没有达到高电平的最低值,但是最高值也远超了低电平的最高值0.8V,工作在不确定状态下,导致了芯片无法正确识别启动模式。
图 2: 原设计的下拉电阻值。
解决方案
这个问题的发生,最主要还是我们没有认真看规格书,只是凭经验选择下拉电阻,忽略芯片的内置上拉电阻。我们的解决方案主要是修改下拉电阻的值,为了保险起见,将图2中的下拉电阻R2修改为1KΩ,同时将该引脚配置为输入模式,根据分压原理,如果芯片的内置上拉电阻为40K~100K,Vio引脚的电压的范围为0.03~0.08V之间,完全满足芯片的要求。
总结
该类型的问题主要是设计者忽略了芯片内部也有电阻,仅凭经验进行使用下拉电阻,导致最终的分压后的电压处于不稳定的状态。避免类似的问题最好时看透规格书,弄清楚芯片内置的上下拉电阻,如果确实不清楚该值,就可以使用示波器捕捉上电时候的引脚电压值,选择合适的外部电阻进行上下拉。
海思Hi35xx uboot启动分析总结
liwen01 2019.12.09
前言
在嵌入式linux设备中,uboot的最终目的就是启动kernel。对于uboot而言,没有人把它引导起来,所以uboot首先需要把自己加载起来,然后再去引导kernel的启动,这也就可以大致的分为Uboot启动的第一阶段和第二阶段。
(一)start.S第一阶段启动总结
在海思hi3251a官方的《Hi3521A_PINOUT_CN》手册上有上电锁存管脚BOOTROM_SEL,这个是引脚用来定义是从BOOTROM启动还是从spi flash启动 。
(1)BOOTROM启动
当启动模式为从 BOOTROM 启动时,海思的BOOTROM的程序会去初始化串口,然后与海思的HiBurn工具建立通信
如果能建立通信,则启动HiBurn升级uboot程序流程,如果不能与HiBurn建立连接,等待一段时间之后它就转去从外部的spi flash启动
(2)HiBurn 烧入原理
HiBurn烧入的基本原理是,HiBurn工具与BOOTROM程序建立连接之后,先下载uboot程序的开始4KB数据到海思芯片的内部RAM
然后通过下载的那一小部分uboot代码去初始化外部的DDR,如果DDR初始化成功,HiBurn再将剩下的uboot程序下载到外部的DDR中去
最后是在DDR中启动uboot,如果要进行烧入操作,是通过DDR中的Uboot程序,发送uboot命令将DDR中的uboot程序烧入到外部的flash中去,这样就实现了uboot程序的升级。
(3)spi flash启动
海思的hi3521a芯片支持从 SPI NOR Flash 和 SPI NAND Flash 直接启动,它的启动也就是我们start.s中的大部分实现。主要做的工作有:
初始化CPU相关功能(关缓存,关MMU,设置SVC模式等)将异常中断向量表重定向到内部RAM将uboot代码重定向到外部DDR中设置栈空间清空BSS段最后调用C语言接口去执行C语言代码实现第二阶段的启动。第一阶段在执行之后,在DDR中的映射空间的数据分布如下:(二)start_armboot第二阶段启动总结
在uboot的启动的第二阶段,主要做的是:
初始化变量和结构体重定向环境变量初始化堆管理器初始化环境变量进入命令处理循环在命令处理循环中,默认Uboot是超时等待用户命令输入
如果有检测到命令的输入,则执行相应的命令,如果超时没有命令输入,uboot默认执行的bootm命令进行kernel启动引导。
这里涉及到两个比较总要的点:环境变量的重定向和uboot命令处理。
(1)环境变量重定向
在uboot第二阶段的时候,uboot会去检测flash中环境变量的地址中环境变量是否有效,如果有效,则使用flash中的环境变量值来初始化uboot运行中的环境变量,如果flash中的环境变量无效,则使用默认的环境变量来初始化运行中的uboot。
在uboot的用户命令操作过程中,如果有对环境变量进行修改,都是修改的内存中的那一份环境变量,如果要将修改的环境变量保存到flash中去,则需要运行命令saveenvuboot在flash的分布如下:
uboot.bin烧入到flash的0地址位置,boot.bin里面的数据就是按我们连接脚本中的数据那样分布。在0x80000(512KB)开始的位置就是环境变量的在flash的位置,其大小为256KB。
(2)uboot命令处理
在启动的最后阶段,就是执行uboot的bootm命令,主要就是uboot将kernel程序从flash中复制到内存去,然后就是检验kernel镜像文件的有效性,设置uboot传递给kernel的参数,设置kernel启动的环境(比如关缓存,关中断,CPU处于SVC模式等)
最后就是通过一个函数指针指向kernel的启动地址,调用该函数实现uboot到kernel的运行。
在这个过程中,启动参数和机器码同时传递给kernel,关于参数传递,实际在这里是通过寄存器间参数的地址传递给了kernel。
(3)参数传递
C语言进行函数调用的时候,常常会传递给被调用的函数一些参数,对于这些C语言级别的参数,被编译器翻译成汇编语言的时候,就要找个地方存放一下,并且让被调用的函数能够访问,否则就没发实现传递参数了。对于找个地方放一下,分两种情况。
一种情况是,本身传递的参数就很少,就可以通过寄存器传送参数。因为在前面的保存现场的动作中,已经保存好了对应的寄存器的值,那么此时,这些寄存器就是空闲的,可以供我们使用的了,那就可以放参数,而参数少的情况下,就足够存放参数了,比如参数有2个,那么就用r0和r1存放即可。另外一种情况是,如果参数太多,寄存器不够用,那么就得把多余的参数堆栈中了。即,可以用堆栈来传递所有的或寄存器放不下的那些多余的参数。--------------End--------------
如需获取更多内容
请关注公众号 liwen01
相关问答
班班通出现英文Reboot and ……怎么办?启一下电脑或是电源。班班通指学校每个班级里具备与外界进行不同层次的信息沟通、信息化资源获取与利用、终端信息显示的软硬件环境,一般泛指简易多媒...班班...
手机打开显示快速 启动 救援 模式 是怎么回事?按住音量+和开关键手机关机又自动开机了,是怎么回事,求答案?你是华为手机吧,我猜你是系统文件有破损或者被误删除了,这是让你用usb连电脑打开华为手机套件hisuite,你照做看看能不能自动修复吧,不行就只能从新刷rom了。...
奇骏一键起动良好用法是怎么样的 - 汽车维修技术网[回答]据汽车维修网小编的了解不少朋友对一些汽车知识不是很了解的,为方便大家了解这些知识,那么今天汽车维修网小编给大家介绍一下关于奇骏一键起动良好...
1+n同步互动课堂是什么?关于这个问题,1+n同步互动课堂是一种在线教育模式,其中1位教师可以同时面对多个学生(n),并通过互联网进行实时互动教学。这种模式可以使学生在各自的位置上...
为什么 启动 要和常开和线圈a2连接呢,而a1直接就?个自保电路,可以满足控制要求。接线方式如下:以线圈电压220V...以5011接触器为例子,其辅助触点为一常开一常闭,如果接一个自保电路,可以满足控制要求。接线方...
dell的fn+开机是什么意思啊正常情况下出现什么?FN+电源键会在启动后自动进入自检模式,会对电脑的各个部件进行检测,例如硬盘,屏幕,内存等等。如果有错误会给出声音和文字提示。一般会在电脑有不确定的硬件...
如何 启动 汽车的手自一体?[最佳回答]1.起步时,将操纵杆推到手动位置,以一档起步;起步后,可以加到二档;三档可以加30公里左右的时速;时速50公里左右可以加到四档;自动启动模式:1。只能在...
双离合汽车应该怎么开才正确[回答]双离合汽车驾驶技巧双离合驾驶技巧一:停车必须进N档。尽量避免深油门加速:开动力换挡的车,一定要控制好车速,尽量避免突然加速,因为双离合会默认...
谷歌手机屏幕上显示要开启android请输入您的pln码是什么意思...根据您的疑问:您可待机画面-点击应用程序-设定-锁定屏幕-屏幕锁定-输入您自行设定的PIN密码-选择“无”即可。有用(0)回复xiaoyuwei1998就是密码,你在安全界...
无法 启动 ,因为应用程序的并行配置不正确”我该怎么做?1、系统的安装模块服务被禁止了,就会造成程序无法安装,会提示“应用程序无法启动,因为应用程dao序的并行配置不正确。”,出现这样的问题的解决方法是启用模块...