STM32F103XXX Flash programlama - Protection

Başlatan z, 26 Mart 2014, 14:27:02

z

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.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?


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

SpeedyX

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.

z

Bootloaderın yerleştiği page'i hiç bir şekilde silemiyormuşuz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

X-Fi

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.

http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

z

Protection seviyelerini detaylı anlatan doküman varmı?

2 seviyesinde koruma yaparsam, çipi silip yeni baştan da mı programlayamıyorum?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

X-Fi

#5
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

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.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

z

#6
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.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

X-Fi

#7
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.

http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

z

#8
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?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

X-Fi

#9
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.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

z

#10
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.st.com/web/en/catalog/mmc/FM141/SC1169
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#11
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  :)) )
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

X-Fi

#12
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.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

z

#13
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#   (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.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

X-Fi

#14
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
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)