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

Verwendung von stm8s003f3.stm8 Ausleseschutz (ROP) Einstellung Option Byte im Code

Hinzufügen dieser Code Hauptinitialisierung, Code Protect (ROP) ist Einstellung, aber meine Anwendung Code funktioniert nicht.

Wenn Optionsbyte über IAR- oder ST Visual Programmer-Optionsbyte-Register gesetzt wird, funktionieren Anwendungscode und Code Protect (ROP) ordnungsgemäß.

Ich muss ROP in Code festlegen.

Antwort

0

habe ich die folgende Funktion:

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

Ich habe versucht, diesen Code, aber es ist das gleiche Ergebnis. Code-Schutz einstellen, aber Code nicht runnig. – mryldz

+0

Was ist mit Interrupt? Deaktivieren Sie den Interrupt, bevor Sie diese Funktion aufrufen? Verwenden Sie rim() um Interrupts zu aktivieren und sim() um Interrupts zu deaktivieren: sim(); Read_Protect_Flash(); Felge(); –

+0

Ich habe es versucht und es funktioniert nicht. Aber wenn ich den Code zum ersten Mal kompiliere, funktioniert der Debugger einmal. Wenn ich die Funktion als 'sim(); Read_Protect_Flash(); rim(); 'code wartet auf diese Zeile' flagstatus = (u8) (FLASH-> IAPSR & (FLASH_IAPSR_EOP | FLASH_IAPSR_WR_PG_DIS)); 'in _stm8_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; 

Wenn ich es verwenden Problem gelöst ist. ROP ist aktiviert und Code wird ausgeführt. Dies kann jedoch ein anderes Problem verursachen, das unvorhersehbar ist.

Da in der Regel, während OPT0 Einstellung über aktuelle Funktion (FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);) wartet auf Fahnen (assert_param(IS_OPTION_BYTE_ADDRESS_OK(Address));*((NEAR u8*)Address) = FLASH_CLEAR_BYTE; *((NEAR u8*)(Address + 1)) = FLASH_SET_BYTE;)

Nun entferne ich diese Funktion nutzen OPT->OPT0=0xAA;, so eine andere Frage, was nach dieser Codeänderung geschehen ist.

Verwandte Themen