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.

使用TM4C1230H6PM的芯片,在flash中烧写两个程序,发现无法从一个应用程序跳转到另外一个应用程序,然后正常执行第二个应用程序???



我使用的是TivaWare BootLoader user's guide --SW-TM4C-BOOTLDR-UG-2.0.1.11577 这个手册,平台硬件是TM4c1230H6PM的处理器,开发环境为Keil。

我想使用IIC的方式来让我自己写的应用程序实现自动更新固件程序,现在已经把bootloader文档看得差不多了,也看了些TI的例程,遇到以下问题,希望有人可以帮助到我,thanks very much!

1.我自己写一个应用程序(m4_update),基于project那个例子修改的,里面做了这样几件事情,main()函数中,初始化串口0(作为调试程序打印消息)和GPIO引脚(PB2作为输入引脚),然后读取PB2的值,如果为高电平(需要升级),则进入我的Updater()函数(这个函数是直接使用boot_serial那个工程中的Updater函数),否则就不需要升级,然后就直跳到我自己写的另一个点灯程序(m4_led)。

2.我用的LM Flash Programmer 烧写的,m4_update从flash的0地址开始烧写,然后m4_led是从0x2800开始的,当两个程序都烧进flash后,设置PB2为0,不需要升级时我发现跳转到m4_led后无法正常运行,我的跳转语句是:(*((void (*)(void))(*(uint32_t *)0x2804)))();?????确定执行到这一句,因为我在这句话前加了一句打印语句: UARTprintf("call application..........\n");这句话可以打印,请问是哪里的问题呢?或者是我的思路有问题??

3,以上是我现在正要解决的问题,大问题是我怎么让我的TM4c1230H6PM支持通过I2C方式实现在线升级固件程序,小问题是我怎么解决我上面提到的跳转问题,还希望大家能帮到我这个刚接触硬件的IT小菜鸟,谢谢您!先谢谢了!!

  • 这个东西我也没做过,你的跳转语句好长,是不是这里的问题呢

  • 恩,你好,谢谢你,我是看那个例子里面的跳转语句是这样的,把要跳转的地址强制转换为函数指针,然后调用这个无返回值无参数的函数。

  • 我找到了bootloader的一部分资料,可能对你有帮助,直接在bootloader中修改即可

    在 SRAM 中映像建立完毕并开始执行后, BootLoader 将调用 CheckForceUpdate()来决
    定运行 Application 还是 Updater。 CheckForceUpdate()会检测应用程序是否有效并检测用
    户配置的专用于升级的 GPIO 端口是否出现规定的电平特性。应用程序是否有效的判断依
    据是:( 1)堆栈指针是否指向一个有效的位置(这个位置应当在 SRAM 里, 即指针值应当
    是 0x2xxx.xxxx); ( 2) 复位处理程序的地址是否是一个有效位置(这个位置应当在 Flash
    里, 地址应当是 0x000x.xxxx, 而且必需是偶数)。 上述两个条件都满足, 表示应用程序有
    效。如果用户没有在 BootLoader 的配置文件 bl_config.h 里配置检测 GPIO 管脚(通过
    ENABLE_UPDATE_CHECK 来配置),且应用程序有效, BootLoader 就选择执行用户应用
    程序。 反之,只要应用程序无效, 或用户要求检测 GPIO 某管脚(通常那个管脚接一个按
    钮) 且此管脚电平符合要求(一般设计成按钮按下), BootLoader 执行升级程序。(默认复
    位时 PB4 引脚为低则运行 Updater,为高则运行 Application),


  • 苦行僧,你好:

    很高兴你又回复了我的问题,但是还是感觉有很多疑问,如果用例子boot_serial,来实现我要的通过I2C的方式来实现在线固件升级,是只需要修改bl_config.h中的内容然后编译即可?还是我还需要做其他的什么东西呢?另外,那个boot_demo1是跟boot_serial是相配套使用的吗?

    您上面回复的资料是哪一呢?我手上的是一份英文的SW-TM4C-BOOTLDR-UG-2.0.1.11577,您的是这一份上面看的内容吗?

  • 我手上的资料是杭州艾研的数据手册中的一段话,数据手册太大,上传不上来,给你截图吧

  • 你好,苦行僧。

    很是感谢您又回答了我的问题,谢谢您!

    1.我觉得这份数据手册很好,我还想看看其中的其他内容,可以给我传一份吗?或者你告诉我一个地址我自己去下载。我的邮箱是yixin_shark@163.com。

    2.看来我的思路是有问题,按照你给的图片上的文字介绍,我最好还是使用给定的bootloader,然后来修改达到我的要求,这给了我一个确定的方向,真的很感谢你。

    3,我很惊讶你的社区积分那么高,肯定是大神,求交个朋友,我也是一个很有上进心的人,最近才开始做一些硬件的东西,所以感觉到很吃力。

    Best Regards

    怡心一毅。

  • 哈哈,大神不敢当,我只是接触这个芯片比你时间长一点而已。其实我也是个小小的菜鸟,这款芯片也是刚开始学习,对于你的这个问题,我也一直在思考,但是还没实践。给你这份资料的下载地址,百度好久才找到的,哈哈。一般人我不告诉他,如果你实践成功了,希望你能够共享经验。

    http://www.hpati.com/ay_competition_kit/product_35.html

  • Hello 苦行僧,

    真的很感谢您,做个这个东西都快崩溃了,目前还有一个问题就是跳转问题,我现在使用的是boot_serial例子,在bl_config.h文件中配置一些参数,还在汇编里面和一些会调用到的c函数中加了一些串口打印语句,根据打印的东西我发现很奇怪的问题,都让我开始怀疑那个start-up.s文件的执行顺序了,是按照向量表的顺序执行吧?

    目前感觉还是不能跳转到我的点灯程序(烧写到flash起始地址为0x2800),我还在想办法解决。

    我的大致思路是这样的,flash 的0地址烧写我的boot_serial,通过检测GPIO电平看是否需要升级固件程序,如果需要则进入Updater()函数与上位机通过I2C进行交流接收数据更新固件程序。如果不要升级则调用应用程序(点灯程序),目前还卡在这里,不需要升级的时候感觉跳转不过去。

    不管怎么样我都会解决这些问题的,成功了我一定跟你共享我的经验跟源代码的。

    真的很感谢你!

    Best Regards

    怡心一毅

  • 你好,苦行僧,

    我的跳转问题昨天下午晚点的时候已经得到解决,现在就是解决升级那一块的内容了。

    Regards

    怡心一毅

  • 找到一个TI LM3S升级的程序和讲解,给楼主分享下

    http://bbs.eeworld.com.cn/thread-156335-1-1.html

  • 恩,看了,很好,我自己也理解到那些东西了。真的很感谢苦行僧。

    目前我自己在写相对应于boot_serial中的updater中(通信协议)的上位机程序(跑在另外一个芯片上的程序),应该有人实现过,但是好像搜索不到参考程序,不过我自己有信心完成,要是有参考的话就更好了。

    谢谢你。

    怡心一毅

  • 我最近要在弄这块儿,遇到不少问题,能不能加扣交流下,给你发了邮件,望回复,谢谢

  • 楼主不是要分享经验么,能共享下你的经验么?

  •  你好green shark,想请教一下你的跳转问题是怎么解决的,我现在也在做bootloader,目前也是卡在这里好久了,想了N种办法都无法跳转到app去执行应用程序,希望你能分享一下你的解决方法,感激不尽~~~

  • 用官方的那个例程就可以的。直接烧官方的哪个boot。

  • 有没有链接,我用的是飞思卡尔16位芯片,不知道是不是可以借鉴

  • 你这哪儿跟哪儿呀,飞思卡尔和TI完全不一样。尤其是16位单片机