Part Number:TMS320F280049C-Q1
Hi TI团队:
我在做软件调试时,注释了一个未被调用的函数代码,软件编译后下载到控制板调试,程序运行到库函数Fapi_setActiveFlashBank(Fapi_FlashBank0)(库版本V1.56)后就进入到interrupt void USER1_ISR(void),报出故障。我恢复注释掉的函数(也没有调用过)代码后,软件调试可以正常运行,也没有进nterrupt void USER1_ISR(void)中断。
请问有Fapi_setActiveFlashBank()函数的源码或者介绍的文档可以提供查看?我用的编译器版本是CCS8.3,这个版本可以设置未调用函数编译不连接?
Yale Li:
您好,TMS320F280049 Flash API Reference Guide (Rev. A)中的第2章有相关描述,您先看一下。
,
keysfine:
您好,
这个文档我看过了,里面主要是函数的参数定义。看上去问题是我定义的一个未调用的函数,库函数Fapi_setActiveFlashBank()运行时出现了未知的错误导致进入了Trap中断,还没找到原因。请问F280049C有比V1.56更高的版本的Flash lib?
,
Yale Li:
目前V1.56应该就是最高版本。
被注释掉的函数是您定义的?
,
keysfine:
是一个空函数,里面没有代码,只要注释掉,运行Fapi_setActiveFlashBank()就会进trap
,
Yale Li:
方便把您的代码发上来看一下吗?
,
keysfine:
不好意思,系统加密了,这边只有我这边电脑能看
,
Yale Li:
我帮您咨询一下资深工程师。
,
Yale Li:
不知道您是否可以单独将map文件(正常工作时的和非正常工作时的)上传上来?
还有您调用Flash API的时候,程序是从RAM中运行的吗?
,
keysfine:
Project_F280049C_FlashTrap.mapProject_F280049C_Norm.map
您好,附件为正常运行和进Trap的map文件,程序是从flash启动的
,
Yale Li:
好的。有了结果我会及时回复您。
,
Yale Li:
您好,您不应从Flash编程和擦除操作所针对的同一bank执行Flash API。您可以从一个Flash bank执行Flash API针对另一个Flash bank进行flash操作,或者从RAM执行Flash API。
并且这款设备在ROM中有Flash API,您也可以使用它。无需在Flash或RAM中分配空间给Flash API。
如果您还有进一步的问题,这篇有关于C2000设备Flash API使用的FAQ或许会帮助到您:
https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/951668/faq-faq-on-flash-api-usage-for-c2000-devices
,
keysfine:
好的,谢谢
,
Yale Li:
很高兴能帮助到您
,
keysfine:
您好,补充一个问题,望帮助解答一下,请问Flash lib中调用Fapi_setActiveFlashBank(Fapi_FlashBank0)进入interrupt void USER1_ISR(void)中断的路径有哪几个?有关于内存对齐或者程序操作Flash寄存器等待超时进入这个中断的情况?
,
Yale Li:
您好,根据TMS320F280049 Flash API Reference Guide (Rev. A)对于Fapi_setActiveFlashBank的功能描述来看,这个函数应该不会导致进入interrupt void USER1_ISR(void),而是后续的一些操作。
所以您的意思能否理解为使用Flash API对Flash进行操作时,在哪些情况下会导致程序进入interrupt void USER1_ISR(void)?
,
keysfine:
是这个意思,我调试下来看,汇编step也可以正常运行,放开就会进中断了
,
Yale Li:
好的,我咨询之后给您答复。
,
Yale Li:
请问如果不使用Flash API的话就正常运行吗?
您使用的是ROM Flash API?还是将Flash API嵌入到程序中然后从RAM中运行?
,
keysfine:
您好,不适用flash API程序可以正常运行的,调用flash 在Fapi_setActiveFlashBank()这个设置会进Trap。我是把Flash API嵌入到程序中,copy到RAM中,然后从RAM中运行
,
Yale Li:
好的,有结果我会及时回复您。
,
Yale Li:
您可以提供一下相关的linker command文件和map文件吗?
您为什么不使用ROM Flash API呢?
,
keysfine:
ROM flash API这个没有用,附件是我现在工程的map文件和linker command 文件,map包含能正常工作和进trap的版本,请帮看一下问题,谢谢
Project_280049C_Trap.map280049C_FLASH_lnk.cmd.txt
MEMORY { PAGE 0 :/* BEGIN is used for the "boot to SARAM" bootloader mode*//*0x80000 is also used as the boot address of the Bootloader.The address of APP BEGIN is also 0x80000 and the address of the program with bootloader is 0x86002*/BEGIN: origin = 0x080000, length = 0x000002RAMM0: origin = 0x0000F5, length = 0x00030BRAMLS0: origin = 0x008000, length = 0x000C00RAMLS3: origin = 0x009800, length = 0x000800RAMLS4: origin = 0x00A000, length = 0x002000RESET: origin = 0x3FFFC0, length = 0x000002/* Flash sectors *//* BANK 0 Bootloader Firmware*///FLASH_BANK0_SEC0: origin = 0x080002, length = 0x000FFE /* on-chip Flash *///FLASH_BANK0_SEC1: origin = 0x081000, length = 0x001000 /* on-chip Flash *///FLASH_BANK0_SEC2: origin = 0x082000, length = 0x001000 /* on-chip Flash *///FLASH_BANK0_SEC3: origin = 0x083000, length = 0x001000 /* on-chip Flash *///FLASH_BANK0_SEC4: origin = 0x084000, length = 0x001000 /* on-chip Flash *///FLASH_BANK0_SEC5: origin = 0x085000, length = 0x001000 /* on-chip Flash *///FLASH_BANK0_SEC6: origin = 0x086000, length = 0x001000 /* on-chip Flash *///FLASH_BANK0_SEC7: origin = 0x087000, length = 0x001000 /* on-chip Flash *///FLASH_BANK0_SEC8: origin = 0x088000, length = 0x001000 /* on-chip Flash *///FLASH_BANK0_SEC9: origin = 0x089000, length = 0x001000 /* on-chip Flash *///FLASH_BANK0_SEC10 : origin = 0x08A000, length = 0x001000 /* on-chip Flash *///FLASH_BANK0_SEC11 : origin = 0x08B000, length = 0x001000 /* on-chip Flash *///FLASH_BANK0_SEC12 : origin = 0x08C000, length = 0x001000 /* on-chip Flash *///FLASH_BANK0_SEC13 : origin = 0x08D000, length = 0x001000 /* on-chip Flash */FLASH_BANK0_SEC6_SEC613 : origin = 0x086002, length = 0x007FFEFLASH_BANK0_SEC14 : origin = 0x08E000, length = 0x001000 /* on-chip Flash */FLASH_BANK0_SEC15 : origin = 0x08F000, length = 0x001000 /* on-chip Flash *//* BANK 1 */FLASH_BANK1_SEC0: origin = 0x090000, length = 0x001000 /* on-chip Flash */FLASH_BANK1_SEC1: origin = 0x091000, length = 0x001000 /* on-chip Flash */FLASH_BANK1_SEC2: origin = 0x092000, length = 0x001000 /* on-chip Flash */FLASH_BANK1_SEC3: origin = 0x093000, length = 0x001000 /* on-chip Flash */FLASH_BANK1_SEC4: origin = 0x094000, length = 0x001000 /* on-chip Flash */FLASH_BANK1_SEC5: origin = 0x095000, length = 0x001000 /* on-chip Flash */FLASH_BANK1_SEC6: origin = 0x096000, length = 0x001000 /* on-chip Flash */FLASH_BANK1_SEC7: origin = 0x097000, length = 0x001000 /* on-chip Flash */FLASH_BANK1_SEC8: origin = 0x098000, length = 0x001000 /* on-chip Flash */FLASH_BANK1_SEC9: origin = 0x099000, length = 0x001000 /* on-chip Flash */FLASH_BANK1_SEC10 : origin = 0x09A000, length = 0x001000 /* on-chip Flash */FLASH_BANK1_SEC11 : origin = 0x09B000, length = 0x001000 /* on-chip Flash */FLASH_BANK1_SEC12 : origin = 0x09C000, length = 0x001000 /* on-chip Flash */FLASH_BANK1_SEC13 : origin = 0x09D000, length = 0x001000 /* on-chip Flash */FLASH_BANK1_SEC14 : origin = 0x09E000, length = 0x001000 /* on-chip Flash */FLASH_BANK1_SEC15 : origin = 0x09F000, length = 0x001000 /* on-chip Flash */PAGE 1 :BOOT_RSVD: origin = 0x000002, length = 0x0000F3/* Part of M0, BOOT rom will use this for stack */RAMM1: origin = 0x000400, length = 0x000400/* on-chip RAM block M1 *///RAMLS1: origin = 0x008800, length = 0x000800RAMLS1: origin = 0x008C00, length = 0x000400RAMLS2: origin = 0x009000, length = 0x000800RAMLS5: origin = 0x00A800, length = 0x000800RAMLS6: origin = 0x00B000, length = 0x000800RAMLS7: origin = 0x00B800, length = 0x000800RAMGS0: origin = 0x00C000, length = 0x002000RAMGS1: origin = 0x00E000, length = 0x002000RAMGS2: origin = 0x010000, length = 0x002000RAMGS3: origin = 0x012000, length = 0x002000CLA1_MSGRAMLOW: origin = 0x001480, length = 0x000080CLA1_MSGRAMHIGH: origin = 0x001500, length = 0x000080 }SECTIONS {.cinit: > FLASH_BANK1_SEC0,PAGE = 0, ALIGN(4).text: > FLASH_BANK0_SEC6_SEC613,PAGE = 0, ALIGN(4)codestart: > BEGINPAGE = 0, ALIGN(4).stack: > RAMM1PAGE = 1.switch: > FLASH_BANK1_SEC1,PAGE = 0, ALIGN(4).pinit: > FLASH_BANK1_SEC4,PAGE = 0,ALIGN(4).ebss: >>RAMLS1 | RAMLS2 | RAMLS5 | RAMLS6 | RAMLS7 | RAMGS0 | RAMGS1 | RAMGS2 | RAMGS3 ,PAGE = 1.esysmem: > RAMLS6,PAGE = 1.cio: > RAMLS5,PAGE = 1.econst: > FLASH_BANK1_SEC5,PAGE = 0, ALIGN(4)ramgs0: > RAMGS0,PAGE = 1ramgs1: > RAMGS1,PAGE = 1.reset: > RESET,PAGE = 0, TYPE = DSECT /* not used, *//* CLA specific sections */Cla1Prog: LOAD = FLASH_BANK0_SEC14,RUN = RAMLS0,LOAD_START(_Cla1ProgLoadStart),RUN_START(_Cla1ProgRunStart),LOAD_SIZE(_Cla1ProgLoadSize),PAGE = 0, ALIGN(4)#if(1)SFRA_F32_Data: > RAMLS5, ALIGN = 64, PAGE = 1FPUmathTables: > FLASH_BANK1_SEC6,PAGE =0 #endifCla1ToCpuMsgRAM: > CLA1_MSGRAMLOW,PAGE = 1CpuToCla1MsgRAM: > CLA1_MSGRAMHIGH,PAGE = 1/* copy F021_API_F28004x_FPU32.lib to RAM, and RAMLS4 add to 0x2000kW*/GROUP{.TI.ramfunc{-l ../CSW_CODE/FlashDriverslib/lib/F021_API_F28004x_FPU32.lib}} LOAD = FLASH_BANK0_SEC15,RUN = RAMLS4,LOAD_START(_RamfuncsLoadStart),LOAD_SIZE(_RamfuncsLoadSize),LOAD_END(_RamfuncsLoadEnd),RUN_START(_RamfuncsRunStart),RUN_SIZE(_RamfuncsRunSize),RUN_END(_RamfuncsRunEnd),PAGE = 0, ALIGN(4).scratchpad: > RAMLS1,PAGE = 1.bss_cla: > RAMLS1,PAGE = 1Cla1DataRam: > RAMLS2,PAGE = 1.const_cla: LOAD = FLASH_BANK1_SEC7,RUN = RAMLS3,RUN_START(_Cla1ConstRunStart),LOAD_START(_Cla1ConstLoadStart),LOAD_SIZE(_Cla1ConstLoadSize),PAGE = 0, ALIGN(4) }/* //=========================================================================== // End of file. //=========================================================================== */8475.Project_F280049C_Norm.map
,
Yale Li:
好的,收到。
我们比较好奇您不用ROM Flash API的原因。使用ROM Flash API或许不会出现类似的问题。
,
keysfine:
好的,谢谢。我这边使用ROM Flash API看一下,前面因为工程建立就使用的flash API,没问题不会主动去修改
,
Yale Li:
好的,了解了。
,
Yale Li:
和您确认一下,两个map文件都是用这个cmd文件生成的吗?
您的代码中有擦除Flash API所在的flash sectors吗?
,
keysfine:
您好,两个MAP都是这个CMD生成的,代码里只是注释了这一个一个函数:InitCan_commom_280049()的区别。没有执行过擦除flash步骤
,
Yale Li:
keysfine 说:InitCan_commom_280049()
这个函数是您自己定义的吗?我没有在API中找到这个函数。
如果是调用的方便指一下路吗?
如果是您自己定义的,能否简单描述一下该函数做了哪些处理?
,
keysfine:
您好,这个函数定义了没有调用过,里面没有代码,我换用一个别的名称也试过,结果是一样的:删除或者注释掉一个函数就在激活Blank状态设置中进Trap,不注释或者新加一个函数(无论有无调用)都可以正常运行代码
,
Yale Li:
keysfine 说:激活Blank状态设置中
您的意思是,进Trap的时候,目标Flash还会显示处于Blank状态?也就是被擦除?
,
keysfine:
不是这个意思,我的程序在运行Fapi_setActiveFlashBank()会进入trap
,
Yale Li:
您在调用任何flash API函数之前有调用memcpy()这个函数吗?
您有使用CCS flash plugin或其它工具将这些代码装载到flash中吗?
,
keysfine:
调用flash API函数之前调用过memcpy(),这个会对flash驱动产生什么影响?第二点没有,我是直接用CCS下载的
,
Yale Li:
您可以对程序进行步进调试吗?可以找到是哪个指令导致程序进入Trap的吗?
,
keysfine:
您好,对Flash驱动汇编我使用步进可以正常运行,我猜测可能是因为延时或者状态反馈超时导致的
,
keysfine:
您好,我在Flash API手册https://www.ti.com.cn/cn/lit/ug/spnu628a/spnu628a.pdf 看到一个描述:
请问这个描述的操作频率和等待状态我在什么地方可以查到更多细节?
,
Yale Li:
请参考TMS320F28004x 微控制器 datasheet (Rev. F)第80页7.9.4 Flash Parameters
,
keysfine:
您好,问题已经解决了,我在工程里面把F021_ROM_API_F28004x_FPU32.lib和F021_API_F28004x_FPU32.lib都编译链接了,保留F021_ROM_API_F28004x_FPU32.lib后,程序正常运行。
非常感谢您的帮助!
,
Yale Li:
不客气,您的问题解决了就好