2017-09-15 66 views
0
FLASH_Unlock(FLASH_MEMTYPE_DATA); 
      if(FLASH_ReadOptionByte(0x4800)!=0xaa) 
    { 
    FLASH_ProgramOptionByte(0x4800, 0xaa);  
    } 
    FLASH_Lock(FLASH_MEMTYPE_DATA);  

使用stm8s003f3。stm8代碼中讀出保護(ROP)設置選項字節

添加這些代碼主要初始化,代碼保護(ROP)設置,但我的應用程序代碼不起作用。

如果通過IAR或ST可視編程器選項字節選項卡設置選項字節,則應用程序代碼和代碼保護(ROP)都工作正常。

我需要在代碼中設置ROP。

回答

0

我用下面的功能:

void Read_Protect_Flash(void) 
{ 
    FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD); 
    FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);  
    while(FLASH_ReadOptionByte(0x4800) != 0xAA) 
    { 
     FLASH_Unlock(FLASH_MEMTYPE_DATA); 

     FLASH_EraseOptionByte(0x4800); 
     FLASH_ProgramOptionByte(0x4800, 0xAA); 

     FLASH_Lock(FLASH_MEMTYPE_DATA); 
    } 
} 
+0

我試過這些代碼,但它是相同的結果。設置代碼保護但代碼不運行。 – mryldz

+0

中斷怎麼辦?調用此函數之前,您是否禁用中斷? 使用rim()來啓用中斷,sim()來禁止中斷: sim(); Read_Protect_Flash(); rim(); –

+0

我試過了,它不起作用。但是,當我第一次編譯代碼時,調試器只工作一次。當我把這個函數稱爲sim(); Read_Protect_Flash(); ();(';在_stm8_flash.c_中的代碼); flag(std8_flash.c_ – mryldz

0
FLASH_Unlock(FLASH_MEMTYPE_DATA); 

FLASH->CR2 |= FLASH_CR2_OPT; 
FLASH->NCR2 &= (u8)(~FLASH_NCR2_NOPT); 

OPT->OPT0=0xAA; 

FLASH->CR2 &= (u8)(~FLASH_CR2_OPT); 
FLASH->NCR2 |= FLASH_NCR2_NOPT; 

當我使用它的問題就解決了。 ROP已啓用且代碼正在運行。但是這可能會導致另一個難以預測的問題。

因爲通常情況下,當通過電流功能(FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);)等待標誌(assert_param(IS_OPTION_BYTE_ADDRESS_OK(Address));*((NEAR u8*)Address) = FLASH_CLEAR_BYTE; *((NEAR u8*)(Address + 1)) = FLASH_SET_BYTE;)設置OPT0

現在我刪除此功能使用OPT->OPT0=0xAA;,所以另一個問題是什麼將這個代碼更改後發生。