32F0 serisi icin yazilim icinden kod protection

Başlatan z, 20 Mayıs 2020, 12:41:01

z

M0 serisi icin hatali kod yazip cipi bir daha jtagla kullanilamaz duruma (level 2'ye) sokmaktan korktugum icin kod yazip denemekden cekiniyorum.

Cipi yazilimla level 1 seviyesinde kod korumali hale getirecek program ornegi var mi?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Tagli

#1
Hocam bence bilgisayarındaki araçlara, IDE'lere güven. Sen özellikle seçmedikçe Level 2 koruma olmaz. STM32F0'lar ile epey uğraştım, bugüne kadar hiç yanlışlıkla Level 2 olan cihazım olmadı.

Yine de işlemci yazılımı ile korumayı devreye sokmak istiyorsan, referans dokümanında örnek kod var. Ben hiç denemedim gerçi. STM32F051 dokümanında A.2.5, A.2.6 ve A.2.7:

Option byte unlocking sequence code example:
/* (1) Wait till no operation is on going */
/* (2) Check that the Flash is unlocked */
/* (3) Perform unlock sequence for Flash */
/* (4) Check that the Option Bytes are unlocked */
/* (5) Perform unlock sequence for Option Bytes */
while ((FLASH->SR & FLASH_SR_BSY) != 0) /* (1) */
{
  /* For robust implementation, add here time-out management */
}
if ((FLASH->CR & FLASH_CR_LOCK) != 0) /* (2) */
{
  FLASH->KEYR = FLASH_FKEY1; /* (3) */
  FLASH->KEYR = FLASH_FKEY2;
}
if ((FLASH->CR & FLASH_CR_OPTWRE) == 0) /* (4) */
{
  FLASH->OPTKEYR = FLASH_OPTKEY1; /* (5) */
  FLASH->OPTKEYR = FLASH_OPTKEY2;
}

Option byte programming sequence code example:
/* (1) Set the PG bit in the FLASH_CR register to enable programming */
/* (2) Perform the data write */
/* (3) Wait until the BSY bit is reset in the FLASH_SR register */
/* (4) Check the EOP flag in the FLASH_SR register */
/* (5) Clear the EOP flag by software by writing it at 1 */
/* (6) Reset the PG Bit to disable programming */
FLASH->CR |= FLASH_CR_OPTPG; /* (1) */
*opt_addr = data; /* (2) */
while ((FLASH->SR & FLASH_SR_BSY) != 0) /* (3) */
{
  /* For robust implementation, add here time-out management */
}
if ((FLASH->SR & FLASH_SR_EOP) != 0) /* (4) */
{
  FLASH->SR = FLASH_SR_EOP; /* (5) */
}
else
{
  /* Manage the error cases */
}
FLASH->CR &= ~FLASH_CR_OPTPG; /* (6) */

Option byte erasing sequence example:
/* (1) Set the OPTER bit in the FLASH_CR register to enable option byte
erasing */
/* (2) Set the STRT bit in the FLASH_CR register to start the erasing */
/* (3) Wait until the BSY bit is reset in the FLASH_SR register */
/* (4) Check the EOP flag in the FLASH_SR register */
/* (5) Clear EOP flag by software by writing EOP at 1 */
/* (6) Reset the PER Bit to disable the page erase */
FLASH->CR |= FLASH_CR_OPTER; /* (1) */
FLASH->CR |= FLASH_CR_STRT; /* (2) */
while ((FLASH->SR & FLASH_SR_BSY) != 0) /* (3) */
{
  /* For robust implementation, add here time-out management */
}
if ((FLASH->SR & FLASH_SR_EOP) != 0) /* (4) */
{
  FLASH->SR = FLASH_SR_EOP; /* (5)*/
}
else
{
  /* Manage the error cases */
}
FLASH->CR &= ~FLASH_CR_OPTER; /* (6) */

Örnek kodda yazılan verinin boyutu belirtilmemiş ama herhalde 32 bittir (dokümanı eşelemedim pek, illa ki bir yerinde yazıyordur.) Veriyi yazarken her option byte'ı, tersi ile birlikte yazılıyor. Böylece hata yapma ihtimali azalıyor. Bu arada, ilgili byte'a yazılabilecek 2 değer dışında tüm değerler Level 1'e sokuyor. RDP'ye 0xCC yazma yeter.
Gökçe Tağlıoğlu