LPC1754 IAP 超级终端下程序不运行???

2019-03-25 20:21发布

最近做IAP升级,但是一直觉得程序下进去了(0x10000起的地址),但就是不运行新程序。我把写Flash的地方贴出:      // 进行 IAP 操作      #define APP_2_ADDR 0x10000      (xPackSize 大小为1024)     (&tData[3] 是超级彖端的有限数据首地址)

     zyIrqDisable();
     ProgramPage(APP_2_ADDR+(RecPacketNum-1)*xPackSize, xPackSize, &tData[3]);
     RecPacketNum++;
     zyIrqEnable(); 写是肯定写进去,因为我有对扇区读测试。 初步分析是中断向量问题,这些到底是怎么弄的,望高手指点呀! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
BigLee1986
2019-03-26 07:24
我把这两个子函数贴出来,看是不是哪里错了
__asm void BootJump(u32 address)
{
        LDR SP, [R0]                // Load new stack pointer address
        LDR PC, [R0, #4]        // Load new program counter address
}

__asm s32 zyIrqDisable(void)
{
        CPSID   I
        MOV     R0, #0
        BX      LR
}

__asm s32 zyIrqEnable(void)
{
        CPSIE   I
        MOV     R0, #0
        BX      LR
}

u16 ProgramPage(u32 adr, u32 sz, u8 *buf)
{
        u32 n;

#if SET_VALID_CODE != 0    // Set valid User Code Signature
        if(adr == 0)    // Check for Interrupt Vectors
        {
                n =  *((u32 *)(buf + 0x00)) +        // Reset Vector
                        *((u32 *)(buf + 0x04)) +        // Undefined Instruction Vector
                        *((u32 *)(buf + 0x08)) +        // Software Interrupt Vector
                        *((u32 *)(buf + 0x0C)) +        // Prefetch Abort Vector
                        *((u32 *)(buf + 0x10)) +        // Data Abort Vector
                        *((u32 *)(buf + 0x14)) +        // IRQ Vector
                        *((u32 *)(buf + 0x18));                // FIQ Vector
                *((u32 *)(buf + 0x1C)) = 0 - n;        // Signature at Reserved Vector
        }
#endif

        n = GetSecNum(adr);        // Get Sector Number

        IAP.cmd    = 50;        // Prepare Sector for Write
        IAP.par[0] = n;        // Start Sector
        IAP.par[1] = n;        // End Sector
        IAP_Call(&IAP.cmd, &IAP.stat);                // Call IAP Command
        if(IAP.stat)
        {
                return (1);        // Command Failed
        }

        IAP.cmd    = 51;        // Copy RAM to Flash
        IAP.par[0] = adr;        // Destination Flash Address
        IAP.par[1] = (u32)buf;        // Source RAM Address
        IAP.par[2] = sz;        // Fixed Page Size
        IAP.par[3] = CCLK;                // CCLK in kHz
        IAP_Call(&IAP.cmd, &IAP.stat);                // Call IAP Command
        if(IAP.stat)
        {
                return (1);        // Command Failed
        }

        return (0);          // Finished without Errors
}

一周热门 更多>