STM32 ReadOutProtection

OP #2927391
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?
#2927438
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
}
OP #2927445
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...
OP #2927469
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren