mikroc library leri ile flash lock ve unlock yapma sorusu

Başlatan Karamel, 28 Temmuz 2015, 00:44:35

Karamel

merhaba. stm32f030k6t6 microcontroller imla yine flash deneyleri yapmaya basladim. 2 tane microcontrollerim vardi. birisini bozdugumdan elimde sadece birtane kaldi.

stm32 lerde sanirim birkac level code protection var. bir seviyeden sonra. microcontroller a birdaha program yuklenemez hale degidiginden flash registerini kendim yazip. deneyler yapmaya korktum. cunku sadece tek top um kaldi.

bende mikroc library lerine baktim.


FLASH_lock();

bu function in flash i okunamaz ama uzerine yeniden yazmalar yapilabilir sekle getirmesi gerekli?

bu function i main in en basina yerlestiriyorum. microcontroller bu function i isleyip. geciyor. yani icersinde takilmiyor. daha sonra st link utility programi ile connect diyince microcontroller in flash memory sini okuyabiliyorum.

elimde sadece 1 tane microcontrollerim oldugundan deneylerimi korka korka yapiyorum. suanki halim asagidaki gibi :) deney yapmak istiyorum ama deney yapmaya korkuyorum. :)


Klein

FLASH_Lock() ve FLASH_Unlock()  fonksiyonları, yazma korumasını açıp kapatır. Kod koruması ile ilgili değil.  Program içerisinden yanlışlıkla  yazmanızın önüne geçer. SWD ve JTAG için herhangi bir koruma yapmaz.
Kod koruması  option baytlarından açılır.  Option baytlarını yazılım içerisinden programlayabileceğiniz gibi ,  programlama aşamasında da yapabilirsiniz.

Karamel

hocam simdi isler karisti. ben en basta lock code protection koyuyor sandim ama isler daha functional mis.

hocam simdi reference manual dan okudugum kadari ile benim FLASH_OBR regiterinin. RDPRT[1:0] bitlerini degistirmem gerekli?

level0 default.

level1 ile level2 de microcontrollerin ic yapisindan bahsdiyor. cok teknik terim var. acikcasi hangisini secmem gerektigini anlamadim. birseyleri protect edecegim ama protect edecegi mseylerin ne oldugunu anlamadim.  :-\

mesaj birleştirme:: 28 Temmuz 2015, 02:14:22

batti balik yan gider. atin olumu arpadan olsun dedim. level1 ve level2 yi az once denedim. yani FLASH_OBR registerinin 1. ve 2. bitini logic 1 yaptim. st link utility ile yeniden read edebildim. yani basarisiz oldum.

mesaj birleştirme:: 28 Temmuz 2015, 02:23:49

denedigim register sadece readable bir block mus. yani dogru yer degilmis. benim read protect i baska bir kisma yazmam gerekli. simdi onu ariyorum.

mesaj birleştirme:: 28 Temmuz 2015, 03:12:30

burada http://stackoverflow.com/questions/25770483/how-to-protect-reading-flash-of-stm32f10x  library kullanarak nasil yapildigini gostermis. level2 ye sakin alma! yoksa birdaha program yapamazsin demis.

eger yukaridaki deneyde dogru register a yazsaydim. led yakip sondurme ozelligi olan ama bir daha programlanamayan bir microcontrollerim olacakti :) ucuzv yirtmisim.  ::)

mesaj birleştirme:: 28 Temmuz 2015, 03:15:16

Level 1: read protection
This is the default protection level when RDP option byte is erased. It is defined as well when RDP value is at any value different from 0xAA and 0xCC, or even if the complement is not correct.

simdi benim RDP isimli kisma 0xAA yada 0xCC den farkli yada complement leri birbirini tutmayan bir deger girmem lazim. yalniz RDP nin tam olarak nerede oldugunu anlayamadim.

mesaj birleştirme:: 28 Temmuz 2015, 03:24:26

3.3 Memory protection
The user area of the Flash memory can be protected against read by untrusted code. The pages of the Flash memory can also be protected against unwanted write due to loss of program counter contexts. The write-protection granularity is one sector (four pages).
3.3.1 Read protection
The read protection is activated by setting the RDP option byte and then, by applying a system reset to reload the new RDP option byte.
Note:If the read protection is set while the debugger is still connected through SWD, apply a POR (power-on reset) instead of a system reset.
There are three levels of read protection from no protection (level 0) to maximum protection or no debug (level 2). Refer to Table 7: Access status versus protection level and execution modes.
The Flash memory is protected when the RDP option byte and its complement contain the pair of values shown in Table 6.

read protection RDP byte lari ile secilir. bunda degisiklik yaptigimizda. microcontroller a reset sonrasi. okunarak active olur.

yani ben protect ti active ettim. okuma yaparsam. okuyabilirim. cunku eski secenek gecerli olacak. ama systemi resetlersem. artik yeni secenek yani protect active olacak.



mesaj birleştirme:: 28 Temmuz 2015, 03:45:39

FLASH_OBR register i sadece okunabilir. halen halen RDP yi bulamadim.

Klein

Level 2 yaparsan, bira daha geri dönüşü yok.
Level 1 yaparsan SWD ile okuyamazsın. Ancak korumayı kaldırdığında flash silinir ve yeniden programlatabilirsin.

Sen muhtemeleen Level 1 de yapamadın.  Flash, data eeprom ve Option byte yazma kilitlerini açmak için gereken keyler birbirinden farklı.
ST kütüphanesi kullanıyorsan,  FLASH_OB_Unlock() fonksiyonunu kullanman gerek. Ayrıca KEY girmene gerek yok.
ReadOut Protection için
FLASH_OB_RDPConfig(uint8_t OB_RDP) fonksiyonunu kullanmalısın.
argümanları
  *     @arg OB_RDP_Level_0: No protection
  *     @arg OB_RDP_Level_1: Read protection of the memory
  *     @arg OB_RDP_Level_2: Chip protection



Karamel

hocam oncelikle kutupthane kullanmak istemiyorum st nin kileride kullanmak istemiyorum. sadece meseleyi anlamaya calisiyorum.

hocam level1 yaptiktan sonra. herhangi birsey yapmaadiktan sonra(level0 a gecmedikten sonra) flash i st link ile silip. yeniden programlayamazmiyim?

yani pic microcontrollerlardaki protection gibi olmuyormu?

mesaj birleştirme:: 28 Temmuz 2015, 03:57:02

stm32 microcontrollerlarin registerlari birazdaha karisikmis. ilk kez karsilasmada nereden ne oldugunu anlamakta gucluk cekiyor insan.

mesaj birleştirme:: 28 Temmuz 2015, 04:01:46

hocam eger level1 deyken level0 a gecmeden. microcontroller programlanamiyorsa.

microcontroller yazilimini nasil koruyorlar.

protect li microcontrollerlari nasil yeniden programliyorlar?

Klein

Evet level 1 yaparsan yeniden programlayabilirsin. Fakat çipi silerek değil. Zaten silmek istesen de silemezsin. Koruma seviyesini tekrar 0 yapman gerek. Korumayı 0 yaptığında çip silinir. Yeniden silmene gerek yok.

Kütüphanedeki fonksiyonları inceleyerek , register bazında ne yapıldığını daha iyi anlayabilirsin. diğer türlü kör döğüşü gibi olur. Datasheet ve kütüphaneyi karşılıklı incelersen, daha hızlı sonuç alabilirsin.

#define OB_RDP_Level_0   ((uint8_t)0xAA)
#define OB_RDP_Level_1   ((uint8_t)0xBB)
/*#define OB_RDP_Level_2   ((uint8_t)0xCC)*/ /* Warning: When enabling read protection level 2 
                                                it's no more possible to go back to level 1 or 0 */

FLASH_Status FLASH_OB_RDPConfig(uint8_t OB_RDP)
{
  FLASH_Status status = FLASH_COMPLETE;
  uint16_t tmp1 = 0;
  uint32_t tmp2 = 0;
  
  /* Check the parameters */
  assert_param(IS_OB_RDP(OB_RDP));
  status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);
  
  /* calculate the option byte to write */
  tmp1 =  ((uint16_t)(*(__IO uint16_t *)(OB_BASE)) & 0xFF00) | OB_RDP; 
  tmp2 = (uint32_t)(((uint32_t)((uint32_t)(~tmp1) << 16)) | ((uint32_t)tmp1));
  
  if(status == FLASH_COMPLETE)
  {         
   /* program read protection level */
    OB->RDP = tmp2;
  }
  
  /* Wait for last operation to be completed */
    status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);
     
  /* Return the Read protection operation Status */
  return status;            
}

Karamel

hocam libraryden birsey anlamadim ama suan daha buyuk bir sorun var.


simdi bir kimse 5000 satir code yazar. ister ki microcontroller read project olsun. kimse projesini ele geciremesin.

eger stm32 microcontrollerlarda level 1 read project yaparsa. level0 a gecmeden silemiyoruz? okuyamiyoruz?

peki programlama yapilacagi zaman level0 a nasil gecilecek? harici bir button vs ile mi? yani mesela programlama yapilmak istenildiginde buttona basip. level0 a cekip. ardindan program yuklenerek?


eger durum boyle ise. cok mantiksiz degilmi? pic microcontroller larda durum boyle degildi. protect yapinca. oknamiyor ama programmer ile silinebiliyor yada uzerine yazilabiliniyordu.

Klein

Bunda da aynı. ST-Link Utility'den  option byte bölümüne gidip,  korumayı 0 yapacaksınız. Ha   sil butonuna basmışsınız, ha  korumayı 0 yapmışsınız. Fark eden bir şey yok. Programlayıcıdan haledebilirsiniz.

Karamel

tamamdir hocam simdi taslar birazda olsa yerine oturdu. bir an icin yanlis birsey ilr ugrastigimi sandim.

neyse. hocam sizin library niz OB->RDP  seklinde option registerinin  RDP bitlerine yaziyor ama bunu microc de nasil tanimlayacagimi bilemedim.

bir derleyicide bunlarin nasil tanimlandigina nasil erisebilirim?

mesaj birleştirme:: 28 Temmuz 2015, 06:18:07

su registerin son 16 biti RDP ve nRPD bytelarina denk geliyor. bunlari  degistirmem gerekiyor ama bu registerin ismi yazmiyor. yada ben calismaktan cok yoruldum. goremiyorum.


Klein

İsmi OB ya da OBR. Register tanımı STLIB içerisinde değil. "STM32xxxxx.h"  başlık dosyasının içinde.  Portların ve diğer donanımların tanımlandığı dosyada.

typedef struct
{
  __IO uint32_t ACR;          /*!< Access control register,                     Address offset: 0x00 */
  __IO uint32_t PECR;         /*!< Program/erase control register,              Address offset: 0x04 */
  __IO uint32_t PDKEYR;       /*!< Power down key register,                     Address offset: 0x08 */
  __IO uint32_t PEKEYR;       /*!< Program/erase key register,                  Address offset: 0x0c */
  __IO uint32_t PRGKEYR;      /*!< Program memory key register,                 Address offset: 0x10 */
  __IO uint32_t OPTKEYR;      /*!< Option byte key register,                    Address offset: 0x14 */
  __IO uint32_t SR;           /*!< Status register,                             Address offset: 0x18 */
__IO uint32_t OBR;          /*!< Option byte register,                        Address offset: 0x1c */
  __IO uint32_t WRPR;         /*!< Write protection register,                   Address offset: 0x20 */
  uint32_t   RESERVED[23];    /*!< Reserved,                                    0x24                 */
  __IO uint32_t WRPR1;        /*!< Write protection register 1,                 Address offset: 0x28 */
  __IO uint32_t WRPR2;        /*!< Write protection register 2,                 Address offset: 0x2C */
} FLASH_TypeDef;

Karamel

hocam OBR diye birsey tanimiyor. FLASH_OBR diye birsey taniyor oda asagidaki yukarida bahsettigim asagida resmini verdigim register. sadece okunabiliyor. uzerine yazilamiyor. zaten sanirim ilgilenmemiz gereken register bu degil. bu status u gosteriyor?



mesaj birleştirme:: 28 Temmuz 2015, 08:36:54

Bits 2:1 RDPRT[1:0]: Read protection level status
00: Read protection level 0 is enabled (ST production configuration)
01: Read protection level 1 is enabled
11: Read protection level 2 is enabled.

LukeSkywalker

#11
Alıntı yapılan: Karamel - 28 Temmuz 2015, 05:55:18
tamamdir hocam simdi taslar birazda olsa yerine oturdu. bir an icin yanlis birsey ilr ugrastigimi sandim.

neyse. hocam sizin library niz OB->RDP  seklinde option registerinin  RDP bitlerine yaziyor ama bunu microc de nasil tanimlayacagimi bilemedim.

bir derleyicide bunlarin nasil tanimlandigina nasil erisebilirim?

mesaj birleştirme:: 28 Temmuz 2015, 06:18:07

su registerin son 16 biti RDP ve nRPD bytelarina denk geliyor. bunlari  degistirmem gerekiyor ama bu registerin ismi yazmiyor. yada ben calismaktan cok yoruldum. goremiyorum.



Derleyicide program yazarken kullandığınız işlemcideki register tanımlamalarına ulaşabilmek için ctrl+alt+d  tuşlarına basmanız gerekiyor mikroC'de.

mesaj birleştirme:: 28 Temmuz 2015, 08:55:44

Ayrıca neden program içerisinden yapmak istiyorsun böyle bir şeyi? Çipi programladıktan sonra ST_link utility üzerinden koruma sağlanıyor zaten. 
Şurada detaylı tartışılmıştı;
https://www.picproje.org/index.php?topic=50569.0

Karamel

hocam gec message yazdigim icin ozur dilerim. deney yapmak icin boyle birseyi merak etmistim. ayrica st libraryleri becerebiliyorsa. bizde register ile becerebiliriz diyerekten boyle birsey yapmak istemistim ::)

Karamel

#13
canim sIkIlInca yine bu seye geri dondum. bu isi yarim birakmayip. bende yaparim dedim.

yazin basina oranla sunki arm microcontroller bilgim. birazcicikta olsa artti. suan az cok bazi seyleri anlayabiliyorum.

bizim ugrastigimiz sey mikroc de bir register olarak tanimlanmamis. flash memory de bir address. bu address inde ne oldugunu biliyoruz. bu 0x1FFFF800

simdi ben mikroc ile flash memory deneyleri yapmistim ama anlamadigim birsey var. flash memory e birseyler yazmak icin once o block u erase etmemiz gerekli?

iyide. bu koca block u goturunce diger ayarlar ne olacak? asagidaki code satirlari bu istedigimiz isi yapiyor olmali. ama koca block gidecek. herhalde bu yuzden olacak ki. calismiyorlar. ama program memory nin baska bir address ini silip. icersine birseyler yazabiliyorlar.

FLASH_ErasePage(0x1FFFF800);
FLASH_Write_HalfWord(0x1FFFF800, 0xBBDD);


durum boyle iken st link utility yada st library bu isi nasil yapiyor?  :-\

mesaj birleştirme:: 28 Ağustos 2015, 20:27:45

Simdi aklima birsey geldi. Block un tamamini once ram e copyalayip. Daha sonra block u silip ve istedigim address teki bilgiyi degistirip yeniden yazabilirim ama bu ram den cok fazla kayiba neden olmazmi?

Keil de boylemi yapiyor?