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

Utilisation de stm8s003f3. En ajoutant l'initialisation principale du code, la protection de code (ROP) est définie, mais mon code d'application ne fonctionne pas.stm8 Octet d'option de paramètre de protection de lecture (ROP) dans le code

Si vous définissez un octet d'option via l'onglet d'octets de l'option Programmeur visuel IAR ou ST, le code d'application et le code de protection (ROP) fonctionnent correctement.

Je dois définir ROP dans le code.

Répondre

0

J'utilise la fonction suivante:

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

J'ai essayé ces codes mais c'est le même résultat. Réglage de la protection du code mais le code ne fonctionne pas. – mryldz

+0

Qu'en est-il de l'interruption? Désactivez-vous l'interruption avant d'appeler cette fonction? Utilisez rim() pour activer les interruptions et sim() pour désactiver les interruptions: sim(); Read_Protect_Flash(); jante(); –

+0

J'ai essayé et ça ne marche pas. Mais, quand je compile d'abord le code, le débogueur fonctionne pour une fois. Quand j'appelle la fonction comme 'sim(); Read_Protect_Flash(); rim(); 'code en attente sur cette ligne' flagstatus = (u8) (FLASH-> IAPSR & (FLASH_IAPSR_EOP | FLASH_IAPSR_WR_PG_DIS)); 'dans _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; 

Quand je l'utilise problème est résolu. ROP est activé et le code est en cours d'exécution. Mais cela peut causer un autre problème imprévisible.

Parce que normalement, tout en mettant en OPT0 via la fonction (FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);) en attente pour les drapeaux (assert_param(IS_OPTION_BYTE_ADDRESS_OK(Address));*((NEAR u8*)Address) = FLASH_CLEAR_BYTE; *((NEAR u8*)(Address + 1)) = FLASH_SET_BYTE;)

Maintenant, j'enlever cette utilisation de la fonction OPT->OPT0=0xAA;, donc une autre question est ce qui sera arriver après ce changement de code.