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