This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC2538 刷了OTA IMAGE-A的固件导致无法正常启动,也无法再刷固件了

Other Parts Discussed in Thread: CC2538, Z-STACK

1、硬件是CC2538,之前组网控制都正常,协议栈是Z-Stack 3.0

2、因为需要OTA,就参考OTA guide手册,编译出了一个Image A版本的Client固件,见附件,改一下扩展名为.hex,@VV 你可以在你的CC2538EM评估板上刷一下试试,这个是IAR for ARM编译出来的(bootloader+application二合一的hex文件),结果刷进去之后,设备就再也不能启动了,无论怎么用SmartRF Programmer 2刷会原来的固件,都提示刷成功了,但是程序始终无法运行;

3、有没有什么办法恢复,点了右上角的CC2538 Forced Mass Erase,不起作用,窗口一闪而过,IAR直接Debug也走不到main入口,各种boot、SampleSwitch工程都试过了,不行,如何破?

Router-OTAClient-ImageA-withBootloader.zip
  • 有没有不带OTA的image,之前也是在CC2538上运行过的,可以烧写进去么? 

  • 可以烧,后来我发现问题所在了,如果使用OTA image,CC2538-OTA-Image-A.icf文件里面的SRAM是不能修改的,默认是如下,也就是16KB,如果修改为(0x20000000 ),也就是32KB,那么image A烧进去就无法启动了,如果是这样,那岂不是无法使用完整的32KB SRAM了吗?

    另外,C:\Texas Instruments\Z-Stack 3.0.0\Projects\zstack\OTA\Boot\CC2538\Boot.eww的确是无法单独调试的,无法进入到main函数,只能编译出Boot.bin,用来和Application合成最终的.hex文件:

    //
    // Define a region for the on-chip SRAM.
    //
    define region SRAM = mem:[from 0x20004000 to 0x20007FFF];

  • 你好,我也是在研究OTA的过程中有好几个开发板编程不能烧录了,用 Smart flash programmer 2 解锁也不行,请问你是怎么可以重新烧录的?造成这种情况的问题是什么?感谢回答!

  • 我先说一下我遇到的问题,“修改为(0x20000000 ),也就是32KB,那么image A-with-bootloader固件烧进去就无法启动了”,这的确是个bug,即使最新的Z-Stack 3.0.1(截止到2018.3.3)还是有这个bug,这是首先被我发现的(见:),目前已经得到TI工程师JasonB的确认了,解决方法你可以看一下e2e.ti.com zigbee板块上JasonB创建的置顶帖子协议栈issue wiki说明,"2.6 Modifying CC2538 Linker to utilize all 32k RAM causes lockup",导致这个bug的原因是运行堆栈放置的位置不恰当,TI当初只考虑了16K RAM,没考虑32K RAM,所以导致osal无法运行。

    接下来说说你的问题,CC2538支持ping-pong的方式进行OTA,如果你是从ImageA升级到ImageB,再从ImageB升级到ImageA,以此类推,那么基本没有任何问题,如果你是ImageA升级到ImageA,或者ImageB升级到ImageB,即两次都升级同一个固件,那么就很有可能(应该说不是很有可能,是一定)导致芯片锁住,我也遇到这个问题了,此时smartRF programmer2也识别不到芯片,必须用TI给的命令行工具ArmProgConsole进行解决了,就是命令行下进行擦除整个芯片(当然IEEE等内置不会被擦,放心),下载位置在 

    具体使用方法:

  • 卧槽芯片救回来了!牛逼啊大哥!!心疼我前面丢掉的4个芯片 π-π...
  • 您好,请问下CC2538的OTA升级是可以改成不用ImageA和ImageB两种文件的吧?可以通过boot程序来调整HAL_OTA_RC_ADDR和HAL_OTA_DL_ADDR这些地址吗?
  • 不能,默认的分区模式就是这样,你可以在gateway上实现先通过image notify的方式,让各个节点报告自己的当前firmware版本,然后你再根据每个节点的版本不同,给其升级另外一个firmware,以防止对同一个节点两次都用同一个firmware升级造成芯片锁住。

    这个方案是可行的,可以同时给7个不同版本的节点同时升级,我们都已经成功了。