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.

TMS570LS1227通过串口在线升级程序

Other Parts Discussed in Thread: TMS570LS3137, TMS570LS1227

各位大神好!我现在用的这个网址processors.wiki.ti.com/.../RM4x_Hercules_MCU_Bootloader 上面提供的例程来通过串口尝试程序升级功能,根据压缩包下面提供的操作说明PDF文档,文档上说程序中有个更新文档标志存放在地址0x0007FF0中,如果这个标志的值不等于0x5A5A5A5A,则进行程序升级,如果等于0x5A5A5A5A,则引导程序直接跳转到起始地址为0x00020000的应用程序代码区执行应用程序,我原文档上的这段说明截个图放上来。我现在不明白的是压缩包里跟的代码里的cmd文件,这里也截个图放上来哈,cmd文件显示.text 、 .const 、..cinit  .pinit全都是放在FLASH0里面的,而不是放在起始地址为0x00020000的FLASH1里面,可是操作说明文档里明明说的是应用程序代码是放在0x00020000起始地址里的呀,求大神们指点迷津啊!

新建文件夹.7z
  • 你对于更新成功的标志0x5A5A5A5A的理解是正确的。

    关于CMD,Bootloader例程中的CMD是给Bootloader用的。注意到,虽然在Memory部分,定义了Flash1的区域,但是在Sector中没有任何一个Sector用到了Flash1。所以,整个Flash1是给APP程序(应用程序)用的。

    那么,在写APP程序的CMD时,请注意,不要把Sector指到Flash0中。

  • 你好,非常感谢你!我还是不太明白,整个BootloaderAPP程序是共应一个CMD文件的是吗?我把我参考例程改写的CMD文件传上来你帮我看看有什么问题哈,谢谢!

  • Bootloader和APP不是共用一个CMD文件的。

    APP的CMD可以改成如下:

    /*----------------------------------------------------------------------------*/
    /* Linker Settings                                                            */
    
    --retain="*(.intvecs)"
    
    /* USER CODE BEGIN (1) */
    /* USER CODE END */
    
    /*----------------------------------------------------------------------------*/
    /* Memory Map                                                                 */
    
    MEMORY
    {
    	VECTORS    (X)   : origin=0x00020000 length=0x00000020
    	FLASH1     (RX)  : origin=0x00020020 length=0x0012FFE0
    	STACKS  (RW) : origin=0x08000000 length=0x00001500
    	RAM     (RW) : origin=0x08001500 length=0x0002eb00
    
    /* USER CODE BEGIN (2) */
    /* USER CODE END */
    }
    
    /* USER CODE BEGIN (3) */
    /* USER CODE END */
    
    
    /*----------------------------------------------------------------------------*/
    /* Section Configuration                                                      */
    
    SECTIONS
    {
        .intvecs : {} > VECTORS
    
        .text    : {} > FLASH1
        .const   : {} > FLASH1
        .cinit   : {} > FLASH1
        .pinit   : {} > FLASH1
        .bss     : {} > RAM
        .data    : {} > RAM
        .sysmem  : {} > RAM
        
        FEE_TEXT_SECTION : {} > FLASH1
        FEE_CONST_SECTION : {} > FLASH1
        FEE_DATA_SECTION : {} > RAM
    
    /* USER CODE BEGIN (4) */
    /* USER CODE END */
    }

     

  • 你好,我用你的方法在工程中放了两个CMD文件,编译一直报错呢

  • 你把两个CMD都放在一个工程下,肯定会报错的。

    Bootloader的工程和APP的工程是分开编译的。

    Bootloader的工程就用Bootloader的CMD(例程里的),APP是你的应用程序,是实现你需要的功能的,用前面我贴的CMD文件。

  • 喝可乐的马甲你好!非常感谢你及时的回复和耐心的指导,你说Bootloader的工程和APP工程分开编译,那编译生成的.out文件就是两个了是吧?这两个.out文件是不是要分两次烧写到FLASH中呢?如果方便的话,你有没有做好的例程能发给我学习啊,我的邮箱是 liyuanyuan2010@126.com 。谢谢哦!

  • 两个工程一定会生成两个.out文件。

    先用仿真器把Bootloader的.out烧到Flash中。然后,把APP的.out转换成BIN文件(附件APP例程文件夹内有写转BIN的批处理)。最后,通过串口把BIN文件烧录到Flash中(这个过程就是Bootloader的功能了)。

    附件为TMS570LS3137的APP例子。你用的1227,差不多的,改一下工程属性和CMD文件就可以了。

    BL_APP.rar
  • 喝可乐的马甲你好!我的Bootloader程序是根据 http://processors.wiki.ti.com/index.php/RM4x_Hercules_MCU_Bootloader 提供的例程改写的,工程名字叫Flash,我上传到附件你看一下,然后我的APP应用程序就是一个简单的点灯的程序,APP程序的CMD文件就是你昨天给我贴出来的CMD。

    我按照你说的先用仿真器把Bootloader也就是我的Flash工程的.out文件烧写到Flash中,然后把APP的.bin文件通过串口发送给TMS570LS1227,串口设置的波特率是57600,一个停止位,无奇偶校验,传输协议就是 http://processors.wiki.ti.com/index.php/RM4x_Hercules_MCU_Bootloader 例程上提供的 ymodem 协议,用的通信工具是xp系统自带的超级终端。我的串口是好用的,可以发送和接收。现在的问题是在发送.bin文件的过程中,超级终端提示的错误是远程系统(也就是1227)没有响应,我尝试用别的串口调试工具发送.bin 文件也是一样的问题,文件压根发送不出去,不知道这是怎么回事啊,是工程中用的通信协议有问题还是我的CMD文件没有配置好呢?

    Flash.7z
  • 没有记错的话,Bootloader的波特率应该是115200.

    如果Bootloader正常运行的话,上电后超级终端会看到MCU发出来的菜单信息。

  • 你好!波特率不管是57600还是115200,把Bootloader烧进去以后,上电后会在超级终端打印出信息的,从超级终端发送一些字符指令,Bootloader也会收到并进行相应动作,就是在超级终端向其发送APP的.bin文件时,就传输不了了,不知道什么原因啊

  • 如果有打印出来东西,说明570发送数据没有问题。发送指令后,570也有影响,那样的话570接收也没有问题。

    那样的话,建议你带着仿真器去跑Bootloader,看看发送APP的Bin时,570的程序运行到哪里去了,可以停在什么地方出不来(例如Flash操作)。

  • 你好!我现在用仿真器跑Bootloader时,发现在用ymodem协议发送.bin文件的时候,在执行到检测发过来的信息大小并和flash的大小进行比较的时候就出现异常了,然后就跳到异常中断 b   undefEntry 里去了,为啥呀?愁死了

  • undefEntry是CPU读到了非法指令才会跳过去的。

    所以,你找一下,跳到这个undefEntry的前面那一句是哪一个?