STM32F103 işlemciye minicik bir kod yazıp ardından bu kodu çalıştırıp, flash romun bir bölümünü silip asıl uygulama kodumu flasha yükletmek istiyorum.
Bu amaçla çipin kendi bootloader programlarını kullanmayı düşünmüyorum.
Aşağıdaki dokümanları buldum ama henüz satır satır okumadım.
http://www.embedinfo.com/en/UploadFile/201051114555325935.pdf (http://www.embedinfo.com/en/UploadFile/201051114555325935.pdf)
http://www.st.com/st-web-ui/static/active/jp/resource/technical/document/application_note/DM00052530.pdf (http://www.st.com/st-web-ui/static/active/jp/resource/technical/document/application_note/DM00052530.pdf)
Aklıma takılan bazı soruları hemen sormak istiyorum.
1) Çipin kendi bootloaderını silip buraya kendi kodlarımı yerleştirebilirmiyim?
2) Page silme işlemi nasıl yapılır?
3) Anladığım kadarıyla çipi en yüksek koruma seviyesine aldığımda flash dışarıdan ne okunabiliyor, ne üzerine yazılabiliyor ne de debug edilebiliyor.
Peki içerideki kodlarımla konuşarak, bak seni yazıp yerleştiren kişi benim. Ben seni dışarıdan okuyamıyor silemiyor debug edemiyorum. Benim için bu korumayı sen içeriden kaldırırmısın diyebilirmiyim?
2 ve 3 nolu sorulara cevap olarak;
2:
FlashStatus = FLASH_ErasePage(PAGE0_BASE_ADDRESS);
yada
FLASH->KEYR=0x45670123;
FLASH->KEYR=0xCDEF89AB;
FLASH->CR|=0x00000002;
FLASH->AR=___adrress___;
FLASH->CR|=0x00000040;
while((FLASH->SR&0x00000001));
FLASH->CR &= ~0x00000042;
FLASH->CR=0x00000080;
3:
Kod içinden readout protection kapatmak mümkün. CMSIS de fonksiyonu var.
***************************************************
* Legacy functions used for all STM32F10x devices *
***************************************************
+----------------------------------------------------------------------------------------------------------------------------------+
| Functions prototypes |STM32F10x_XL|Other STM32F10x| Comments |
| | devices | devices | |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_SetLatency | Yes | Yes | No change |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_HalfCycleAccessCmd | Yes | Yes | No change |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_PrefetchBufferCmd | Yes | Yes | No change |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_Unlock | Yes | Yes | - For STM32F10X_XL devices: unlock Bank1 and Bank2. |
| | | | - For other devices: unlock Bank1 and it is equivalent |
| | | | to FLASH_UnlockBank1 function. |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_Lock | Yes | Yes | - For STM32F10X_XL devices: lock Bank1 and Bank2. |
| | | | - For other devices: lock Bank1 and it is equivalent |
| | | | to FLASH_LockBank1 function. |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_ErasePage | Yes | Yes | - For STM32F10x_XL devices: erase a page in Bank1 and Bank2 |
| | | | - For other devices: erase a page in Bank1 |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_EraseAllPages | Yes | Yes | - For STM32F10x_XL devices: erase all pages in Bank1 and Bank2 |
| | | | - For other devices: erase all pages in Bank1 |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_EraseOptionBytes | Yes | Yes | No change |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_ProgramWord | Yes | Yes | Updated to program up to 1MByte (depending on the used device) |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_ProgramHalfWord | Yes | Yes | Updated to program up to 1MByte (depending on the used device) |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_ProgramOptionByteData | Yes | Yes | No change |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_EnableWriteProtection | Yes | Yes | No change |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_ReadOutProtection | Yes | Yes | No change |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_UserOptionByteConfig | Yes | Yes | No change |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_GetUserOptionByte | Yes | Yes | No change |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_GetWriteProtectionOptionByte | Yes | Yes | No change |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_GetReadOutProtectionStatus | Yes | Yes | No change |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_GetPrefetchBufferStatus | Yes | Yes | No change |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_ITConfig | Yes | Yes | - For STM32F10x_XL devices: enable Bank1 and Bank2's interrupts|
| | | | - For other devices: enable Bank1's interrupts |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_GetFlagStatus | Yes | Yes | - For STM32F10x_XL devices: return Bank1 and Bank2's flag status|
| | | | - For other devices: return Bank1's flag status |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_ClearFlag | Yes | Yes | - For STM32F10x_XL devices: clear Bank1 and Bank2's flag |
| | | | - For other devices: clear Bank1's flag |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_GetStatus | Yes | Yes | - Return the status of Bank1 (for all devices) |
| | | | equivalent to FLASH_GetBank1Status function |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_WaitForLastOperation | Yes | Yes | - Wait for Bank1 last operation (for all devices) |
| | | | equivalent to: FLASH_WaitForLastBank1Operation function |
+----------------------------------------------------------------------------------------------------------------------------------+
************************************************************************************************************************
* New functions used for all STM32F10x devices to manage Bank1: *
* - These functions are mainly useful for STM32F10x_XL density devices, to have separate control for Bank1 and bank2 *
* - For other devices, these functions are optional (covered by functions listed above) *
************************************************************************************************************************
+----------------------------------------------------------------------------------------------------------------------------------+
| Functions prototypes |STM32F10x_XL|Other STM32F10x| Comments |
| | devices | devices | |
|----------------------------------------------------------------------------------------------------------------------------------|
| FLASH_UnlockBank1 | Yes | Yes | - Unlock Bank1 |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_LockBank1 | Yes | Yes | - Lock Bank1 |
|----------------------------------------------------------------------------------------------------------------------------------|
| FLASH_EraseAllBank1Pages | Yes | Yes | - Erase all pages in Bank1 |
|----------------------------------------------------------------------------------------------------------------------------------|
| FLASH_GetBank1Status | Yes | Yes | - Return the status of Bank1 |
|----------------------------------------------------------------------------------------------------------------------------------|
| FLASH_WaitForLastBank1Operation | Yes | Yes | - Wait for Bank1 last operation |
+----------------------------------------------------------------------------------------------------------------------------------+
*****************************************************************************
* New Functions used only with STM32F10x_XL density devices to manage Bank2 *
*****************************************************************************
+----------------------------------------------------------------------------------------------------------------------------------+
| Functions prototypes |STM32F10x_XL|Other STM32F10x| Comments |
| | devices | devices | |
|----------------------------------------------------------------------------------------------------------------------------------|
| FLASH_UnlockBank2 | Yes | No | - Unlock Bank2 |
|----------------------------------------------------------------------------------------------------------------------------------|
|FLASH_LockBank2 | Yes | No | - Lock Bank2 |
|----------------------------------------------------------------------------------------------------------------------------------|
| FLASH_EraseAllBank2Pages | Yes | No | - Erase all pages in Bank2 |
|----------------------------------------------------------------------------------------------------------------------------------|
| FLASH_GetBank2Status | Yes | No | - Return the status of Bank2 |
|----------------------------------------------------------------------------------------------------------------------------------|
| FLASH_WaitForLastBank2Operation | Yes | No | - Wait for Bank2 last operation |
|----------------------------------------------------------------------------------------------------------------------------------|
| FLASH_BootConfig | Yes | No | - Configure to boot from Bank1 or Bank2 |
+----------------------------------------------------------------------------------------------------------------------------------+
@endcode
1 nolu soru için de, mümkün olabileceğini düşünüyorum. pragma locate tarzı bir yolla o adreslere kod yerleştirip işlemci programlanırsa, bu mümkün olabilir.
Bootloaderın yerleştiği page'i hiç bir şekilde silemiyormuşuz.
Hocam code protect 2 seçerseniz artık içerden de durumu düzeltemezsiniz. Bişeyler saklamak ister gibi kodu sadece siz okumak istiyorsanız, içerideki koda flashı tek tek oku gönder diye bir fonksiyon yazarsınız olur.
Ancak code protect 1 yaparsanız içeride options bitlere erişerek istediğiniz zaman programla kendi korumanızı aktif pasif yaptırabilirsiniz.
Kendinize bootloader yazacaksanız stdlibrary deki flash_if.c içerisindeki fonksiyonlar ile kolayca yapabiliyorsunuz.
keil scatter file oluşturuyor buradan da flash haritasını parçalandırabilirsiniz.
Protection seviyelerini detaylı anlatan doküman varmı?
2 seviyesinde koruma yaparsam, çipi silip yeni baştan da mı programlayamıyorum?
Evet 2. seviyeye alırsanız birdaha Uart, USB DFU, SWD, JTAG bağlantılarından program atamazsınız(!), okuyamazsınız(!). Ancak içerde kendiniz bootloader yazarsanız programı rom da yada ramde koşarken değiştirebilirsiniz.
Şöylede bir bilgi vereyim level-2 de options byteları değiştirilemez hale geliyor. Örnek veriyorum protect level-2 deki işlemciyi level-1'e yazılımla geri alamıyorsunuz. Options bytlelarını birdaha değiştiremiyorsunuz. level-0-1 de böyle bir durum yok.
Aşağıdaki dökümanda gerekli bilgileri bulabilirsiniz.
http://www.st.com/st-web-ui/static/active/cn/resource/technical/document/application_note/DM00075930.pdf (http://www.st.com/st-web-ui/static/active/cn/resource/technical/document/application_note/DM00075930.pdf)
Not: Level-1 de iken dışarıdan ya da içeriden level-0 a geçerseniz. işlemci önce yazılımını siler sonra level-0 a geçer.
ARM CM3 ciplerde okuma/yazma korumasi ile ilgili cikarimlarim asagida. Eksik, fazla/hatali kisimlar varmi?
------------------------
Level 0 'i zaten gundelik kullanimdan biliyoruz.
------------------------
Eger Level 1 korumaya gecersek;
Cipe JTAG/SWD ile baglanabiliyoruz fakat flash hic bir sekilde disaridan okunamiyor. (Okunamiyor, debug edilemiyor code alani gosterilemiyor)
Fakat, JTAG/SWD ile RAM'a kod atip calistirabiliyoruz. Cipin registerlerini ve RAM iceriklerini okuyabiliyoruz.
Eger, PCROP korumasi yapmadiysak bu durumda Flash'daki kodlari calabiliyoruz. (*)
Level 1 korumasi yapilmis cipi ister siz yada bir casus kolayca silip yeni satin alinmis haline getirebilir.
Dolayisiyle Level 1 korumali cipi Level 0 durumuna getirebiliyoruz.
-------------------------
Level 2 korumasi yapilmis bir cipe JTAG/SWD baglasaniz bile cipe erisemiyoruz. (Dolayisi ile Level 1 deki gibi RAM yada registerlere de erisemiyoruz.)
Bu sekilde korunmus bir cipi disaridan hic bir sekilde ne okuyabiliyor ne silebiliyor ne de yazabiliyoruz.
Fakat cipe yuklenmis kod eger flash programlama yetenegine sahipse siz bu programla konusarak al su kodlari flasha yaz diyecek rutinler koyduysaniz;
yazma korumasi yapmadiginiz flash sektorlerini silip yeniden yazabiliyorsunuz.
Level 2 korumasina alinmis cip artik ne Level 1 ne de Level 0 konumuna geri getirilebiliyor.
Eger iceriye sizmis casus kodlara da engel olmak istiyorsak RCROP mekanizmasini harekete gecirmeliyiz. (*)
-------------------------
(*)
Eger casus yazilimlarin (cip icine sagdan soldan devsirip koydugumuz program parcaciklarinin yada RAM'a yukledigimiz casus kodlarin) cip icinden kodumuzu okumasina da engel olmak istiyorsak PCROP ozelligini de aktif etmeliyiz. (Aktif edersek bir daha duzeltemiyoruz)
Daha acik ifade ile islemcinin isletilebilir kodlari okumasini istemiyorsak bu durumda program yazma sitilimizi de degistirmeliyiz. Aksi takdirde kendi kodlarimiz da calismayacaktir.
Calismasi icin;
C kullaniyorsak armcc --no_literal pools -- max_string_in_code=0 direktifi kullanmaliyiz.
Hocam doğru anlamışsınız eksik kalan birkaç nokta var onları düzeltelim.
Level-1 seviyesinde ki bir çipe Debug yapmak, program yazmak(RAM/ROM farketmez) istediğinizde size şöyle bir uyarı veriyor. "Çip kod korumalıdır. İçerisindeki yazılım (varsa eeprom sektörleride dahil) silinecektir. Kabul ediyormusunuz?" der. Kabul ederseniz çip komple silinmiş ve level-0 a geri dönmüş olur. Tekrar yazılım yüklersiniz level-1 e kendiniz alırsınız veya içerdeki yazılım alır.
Ayrıca usart veya DFU içinde durum aynıdır. Usart dan örnek vereyim terminal üzerinden Y modem protkolünde yazılım yüklerken string bilgilendirmelerinde kod koruması olup olmadığını yazar. Sizi sayı komutlarıyla yönlendirir. Sizde önce korumayı kapatırsınız. Daha sonra boş çipe yazılım gönderebilirsiniz.
Level-1 seviyesi güvenlidir. Hali hazırda kullanıyorum. Bir güvenlik zaafiyeti görmedim.
Yazılımda pointerlar ile haberleştiğiniz giriş çıkış birimleriniz varsa birtek bu tehlikeli olabilir onun dışında level-1 de yazılımın çalınması mümkün değil.
level-2 nin kullanım amacı yazılımın çalınmasından ziyade kullanıcı yazılımı değiştiremez olmasıdır.
Bu konuyla yeni ilgilenmeye basladim. Cok bildigimi iddia edemeyecegim fakat;
Alıntı YapLevel-1 seviyesinde ki bir çipe Debug yapmak, program yazmak(RAM/ROM farketmez) istediğinizde size şöyle bir uyarı veriyor. "Çip kod korumalıdır. İçerisindeki yazılım (varsa eeprom sektörleride dahil) silinecektir. Kabul ediyormusunuz?" der. Kabul ederseniz çip komple silinmiş ve level-0 a geri dönmüş olur. Tekrar yazılım yüklersiniz level-1 e kendiniz alırsınız veya içerdeki yazılım alır.
Bu kullandiginiz JTAG yaziliminin uyarisidir. Eger Level-1 seviyesinde korunan cipe JTAG ile baglanirsak RAM'a ulasabiliyoruz buraya program atabiliyoruz. Bunun icin PC tarafinda biraz daha ozel programa ihtiyacimiz var.
Eger bu asamayi gecebilirsek bu durumda RAMa atilan program sayesinde flashdaki kodlari calabiliriz. (Fakat RSROP bitlerinin set edilmemis olmasi lazim.)
Level 2 de RSROP bitler set edilmemis ise bu durumda kodu sadece iceride varsa trojan kod sizdirabilir.
----------
XDS510PP jtag cihazini kullanirken tum detaylar verilmis oldugundan PC tarafinda kendi JTAG kodlarimi yazmistim. Dolayisi ile diledigim programi cipin icine (rama) yazip kosturabiliyordum.
J-Link vs de detaylar tahminimce verilmistir dolayisi ile Level 1 korumasini asma denemeleri icin PC icin JTAG programi yazmak gerekiyor. (Internette kesin vardir)
Level 2 yi secersem cipi artik yeni projelerde hic kullanamayacagim yada kodlarimda buyuk degisiklik yapamayacagim. Bu nedenle Level 1 + RSROP ile kodlarimi garanti altina alacagim.
mesaj birleştirme:: 29 Mart 2014, 15:13:10
Aklima geldi;
Simdi yeni bastan flash kodlari (erase, write vs) yazacagima bootladerdaki bazi fonksiyonlari cagirarak flashla ilgili isleri yapabilirim. Bu bana flashda yer kazandirir.
Fakat bunun icin bootloaderdaki fonksiyonlari parametrelerini ve adreslerini bilmem gerekiyor.
Bu konuda bilgi varmi?
Ben bu konuda ST den Yılmaz Kasapoğlundan yardım almıştım beni level-1 in güvenli olacağına ikna etti, yinede siz söyleyince içime şüpe düşmedi değil!
hocam bootloader API sı zaten st nin sitesinde açık kaynak kodlu veriliyor. çipdeki bootloader versiyonunun kodlarını indirirseniz ve kodları 1FFF li adres vektörlerinden başlayarak derlerseniz tüm fonksiyonların system flash denilen yerdeki adreslerini öğrenmiş olursunuz.
Benim çözümüm şu yönde olmuştu kullandığım çip 384k idi ve bank1, bank2 diye bölünmüştü. Bende ana programı 192k ile sınırlayıp hafızanın diğer yarısını da buffer olarak kullandım. Buffer(bank1)daki programı bank0 a taşımak için ram fonksiyon oluşturdum bufferı checksum crc kontrol edip bank0 a yazıp reset atıyorum.
Böyle bir protekole sahip bootloader yazarsanız ilerde bootloader da yazılımın kendisinde olacağı için boot sorunlarını çözmeniz veya çipin istediğiniz alanlarını kullanmanız mümkün olacaktır.
Kolay gelsin.
Hocam bir kac saattir AN4246, PM0042 ile bogusuyorum.
Iddialarimin kaynaklari bu dokumanlar. (Dedigim gibi henuz ogrenme asamasindayim kesin boyledir diyemiyorum)
--------------------
PM0042 de Information block protection (sayfa15) basligi altinda sozu edilen Information block ne ise yarar?
Option Byte register ne ise yarar anlamadim.
(Kendime 2 not)
http://www.youtube.com/watch?v=FKk32FxBNpc (http://www.youtube.com/watch?v=FKk32FxBNpc)
http://www.st.com/web/en/catalog/mmc/FM141/SC1169 (http://www.st.com/web/en/catalog/mmc/FM141/SC1169)
Bugun ilk flash deneme islemini yaptim ve sonuc husran oldu.
Deneme icin Bootloader alanini silmeyi tercih ettim.
Bu alanin ST firmasinca alikonuldugunu falan yazdigi icin nasil olsa silemem ama deneyeyim dedim.
Flashi unlock ettim. Bunun icin hem FLASH_KEYR hem de FLASH_OPTKEYR registerlerine key1 ve key2 degerlerini yukledim.
FLASH_OPTKEYR registerinin aslinda tam olarak hangi alani kitleyip actigini bilmiyorum.
Ardindan Bootloader alani olan0x1FFFF000 adresini FLASH_AR registerine yazdim.
Daha sonra da FLASH_CR den OPTWRE bitini set edip START ettim. (Ne ise yarayacagini bilmedigim bu denemeyi yapmamaliydim)
Daha sonra ne olmustur debug menuden bakayim diye bir klasik usulle Keilden cipe herhangi bir program atmak istedim.
Cip silindi fakat program yukleyemedi. Daha sonraki denemelerde de her defasinda cip silindi fakat program yuklenemedi.
Simdi ben kotu bir sey yaptim. Aslinda OPTWRE ye bulasmadan once siradan sektorlerde calismaliydim.
Su an itibariyle bu cip ne durumda? Kullanilamaz mi neden?
------------------------------
Bir sekilde flasha kod yukleyemiyorum diyelim dedim ve RAMda calisacak cok kisa bir kod yazdim. Scatter filedan da hedef adresi RAM olarak tanimladim.
Derleyip yukle dedigimde No algorithm found for 20000000H - 20000003H hata mesaji aliyorum.
Daha once hic flasha kod yuklemeden dogrudan RAM alanina kod yuklemeyi denedinizmi?
Yaptiysaniz nasil?
Normal sartlarda JTAG ile programlama yaparken JTAG/SWD cihazi muhtemelen kodlari ram alanina yerlestirip buradan kod kosturuyor.
Ben kendi kodumu da rama yazmaya kalkinca belki bir seyler eziliyor. ustelik ramda yaz boz alani vs de gerekiyordur.
Kafadan 0x20000000 e kodumu yerlestir diyince hata olusuyordur.
Tabiki tahmini konusuyorum.
Acil olarak RAM'a kod yerlestirip ramdaki kodu calistirma ornegi lazim. ( C de yazilmisi da olur :)) )
Hocam ramde koşmak istediğiniz fonksiyonların başına __RAM yazıyorsunuz daha sonra bu fonksiyonun bulunduğu *.c dosyasını sağ tıklayıp options penceresine giriyorsunuz
oradaki code/const alanını scatter da ayırmış olduğunuz ram alanlarını gösterin. Scatter ayarlarını hem dosya üzerinden hem target menüsünden ayarlamanız lazım yoksa code/const kısmında göremezsiniz.
ANCAK ram alanını sondan başlayarak ayırın çünkü ramin ilk 200 hex byte'ı (0x20000200) system heap size olarak ayrılır burayı kullanamayız. sizin sorununuz büyük ihtimal ile buradan kaynaklanıyor.
Uygulamada bozduğunuz çip options bytelarina erişimi kapandıysa there is nothing to do geçmiş olsun.
Allah hic kimseyi sevdigi cipinden ayirmasin. (Amin)
Belki ilerlede tekrar lazim olur diyerekten yaptigim kurtarma operasyonunu detayli yazayim.
(Benim kartim STM32F103C8)
J-Link karsi karsi kaldigim durumda beni yolda birakti. Erase ok diyor fakat ardindan programlanama hatasini veriyordu.
J-Link yerine STM32F407 Discovery karti uzerindeki ST-Linki ve ST-LINK-UTILITY kullanarak sansimi denemeye karar verdim.
ST-LINK-UTILITY'i indirdim. http://www.st.com/web/en/catalog/tools/PF258168# (http://www.st.com/web/en/catalog/tools/PF258168#) (Bu dosyayi indirin dursun bir yerlerde)
STM32F407 Discovery de CN3 e takili jumperlari soktum.
CN2 de;
1 numarayi (CN2 yazisina en yakin pin) yi Kendi kartimin 3.3v pinine,
2 numarayi kendi kartimda SWCLK pinine,
3 numarayi kendi kartimda GND ye,
4 numarayi kendi kartimda SWDIO pinine bagladim.
5 ve 6 bosta kaldi.
ST-Link-Utility yi calistirdim memorynin okunamaz oldugunu soyledi.
Option byte read out protection kutucugu enable gorunuyordu. ( Target menude option bytes seceneginde Readout protection)
Bunu disable yaptigimda cipe bir seyler yazdi ve ardindan flashi okudu.
Ardindan kendi J-Link cihazimla kartima baglanmayi ve kod atmayi denedim. Sorunun bittigini gordum.
Yaptigim islem (bu duruma dusmem) Option Byte alanini silmekten ibaretti.
Bu byte ne anlama geliyor neden bu kadar kritik?
Bu alani sildigimde FLASH bitleri 1 oluyor. Bu bitlerin durumunu FLASH_OBR den izleyebiliyoruz. Bit1=1 olursa Readout protection aktif hale geliyor.
Readout protection ne demek? Bunun bizim Level 0,1,2 ile alakasi yok sanirim.
@X_FI
Su rama kod yazma olayi ile ilgili hazir RARlanmis kucuk bir proje yayinlayabilirmisin.
Flasha hic bir sey yazmayan dogrudan RAMA kod yukleyip kosturan bir uygulama ornegi. Oyle ki reset vektoru vs dahi olmasin.
Hocam j-linkde böyle bir durum var evet ben sizi ST-link ile deniyorsunuz sanıyordum.
Level protect seviyelerine ve options bytelerını j-link ile değiştirmenin bir yolunu henüz bulamadım. Belkide clone kullanmamızdan kaynaklanıyordur.
Options byte işlemlerini STM32 için yapabilen tek utility ST-link'dir.
Elinde st-link olmadan STM32 programlayan arkadaşlara duyrulur.
Hocam bunu incelediniz mi?
C:\Keil\ARM\Examples\RamFunction
Inceleyeyim.
Peki burada adi gecen readout protection ne anlama geliyor? Level 0,1,2 ile alakasi varmi?
Madem boyle kolayca koruma kaldirilabiliyor o zaman ne amacla kullaniliyor?
PM0042 sayfa 23 de oylesine deginilmis FLASH_OBR registerinde 4,3,2 bitleri ne anlama geliyor?
4. bit st-by moda girdiğinde watch dog timer tarafından reset atılabilir aktif eder.
3. bit stop moda girildiğinde watch dog timer tarafından reset atılabilir aktif eder.
2. bit reset sonrasında siz kurulumu yapmadan önce watch dog timer ı default ayarlarında aktif eder.*
* Sanıyorum 2 sn idi. program koşmaya başladıktan 2 saniye içerisinde IWDT'yi ya kendi donanımınıza göre initalize edin yada reload yapın.
Hocam korumayı kaldırmak kolay St-link/target/CTRL+B.
Daha öncede söyledik level-2 kaldırılamaz level-1 kaldırılsa bile kod silineceği için çalınamaz.
ST-Link-Utility i ilk kez kullaniyorum. Target menude option bytes seceneginde BOR level diye bir secenek var.
Bu ne anlama geliyor?
Islemcinin dusuk voltaj reset korumasi hocam brown out reset cip klasmanina gore voltaj seviyeleri degisebilir. ornegin level-1 e alirsaniz AVdd 1.8 voltun altina dustugunde reset atar bunu kurarken suna dikkat etmemiz gerekir system_stm32fxx dosyasinda core voltajinin altinda secmemeliyiz cunku core regulatoru her zaman calismasi gerekiyor.
STM32F1 ailesinde Level 0-1-2 koruma yok galiba.
ST-Link-Utility de Read Out Protection penceresinde sadece enable ve disable seçeneklleri var.
Zaten helpde de STM32F0, F2,F3,F4 ve L1 de Level 0,1,2 olduğundan bahsedilmiş.
Bu durumda STM32F1 serisindeki korumanın adı nedir level kaça denk düşüyor?
Bilemiyorum hocam ayrıntılı araştırmak gerekir. Bu options byte ile ilgili bilgiler her yerden çıkabiliyor. Bende STM32L kullanıyorum F serisi hakkında tecrübem hiç yok diyebilirim.
ben ST' nin "flash loader demo " programıyla USART 1 ile
F103 'ün içine kod atıyorum
eğer bu programla read out protection enable edersem
tekrar kod atmak veya içinden çekmek istediğimde
bu işlemci read out protected diye mesaj veriyor ve korumayı kaldırmadan hiçbir işlem yaptırmıyor
korumayı kaldırınca da içindeki kodu siliyor
STM32F10x serisinde protection ayarlama islerini cipin icindeki koda yaptirmak istiyorum.
Yalniz bu sikintili bir islem. Kod oldu olmadi olmadiysa sil bir daha dene mantigiyla program yazmaya korkuyorum.
Gerci STM32F1 serisinde sanki level 2 koruma yok gibi. Yani cipi cope atma durumumuz sanirim yok.
Gene de emin degilim.
Kod ile korumalari aktif etmek icin ornek programiniz varmi?
mesaj birleştirme:: 31 Mart 2014, 23:30:23
AN4246 Uygulama notu STM32L1 icinmis.
STM32F1 icin benzer bir dokuman ariyorum. Belki de yoktur.
Varmi?
PM0075 dokumanında 20.sayfada Table 8. option byte organization da
0x1FFF F800
0x1FFF F804
0x1FFF F808
0x1FFF F80C
adreslerinde option byte değerlerinin saklandığından bahsedilmiş.
Benim işlemcimde bu adreslerde sırsıyla aşağıdaki değerler var.
0x00FF 5AA5
0x00FF 00FF
0x00FF 00FF
0x00FF 00FF
Öte yandan FLASH_OBR adında bir register var. Bu registerde 0x03FF FFFC değeri okuyorum.
Şimdi flashdaki bu 4 adresdeki veriler ne? FLASH_OBR registerinden okuduğum değer ne?
FLASH_OBR registerının default degerini okumuşsunuz şunlar seçili;
ST-BY mod reset özelliği->Açık
STOP mod reset özelliği -> Açık
Software WDT kontrolü -> Açık
Read protect -> Kapalı
Options byte error -> Yok
Okudugunuz diğer byte lar options byte'ın block korumasını seçen registerlar hocam belirli block alanlarını korumaya almanızı sağlıyorlar.
Bugünlerde iyice aptallaştım. Dokümanda yazmış zaten.
0x1FFF F800 da 0x00FF5AA5 yazıyordu.
1) 23 ... 16 bitler FF
2) 7..0 bitler A5
0x1FFF F804 da 0x00FF 00FF yazıyordu.
3) 23 ... 16 bitler FF
4) 7..0 bitler FF
0x1FFF F808 da 0x00FF 00FF yazıyordu.
5) 23 ... 16 bitler FF
6) 7..0 bitler FF
Şimdi
1) deki 0xFF değerini 9...2 bitlerine
2) deki 0xA5 değeri (0xA5 olduğu için 0) (0xA5 olmasaydı 1 olarak) 1 bitine
3) deki 0xFF değerini 25...18 bitlerine
4) deki 0xFF değerini 17...10 bitlerine
31...0 bitleri bu kurala göre dizelim.
000000 - 11111111 - 11111111 - 11111111 - 00
0000 0011 1111 1111 1111 1111 1111 1100 = 0x03FF FFFC
Bu değeri de hatırlarsak FLASH_OBR değerinde okumuştum.
Bu durumda option registerden okunan değerin nasıl oluşturulacağı belli oldu.
Artık ayrı bir toola gerek kalmadan işlemciye kendi kendini programlatıp korumayı devreye alamamız için neden kalmadı.