我在使用一种 通过应用来烧写flash的功能,在应用程序中运行 flash API函数,然后将程序烧录到代码区,测试是 flash erase后,程序就卡死了。
硬件平台是F2812, 用来编程的 flash函数定义在RAM中,在main()函数中调用,请问这种方式还需要注意什么? 按照手册上的描述,只要编程函数运行在ram中,可以对任意的flash区域进行编程,可是实际中在对 codeflash区域编程失败,单独定义的一款dataflash可以实现。。。
jiuqing zhang1:
补充说明,我的主函数main()是在 flash中运行的,烧写函数在main()中调用,烧写函数本身在RAM段中加载; 我希望通过这个烧写函数将代码段直接覆盖我的整个flash代码区域。
我在使用一种 通过应用来烧写flash的功能,在应用程序中运行 flash API函数,然后将程序烧录到代码区,测试是 flash erase后,程序就卡死了。
硬件平台是F2812, 用来编程的 flash函数定义在RAM中,在main()函数中调用,请问这种方式还需要注意什么? 按照手册上的描述,只要编程函数运行在ram中,可以对任意的flash区域进行编程,可是实际中在对 codeflash区域编程失败,单独定义的一款dataflash可以实现。。。
Blake Ma:
回复 jiuqing zhang1:
您好,
的确,Flash API 函数的调用必须在 RAM 中执行。对于 Flash API 函数具体的调用方法,可以参考 ControlSUITE 中其他型号的示例代码,例如 flash_f28069 ;主要有以下几个步骤:
(1)在 .cmd 文件中定义代码搬移的相应区域:
(2)定义函数 Example_CallFlashAPI(),其中包含 Flash API 操作;将其地址空间定义在 ramfuncs 中:
(3)在 main() 中调用 Example_CallFlashAPI() 函数之前,需要先执行代码搬移函数,将在 ramfuncs 中定义的代码从 Flash 搬移到 RAM 中,此时Example_CallFlashAPI() 才真正被搬移至 RAM 中:
(4)最后,执行 Example_CallFlashAPI() 函数,在其中调用相应的 Flash API 函数:
请参考示例代码,对比您工程中的相应操作是否一致?
我在使用一种 通过应用来烧写flash的功能,在应用程序中运行 flash API函数,然后将程序烧录到代码区,测试是 flash erase后,程序就卡死了。
硬件平台是F2812, 用来编程的 flash函数定义在RAM中,在main()函数中调用,请问这种方式还需要注意什么? 按照手册上的描述,只要编程函数运行在ram中,可以对任意的flash区域进行编程,可是实际中在对 codeflash区域编程失败,单独定义的一款dataflash可以实现。。。
10#:
既然你是使用F2812,那么参考这个文档吧:TMS320F281x Boot ROM Serial Flash Programming
里面包含了详细说明并可以在概要部分下载对应的源代码。
你的main()所在的flash区域如果也要被擦除或编程的话,那肯定是会出问题的,另外记得要关闭中断,具体要求在FlashAPI的手册里都有说明。
我在使用一种 通过应用来烧写flash的功能,在应用程序中运行 flash API函数,然后将程序烧录到代码区,测试是 flash erase后,程序就卡死了。
硬件平台是F2812, 用来编程的 flash函数定义在RAM中,在main()函数中调用,请问这种方式还需要注意什么? 按照手册上的描述,只要编程函数运行在ram中,可以对任意的flash区域进行编程,可是实际中在对 codeflash区域编程失败,单独定义的一款dataflash可以实现。。。
jiuqing zhang1:
回复 Blake Ma:
感谢回复,以上的(1)(2)(3)(4)都测试过, 当擦写 编程自定义的一块flash时没有问题,这几段flash没有存储任何代码和数据,说明flash api的调用应该没有问题。
但是当擦写 编程 代码段的flash时,没有成功,怀疑的原因有以下: ①因为是在一个flash函数里面调用了 ramfunc 来编程,擦除调用函数本身是否属于违法操作 ②falsh的编程需要 配置PLL以及cpu scaltor,和call back ptr,这些都是全局变量,flash的编程是否需要将这些数据也copy到 ram中去,这种在代码如何实现?
我在使用一种 通过应用来烧写flash的功能,在应用程序中运行 flash API函数,然后将程序烧录到代码区,测试是 flash erase后,程序就卡死了。
硬件平台是F2812, 用来编程的 flash函数定义在RAM中,在main()函数中调用,请问这种方式还需要注意什么? 按照手册上的描述,只要编程函数运行在ram中,可以对任意的flash区域进行编程,可是实际中在对 codeflash区域编程失败,单独定义的一款dataflash可以实现。。。
10#:
回复 jiuqing zhang1:
通常的做法 — 对于需要在线擦除并编程:
将实现该功能的代码(也即你现在调用FlashAPI的代码,通常称为用户bootloader),放在一个flash sector,运行时全部copy到RAM运行,包括初始化函数,通讯传输数据的代码,memcpy函数等都不要在flash上运行,使用的变量不要与应用程序的放在一起。
自己的应用程序放在剩下的其它flash sector,可由用户bootloader任意操作。
对比一下上面提到的文档参考看看吧。
我在使用一种 通过应用来烧写flash的功能,在应用程序中运行 flash API函数,然后将程序烧录到代码区,测试是 flash erase后,程序就卡死了。
硬件平台是F2812, 用来编程的 flash函数定义在RAM中,在main()函数中调用,请问这种方式还需要注意什么? 按照手册上的描述,只要编程函数运行在ram中,可以对任意的flash区域进行编程,可是实际中在对 codeflash区域编程失败,单独定义的一款dataflash可以实现。。。
jiuqing zhang1:
回复 10#:
我自定义一个boot()子函数,然后把这个子函数加载到RAM 空间去运行,然后进行编程,这种调用不允许么? 如果不允许的话,那么有什么办法可以在reset后 运行一个独立的函数,这个独立函数运行后再跳到main()里面?
另外, 在通过 Hex2000得到HEX文件后,包含了地址信息,TI有工具可以把HEX文件改成 BIN文件么?
我在使用一种 通过应用来烧写flash的功能,在应用程序中运行 flash API函数,然后将程序烧录到代码区,测试是 flash erase后,程序就卡死了。
硬件平台是F2812, 用来编程的 flash函数定义在RAM中,在main()函数中调用,请问这种方式还需要注意什么? 按照手册上的描述,只要编程函数运行在ram中,可以对任意的flash区域进行编程,可是实际中在对 codeflash区域编程失败,单独定义的一款dataflash可以实现。。。
Blake Ma:
回复 jiuqing zhang1:
请问您要擦除自身的代码段的目的是什么?
我在使用一种 通过应用来烧写flash的功能,在应用程序中运行 flash API函数,然后将程序烧录到代码区,测试是 flash erase后,程序就卡死了。
硬件平台是F2812, 用来编程的 flash函数定义在RAM中,在main()函数中调用,请问这种方式还需要注意什么? 按照手册上的描述,只要编程函数运行在ram中,可以对任意的flash区域进行编程,可是实际中在对 codeflash区域编程失败,单独定义的一款dataflash可以实现。。。
jiuqing zhang1:
回复 Blake Ma:
我是为了在线的代码升级,嵌入式的方式实现,因而需要自定义boot程序,将升级代码烧录到当前的代码区,这种实现方式和CKFA(SCI的BOOT)类似,只不过目前函数头 main()还是在flash中(不想改变原有的程序和硬件结构),
我的问题在于: flash的API调用测过了,没有问题;但是这个boot的结果不对,原因可能就是 main()在falsh中运行这个限制,
我在使用一种 通过应用来烧写flash的功能,在应用程序中运行 flash API函数,然后将程序烧录到代码区,测试是 flash erase后,程序就卡死了。
硬件平台是F2812, 用来编程的 flash函数定义在RAM中,在main()函数中调用,请问这种方式还需要注意什么? 按照手册上的描述,只要编程函数运行在ram中,可以对任意的flash区域进行编程,可是实际中在对 codeflash区域编程失败,单独定义的一款dataflash可以实现。。。
jiuqing zhang1:
回复 10#:
10#
通常的做法 — 对于需要在线擦除并编程:
将实现该功能的代码(也即你现在调用FlashAPI的代码,通常称为用户bootloader),放在一个flash sector,运行时全部copy到RAM运行,包括初始化函数,通讯传输数据的代码,memcpy函数等都不要在flash上运行,使用的变量不要与应用程序的放在一起。
自己的应用程序放在剩下的其它flash sector,可由用户bootloader任意操作。
对比一下上面提到的
1.memcopy不在flash运行会引起矛盾,因为加载到ram中需要调用memcopy,函数不能修改自己的调用地址
2 将bootloader放到一个单独的sector可以做到,但是这对于应用升级来说没有区别,除非在硬件启动和函数调用后,手动修改起始运行的PC指针; 假设这样去做,那么要如何实现指针的跳转,
3.如何将特定的变量和应用程序不放在一起,变量本身应该都是在RAM存储的,如果定义时没有初始化的话,调用过程应该是和flash无关的,还有必要做一些调整么?
4,因为代码从内部flash运行,所以不改变硬件BOOT过程的话,默认上电后,进入的都是falsh里面的main()函数首地址,如果自定义boot函数,只能在flash中调用,
我在使用一种 通过应用来烧写flash的功能,在应用程序中运行 flash API函数,然后将程序烧录到代码区,测试是 flash erase后,程序就卡死了。
硬件平台是F2812, 用来编程的 flash函数定义在RAM中,在main()函数中调用,请问这种方式还需要注意什么? 按照手册上的描述,只要编程函数运行在ram中,可以对任意的flash区域进行编程,可是实际中在对 codeflash区域编程失败,单独定义的一款dataflash可以实现。。。
jiuqing zhang1:
回复 Blake Ma:
Blake Ma
请问您要擦除自身的代码段的目的是什么?
TI中文支持网



