Forum: Mikrocontroller und Digitale Elektronik STM32 ReadOutProtection


von Phantomix X. (phantomix)


Lesenswert?

Hallo

Hat einer von euch es schon mal geschafft, die STM ReadOutProtection vom 
Code aus zu aktivieren?
Ich habe nun schon ein Paar Stunden ins Debugging, Fehlersuche, Google 
investiert und bin zu dem Schluss gekommen, dass der Code aus der STM 
StdPeriphLib 3.4.0 einfach nicht funktioniert.
1
#include "stm32f10x.h"
2
int main(void)
3
{
4
    FLASH_ReadOutProtection(ENABLE);
5
    while(1)
6
    {
7
    }
8
}

Das mal als einfaches Beispiel. Ich kann die Funktion durchsteppen und 
das OB->RDP - Register wird korrekt auf 0x00 gesetzt. Jedoch hat dies 
keinen Effekt; selbst nach einem Power-Cycle ist der Flash noch per 
ST-Link-Utility lesbar.

(Der Vollständigkeit halber hier noch der Code aus der StdPeriphLib)
1
FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState)
2
{
3
  FLASH_Status status = FLASH_COMPLETE;
4
  /* Check the parameters */
5
  assert_param(IS_FUNCTIONAL_STATE(NewState));
6
  status = FLASH_WaitForLastOperation(EraseTimeout);
7
  if(status == FLASH_COMPLETE)
8
  {
9
    /* Authorizes the small information block programming */
10
    FLASH->OPTKEYR = FLASH_KEY1;
11
    FLASH->OPTKEYR = FLASH_KEY2;
12
    FLASH->CR |= CR_OPTER_Set;
13
    FLASH->CR |= CR_STRT_Set;
14
    /* Wait for last operation to be completed */
15
    status = FLASH_WaitForLastOperation(EraseTimeout);
16
    if(status == FLASH_COMPLETE)
17
    {
18
      /* if the erase operation is completed, disable the OPTER Bit */
19
      FLASH->CR &= CR_OPTER_Reset;
20
      /* Enable the Option Bytes Programming operation */
21
      FLASH->CR |= CR_OPTPG_Set; 
22
      if(NewState != DISABLE)
23
      {
24
        OB->RDP = 0x00;
25
      }
26
      else
27
      {
28
        OB->RDP = RDP_Key;  
29
      }
30
      /* Wait for last operation to be completed */
31
      status = FLASH_WaitForLastOperation(EraseTimeout); 
32
    
33
      if(status != FLASH_TIMEOUT)
34
      {
35
        /* if the program operation is completed, disable the OPTPG Bit */
36
        FLASH->CR &= CR_OPTPG_Reset;
37
      }
38
    }
39
    else 
40
    {
41
      if(status != FLASH_TIMEOUT)
42
      {
43
        /* Disable the OPTER Bit */
44
        FLASH->CR &= CR_OPTER_Reset;
45
      }
46
    }
47
  }
48
  /* Return the protection operation Status */
49
  return status;       
50
}


Hat irgendwer eine Idee?

von Frank A. (_frank)


Angehängte Dateien:

Lesenswert?

Hallo phantomix,

finde ich ein interessantes Thema.
Hast du dir mal die Beispiele zur STD-Lib angesehen?

Wenn ich heute oder morgen mal Zeit habe, probiere ich das mal aus.
Wäre auch für mich ganz interessant.

Gruß Frank

von Phantomix X. (phantomix)


Lesenswert?

Hallo!

Die WriteProtection interessiert mich daran eigentlich weniger, obwohl 
sie später evtl auch noch relevant wird.

Ich werd jetzt mal probieren, den ganzen Kram in den RAM zu linken und 
von dort aus zu starten. Wenn das nicht funktioniert, bin ich auch am 
Ende meines Lateins

von Mike R. (thesealion)


Lesenswert?

Du musst vorher den Flash freigeben, damit die einstellungen geändert 
werden können.

Bei mir sieht die Routine hierfür so aus, und funktioniert einwandfrei:
1
/******************************************************************************/
2
/** @brief  
3
  * 
4
  * 
5
  * @param  None
6
  * @retval None
7
  */
8
/******************************************************************************/
9
void flashDriver_checkReadout(void) {
10
   
11
   if (FLASH_GetReadOutProtectionStatus() != SET) {
12
      #ifndef DEBUG      
13
         FLASH_Unlock();
14
15
         if (FLASH_ReadOutProtection(ENABLE) != FLASH_COMPLETE) {
16
            FaultSystem_queueFault(FaultSystem_Flag_Warning, FaultSystem_Flash, FAULT_SYSTEM_FLASH__WRITE, "set protection");
17
         
18
            flashInterface_secureFault();
19
         }
20
         NVIC_SystemReset();
21
      #endif   
22
   }
23
}

von Phantomix X. (phantomix)


Lesenswert?

Mike S. schrieb:
> Du musst vorher den Flash freigeben, damit die einstellungen geändert
> werden können.

Du meinst FLASH_Unlock()

In der Funktion wird die Key-Sequenz geschrieben. Das passiert in der 
FLASH_ReadOutProtection() aber sowieso.


Ich habe deinen Code mal 1:1 ausprobiert und er funktioniert.

Keine Ahnung was da bei mir schief läuft. Ich nehm das jetzt so wie du 
es gemacht hast und portiere es bis es in unsere Software passt. DANKE! 
:-)


Evtl liegts daran, dass ich nicht sofort danach einen Reset ausgelöst 
habe. Den hatte ich per Strom-Aus-Strom-An danach allerdings manuell 
gemacht...

von Thomas W. (diddl)


Lesenswert?

Eigentlich erstaunlich, dass es ein Code im STM32 ist. Und nicht ein ST 
Link utility, mit dem man den Schutz setzen kann. So wie bei den AVR 
Fuses.

von Phantomix X. (phantomix)


Lesenswert?

Es lag tatsächlich an FLASH_Unlock() und an 
"Wer-Lesen-kann-ist-klar-im-Vorteil":

FLASH_Unlock():
1
FLASH->KEYR = FLASH_KEY1;
2
FLASH->KEYR = FLASH_KEY2;

ReadOutProtection(NewState):
1
FLASH->OPTKEYR = FLASH_KEY1;
2
FLASH->OPTKEYR = FLASH_KEY2;

von Phantomix X. (phantomix)


Lesenswert?

Hallo!

Thomas Winkler schrieb:
> Eigentlich erstaunlich, dass es ein Code im STM32 ist. Und nicht ein ST
> Link utility, mit dem man den Schutz setzen kann. So wie bei den AVR
> Fuses.

Das geht auch. Ist aber bei uns gerade nicht gewünscht, und zwar aus 
zwei Gründen:

- Der Kunde hat bereits ein paar Vorserienmodelle, die wir per Update 
auch dicht machen wollen (bequemer als sie zurückzurufen)

- Der Aufwand in der Produktion veringert sich, wenn der Schutz 
automatisch von der Software gesetzt wird

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.