最近做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();
写是肯定写进去,因为我有对扇区读测试。
初步分析是中断向量问题,这些到底是怎么弄的,望高手指点呀!
此帖出自
小平头技术问答
__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
}
一周热门 更多>