想不用跳线,也不用改变引导模式,直接进行dsp程序升级。DSP上电复位后,采用Jump to Flash引导模式,进入我的主程序,在主程序里判断是否升级,若不升级怎么进行正常程序运行,若升级则利用串口来接收升级程序的代码,接着调用API函数来对接收到的代码进行处理,把这些代码烧到FLash里。请问,这个方案可行吗?我现在是进行了一大半了,但怀疑这个方案的可行性了。谢谢!
我是的升级程序代码里是包含判断是否升级、调用API函数的。每次更新都是更新整个部分的,不仅仅是需要升级的程序啊。
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.
想不用跳线,也不用改变引导模式,直接进行dsp程序升级。DSP上电复位后,采用Jump to Flash引导模式,进入我的主程序,在主程序里判断是否升级,若不升级怎么进行正常程序运行,若升级则利用串口来接收升级程序的代码,接着调用API函数来对接收到的代码进行处理,把这些代码烧到FLash里。请问,这个方案可行吗?我现在是进行了一大半了,但怀疑这个方案的可行性了。谢谢!
我是的升级程序代码里是包含判断是否升级、调用API函数的。每次更新都是更新整个部分的,不仅仅是需要升级的程序啊。
我的升级程序代码是包含判断是否升级,调用API函数的。每次更新的都是整个部分,不仅仅是需要升级的程序啊
这个方式可行,执行烧录动作的代码需要放到RAM里面运行。本人采用这种方式烧录过2812、28335、28027都可以。上位机软件可以是SDFlash也可以是codeskin。
我是把代码拷到ram里面了,就是用#pragma CODE_SECTION(main,"ramfuncs")的形式,然后再cmd里面配置,可是擦除的时候没有返回的。感觉是把与液晶通信的那部分擦掉了,我停止运行时,通过反汇编,感觉是停止code branch的地方。我也不晓得怎么回事
我这个如果不擦flashA区的话都正常,因为我的代码存在Flash A 里面,可是要是把FlashA擦除了,就是没返回。从ram里面单独跑这部分代码是什么意思呀?我是dsp新手,好多东西都不懂,还请大神指点
FlashA擦除了,就是没返回?这里返回的是什么? 从ram里面单独跑这部分代码是和擦写有关的代码你可以放到ti的头文件例程里面运行,那些代码大部分在RAM里面运行的,每次load到DSP里面,看这样能不能正常擦写。有没有擦掉可以看Flash里面的数据,擦掉以后Flash里面全为F。
您好:
您采用这种方法成功烧写2812、28335、28027的时候,是不是用一个程序烧写另一个程序呀?前一个“程序”指已固化程序,用于实现串口烧写的时机判断、数据接收及烧写的具体实施等,该程序使用了Flash281x_API库编程算法;而后一个“程序”是用户的应用目标代码。可是前一个程序和后一个程序怎么实现跳转呀?一共就一个main函数,是后一个程序里有main函数的吧,那前一个程序没有main函数根本编译不通过,怎么烧到flash里面呢?我对这个问题纠结很长时间了,还请大神指点一下。
下位机的程序,目前有参考例程的是基于F281x的,但只要阅读datasheet,了解boot rom和FlashAPI,就可以同样实现其它芯片的操作。
TMS320F281x Boot ROM Serial Flash Programming (www.ti.com/lit/SPRAAQ2)
方法可以有两种,采用一个工程(只有一个main函数)或两个工程(有两个main函数),但都需要使用绝对地址跳转。
通过宏定义的方式使用函数指针对函数指定绝对地址(第一个类型转换是函数的返回值,其它的是函数的形式参数),如以下两个例子:
#define InitAnalogSystemClock (unsigned short (*) (unsigned short ClockDivider))0x0024021E
#define Device_Cal (void (*) (void)) 0x00240220
在源文件中使用通用方法定义该函数,然后在需要调用的源文件中,使用如下方式调用该函数:
unsigned short asysclk = (*InitAnalogSystemClock)(ACLKDIV4);
(*Device_Cal());
实际上,任何一个例程都有调用(*Device_Cal());这个函数,同时上面提供的链接文档中,也可以在摘要部分找到对应源代码的下载链接,里面也有类似的操作方式。
更通用一点的方法是(特别是当要实现在线升级程序时),将函数的跳转指定到一个Flash sector的最后部分,同时建立的工程应该有main函数,则它会自动通过该入口地址跳转到main执行。
如果还不够清楚,可以留下邮箱,我将一篇前段时间总结的文档和例程发给你。
看来是太寄希望于文档,不过建议你还是先仔细阅读并理解一下上面的回复。
核心思想都说得比较清楚了,代码看上去反而不一定更好理解,而且也只是讨论如何建立两个工程,而不是介绍串口升级的。整理后下周发给你。
串口升级这部分我目前整体思路都解决了,就差如何跳转了。我前天打电话咨询过TI技术工程师,他说我这个串口升级部分根本不可能实现,说不可能从一个程序跳转到另一个程序,因为dsp不支持多任务处理什么的。我现在急于想知道是否能跳转,不然我就得返工换方案了。你给的回复我仔细看了,TI文档里的确有提到(*Device_Cal()的,是用来在boot rom时晶振的,以及用于ADC模块调整设备特定数据的。
已经发送到你的邮箱了,请查收。
在你这个问题上,device_cal的用处不需要管,而只需要了解类似这样的调用方式可以用来实现跳转的功能。
另外,建议你去下载我第一个回复里提到的文档和例程,那与你的需求几乎完全一样。
Jingjing,
你的思路是完全正确的,我之前也以相同的思路做过concerto双核的在线升级,还加了防烧写失败功能。然后还将这个思路移植到在线升级F28027,也可以实现。
至于地址跳转的话,比如在用户程序,想跳转到升级程序,
在main之前定义一个
#define C28Update (void (*)(void))0x0013e000 //0013a000
在后再主程序中判断升级来的时候,
(*C28Update)();
如果升级完成,可以用相同的方法定义一个Boot to flash的起始地址,如_c_int00的地址,升级完后直接跳转也行。
Eric
你好 好不容易找到这篇帖子,我现在由于项目需要,也在做串口升级,可以把你整理的文档也发我一份吗?谢谢了!
大神,有人发你文档了嘛,如果有,麻烦发我一份,感激不尽 841270930@qq.com
你好,我最近也在学习不改动启动项而直接从SCI口下程序,可不可以把你总结的资料发给我一份。谢谢。