本帖最后由 huhuhu_1 于 2010-1-25 10:56 编辑
香主的主意不错,问题有些进展,情况如下:
在没有读保护时,读出的option bytes是正确的(RDP是0xA5,Data0被我使用,是0x1E,其它是0xff)。使用j-link加上读保护后,读出的option bytes,RDP是0xff,Data0也成了0xff。分析可能是j-link把整个option bytes都擦除了。
于是我在程序中加入Data0检测功能,如果发现其不是0x1e,则修改成0x1e,并在修改前后都打印出option bytes的内容。之后测试中发现在没有读保护时,Data0可以从0xff修改成0x1E,有读保护时,Data0总是0xff。
我的程序中使用到这个Data0,它引导程序加载,看来读保护后程序不能运行就是因为Data0不正常造成的。
请香主看看我的分析是否正确,如果是,那该如何在写保护后还能修改Data0、Data1???
下面是相关的代码:
int main()
{
。。。
OB_TypeDef obTmp;
obTmp = *OB; //读出选项字节,保存在临时缓冲区
if(((u8)(OB->Data0) != 0x1e) && ((u8)(OB->Data0) != 0x2d)) { //(u8*)0x1ffff804
printf("last\r\n");
printf("OB->RDP=0x%x\r\n", OB->RDP);
printf("OB->USER=0x%x\r\n", OB->USER);
printf("OB->Data0=0x%x\r\n", OB->Data0);
printf("OB->Data1=0x%x\r\n", OB->Data1);
printf("OB->WRP0=0x%x\r\n", OB->WRP0);
printf("OB->WRP1=0x%x\r\n", OB->WRP1);
printf("OB->WRP2=0x%x\r\n", OB->WRP2);
printf("OB->WRP3=0x%x\r\n", OB->WRP3);
delay1ms(200);
//FLASH_Unlock();
FLASH_EraseOptionBytes();
FLASH_ProgramOptionByteData((u32)(&(OB->Data0)), 0x1e); //0x1ffff804
//恢复其它的option bytes
FLASH_ProgramOptionByteData((u32)(&(OB->RDP)), obTmp.RDP); //0x1ffff800
FLASH_ProgramOptionByteData((u32)(&(OB->USER)), obTmp.USER); //0x1ffff802
FLASH_ProgramOptionByteData((u32)(&(OB->Data1)), obTmp.Data1); //0x1ffff806
FLASH_ProgramOptionByteData((u32)(&(OB->WRP0)), obTmp.WRP0); //0x1ffff808
FLASH_ProgramOptionByteData((u32)(&(OB->WRP1)), obTmp.WRP1); //0x1ffff80a
FLASH_ProgramOptionByteData((u32)(&(OB->WRP2)), obTmp.WRP2); //0x1ffff80c
FLASH_ProgramOptionByteData((u32)(&(OB->WRP3)), obTmp.WRP3); //0x1ffff80e
//FLASH_WaitForLastOperation(0xfff);
//FLASH_Lock();
printf("last2\r\n");
printf("OB->RDP=0x%x\r\n", OB->RDP);
printf("OB->USER=0x%x\r\n", OB->USER);
printf("OB->Data0=0x%x\r\n", OB->Data0);
printf("OB->Data1=0x%x\r\n", OB->Data1);
printf("OB->WRP0=0x%x\r\n", OB->WRP0);
printf("OB->WRP1=0x%x\r\n", OB->WRP1);
printf("OB->WRP2=0x%x\r\n", OB->WRP2);
printf("OB->WRP3=0x%x\r\n", OB->WRP3);
delay1ms(200);
NVIC_GenerateSystemReset();
}
printf("next\r\n");
printf("OB->RDP=0x%x\r\n", OB->RDP);
printf("OB->USER=0x%x\r\n", OB->USER);
printf("OB->Data0=0x%x\r\n", OB->Data0);
printf("OB->Data1=0x%x\r\n", OB->Data1);
printf("OB->WRP0=0x%x\r\n", OB->WRP0);
printf("OB->WRP1=0x%x\r\n", OB->WRP1);
printf("OB->WRP2=0x%x\r\n", OB->WRP2);
printf("OB->WRP3=0x%x\r\n", OB->WRP3);
delay1ms(200);
。。。。。。。
} |