TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320F280049: FLASH写入数据后无法进入主函数

Part Number:TMS320F280049

F280049的GPIO24和GPIO32都配置为外部上拉,BOOT方式从FLAH启动。软件相关配置如下:

1、CMD文件:

MEMORY
{
    PAGE 0 :
    /* BEGIN is used for the "boot to Flash" bootloader mode */

    BEGIN : origin = 0x080000, length = 0x000002
    FLASHA : origin = 0x098000, length = 0x008000    FLASHNORMAL : origin = 0x097FFC, length = 0x000002
    FLASHFLAG : origin = 0x097FFE, length = 0x000001
    FLASH_BANK0_BANK1 : origin = 0x081000, length = 0x016FFC

}

SECTIONS
{
    codestart : > BEGIN, PAGE = 0, ALIGN(4)
    flashflag : > FLASHFLAG PAGE = 0
    Flash28Funcs : > FLASHA PAGE = 0
    normalfuncs : > FLASHNORMAL PAGE = 0

}

2、CodeStartBranch.asm文件:

.sect "flashflag"
.WORD 55FFH

.ref _c_int00
.global code_start
.global _MainSwitch
.sect "normalfuncs"
LB _c_int00

.sect "codestart"
code_start:
LB _MainSwitch

3、在进入MAIN函数之前,有一个选择函数MainSwitch:

#pragma CODE_SECTION(MainSwitch, "Flash28Funcs");
void MainSwitch(void)
{
     // 完成c运行环境初始化
    asm(" MOV @SP,#0x0000");
    asm(" SPM 0");
    asm(" SETC OBJMODE");
    asm(" CLRC AMODE");
    asm(" SETC M0M1MAP");
    asm(" CLRC PAGE0");
    asm(" SETFLG RNDF32=1");
    asm(" MOVW DP,#0x0000");
    asm(" CLRC OVM");
    asm(" ASP");

    if(*((Uint16 *) 0x097FFE) == 0x55FF) 
   {
        asm(" LB 097FFCH");   //跳转到
   }
   else if(*((Uint16 *) 0x097FFE) == 0x5500)
   {
        asm(" LB 097FFCH");
   }
   else
   {
        asm(" LB 097FFCH");
   }

}

说明:

1、BEGIN 定义为boot to Flash地址,该地址存放了一条跳转指令:LB _MainSwitch,跳转到MainSwitch函数,该函数存放到Flash28Funcs区域。

2、在MainSwitch函数中有if-else选择语句,根据FALSH地址 0x097FFE(命名为FLASHFLAG )的数据进行选择,在该测试函数中,3种条件的处理方式都一样,即执行一条跳转指令:asm(" LB 097FFCH"),跳转到地址0x097FFC(命名为FLASHNORMAL )。

3、FLASHNORMAL 定义为0x097FFC地址,该地址存放了一条跳转指令:LB _c_int00,执行c_int00后会自动跳转到Main函数入口地址。

4、在主函数里管看门狗执行FlagProgram函数,执行完后开看门狗,但不喂狗,看门狗溢出后重启,如果在0x097FFE处写0x55FF,重启后能重新进入主函数;如果在0x097FFE处写0x5500,重启后不能进入主函数,DSP断电再上电也无法进入主函数,但通过CCS的Memory Browser查看0x097FFE的数据已经为0x5500;

#pragma CODE_SECTION(FlagProgram, "Flash28Funcs");
void FlagProgram(void)
{

    Uint32 *pFlashAddr = (Uint32 *)0x097FFE; 
    Uint16 Data = 0x5500;
    //调用API函数写5500H到0x097FFE
    Drv_Flash_Program((Uint32 *)pFlashAddr,&Data,1);

}

问题:设计思路是在MainSwitch函数中有if-else选择语句,不管0x097FFE的数据是何值,都是跳转到0x097FFC,最终都会跳转到主函数入口。但实际测试情况不是这么回事。请问是什么原因?

烧录代码后的Memory

执行FlagProgram函数后的Memory

Green Deng:

你好,看了一下你的问题,感觉还是建议你直接升级一下E2E吧。那边应该有在代码运行机制方面更专业的TI工程师可以帮助你处理这个问题:e2e.ti.com/…/c2000-microcontrollers-forum

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F280049: FLASH写入数据后无法进入主函数
分享到: 更多 (0)