Part Number:TMS570LS3137
产品要求能够远程升级固件功能,因此芯片内下载了引导程序和应用程序。引导程序启动后定时发送CAN报文,超时未收到应答则进入应用程序,收到应答则等待升级固件;应用程序运行中CAN总线收到升级请求则通过“systemREG1->SYSECR = 0x8000U”或用看门狗超时方式进行软复位,等待引导程序运行后升级固件,但是引导程序未正常运行,在CAN总线上未监控到定时发送的报文,引导程序的指示灯也未正常闪烁。这又可能是什么原因造成的?如何处理这个故障? 注:应用程序启用了CAN、RTI、DMA等中断。
zhao zhang:
如果芯片nRST引脚在加电期间被外部另一个芯片IO强制拉高,这是不是会引起复位出错?
,
Ben Qin:
zhao zhang 说:如果芯片nRST引脚在加电期间被外部另一个芯片IO强制拉高,这是不是会引起复位出错?
有可能,这取决于微小的时间差。
zhao zhang 说:在CAN总线上未监控到定时发送的报文
你的意思是板子没有经过引导程序直接进入了应用程序是吗?
,
zhao zhang:
我在引导程序和应用程序het初始化后点亮灯,未见灯亮,应该是引导程序未正常运行,或者是引导程序未进mian()
,
Ben Qin:
你是如何启用引导程序的?
,
zhao zhang:
应用程序收到远程启动要求进行复位操作,一种是关总中断后软复位{_disable_interrupt_(); systemREG1->SYSECR = 0x8000U;while(1);},一种是用看门狗方式{ dwdInit(1); dwdCounterEnable();while(1);},两种方式使芯片复位从0x00000000位置进入引导程序(应用程序起始位置在0x00180000。但是引导程序未正常运行。另外我把应用程序改为0x00000000位置运行,看门狗复位功能可以使应用程序正常复位并重新运行。
,
zhao zhang:
后来我在_disable_interrupt_()后面用vimDisableInterrupt()禁能了所有开启的中断,同样未正常重启。有个神奇的地方是应用程序里每个运行周期末尾通过CAN发送日志报文,程序里我一开始我是屏蔽了日志报文,后来我把日志恢复后突然可以复位后引导正常运行了,我优化了其它程序又不能正常复位了。例如:{ _disable_interrupt_(); vimDisableInterrupt(2); vimDisableInterrupt(3);dwdInit(1); dwdCounterEnable(); while(1);}可以正常重启,我在 _disable_interrupt_(); 前加一条给软件版本变量赋值McuSwVer = 0x03U;就不能正常重启了,所以我觉得我还是没找到根本原因,只是碰运气恰巧能正常复位了。
,
Ben Qin:
zhao zhang 说:前加一条给软件版本变量赋值McuSwVer = 0x03U;就不能正常重启了,
后来再删除又可以正常重启了吗?
zhao zhang 说:两种方式使芯片复位从0x00000000位置进入引导程序(应用程序起始位置在0x00180000。但是引导程序未正常运行。另外我把应用程序改为0x00000000位置运行,
你的引导程序存放位置是?
,
zhao zhang:
引导程序放的位置是0x00000000,应用程序位置是0x00180000,增加变量赋值就不能正常重启,去掉就能正常重启。我通过在线查看程序卡在引导程序sys_startu.c中if ((esmREG->SR1[2]) != 0U){for(;;){}}这里了,esmREG->SR1[2]的值是0x00000080,我不知道这个故障在应用程序里是怎么产生的,我也没查到这个故障在哪个文件里有具体的故障定义,最后我试着在应用程序里复位前用esmClearStatus(2U, 0xFFFFFFFFU)清除了esmREG->SR1[2]所有故障,现在可以正常复位运行了。请问esmREG->SR1[2]的值0x00000080这个代表什么故障,哪个文件有说明?虽然强制删除了,但是我觉得还是有隐患,后续再测测。
,
Ben Qin:
zhao zhang 说:请问esmREG->SR1[2]的值0x00000080这个代表什么故障
该错误似乎是于中断有关,在TRM中ESM章节有相关描述。
检查下你的中断函数相关代码。