STM32 CubeIDE – SWD FLASH PROBLEMİNİ AŞMAK

STM32 Projelerimde ST Link V2 yi SWD (Serial Wire Debug) modunda çalıştırarak kullanıyorum.

ST Link ve STM32 yi elime ilk aldığım dönemlerde, kullandığım geliştirme kitlerinden bir kaçı aniden program yüklenemez hale gelmişti. Yükleme yapmaya kalkıştığımda “No device found on target” şeklinde bir mesaj almaya başlamıştım. Ben de “bunlar bozuldu” diyerek bu kitleri bir kenara koymuştum.

Sonradan öğrendim ki, bozulmamışlar. Hatalı bir kod yükleyerek ben kilitlemişim. Bunları tekrar hayata döndürmenin basit bir yöntemi varmış. Aşağıda anlatacağım bu yöntemi önceleri ST Link Utility adlı uygulamayı kullanarak uyguluyordum. Ama artık MacOS ye geçtim, bu uygulama ise sadece Windows için var. O halde aynı işlemi STM32 CubeIDE platformu üzerinden yapmanın bir yolu olmalı. İşte aşağıda o yöntemi anlatıyorum.

Bilindiği gibi STM32 Mikro Kontrolcüye STLINK V2 ile SWD (JTAG Serial Wire Debugger) arayüzü üzerinden program yüklerken kullandığımız pinler aşağıdaki 4 terminalden ibaret :

  • GND — ST Link Pin 4,6,8 .. 20
  • A13/SYS_JTMS-SWDIO — ST Link Pin 7
  • A14/SYS_JTDK-SWCLK — ST Link Pin 9
  • Vcc 3V3 — ST Link Pin 1/2

Sadece 4 tel üzerinden hem kod yükleme hem de Debug işlemlerini yapabiliyoruz. Ancak zaman zaman bir hata yapıp, A13 ve A14 GPIO larını başka işlevler için konfigüre etmiş olabiliyoruz. Ben bunu genelde kazara yapıyorum, örneğin henüz SWD yapılandırması yapılmamış bir kodu yükleyerek. Örneğin aşağıdaki gibi :

Hiç birşey, ama özellikle SWD yapılandırması yapılmadan oluşturulan kodu MCU ya yüklediğinizde bir sorun yokmuş gibi görünür. Ama ardından yeni bir yükleme yapmaya kalkıştığımızda sorun yaşarız.

Yukarıdaki örnekteki gibi SWD ayarı yapılmadan oluşturulan bir projede ilk yüklemede bir sorun olmaz. Ama bunu izleyen ilk yüklemede işler kilitlenir.

Bazan da bu GPIO ları programızda başka amaçlarla kullanmaya kalkışmış olabiliriz. Yine bu kodu MCU ya ilk yüklediğimizde her şey güzel gider, bundan sonraki yüklemede sorun baş gösterir.

“NO DEVICE FOUND ON TARGET” HATA MESAJI

İşte bu durumlarda, MCU yu yeniden SWD üzerinden programlamaya kalktığımızda “No Device Found on Target” hata mesajı ile karşılaşıyoruz.

SORUNU AŞMANIN YOLU

ÖNCE ST Link’e İLAVE BİR BAĞLANTI DAHA YAPALIM : RESET/NRST

Burada anlatacağım çözümün çalışması için ST_Link’in MCU nun NRST pinini “0” a çekerek Hard Reset altında tutabilmesi gerekiyor. O nedenle yukarıda belirttiğim 4 tele ilaveten MCU NRST pininin de bir jumper kablo ile ST Link’in RESET pinine bağlanması gerekiyor.


RESET pini ST Link 20 li konektörü üzerinde 15 nolu olanı.

STM32 CubeIDE İÇİNDE DEBUG KONFİGÜRASYON AYARLARINDA DEĞİŞİKLİK

RESET bağlantısı yapıldıktan sonra STM32 Cube IDE içinde yapılacak işlemlere geçebiliriz. Debug alt menüsünde Debug Configurations … seçeneği tıklanır.

Bu seçenek tıklandığında açılan pencerede Debugger parametrelerinde değişiklik yapacağız. Öyle ki, ST Link kod yüklerken MCU’yu HARD RESET konumunda tutsun.

IDE-STM32 Cortex-M C/C++ Application altında açılan pencerede Debugger sekmesi açılır.

Burada Reset Behaviour bölümündeki Type menüsü altında, varsayılan olarak Software System Reset seçilmiş bulunur. Bunu Connect Under Reset seçeneği ile değiştiriyoruz.

Bundan sonra “Debug” tuşlanarak MCU ya yükleme yapılabilir.

ANCAK TEKRAR HATIRLATAYIM : Bunun çalışması için ST Link in RST telinin MCU nun NRST pinine bağlanmış olması gerekir.
Başlarda ben bu bağlantıyı yapmaksızın, program yükleme süresince MCU yu manuel olarak Reset altında tutuyordum. Ama NRST’e bazan geç basmak, kimi zaman erken bırakmak gibi sıkıntılar yaşadığımdan bu işi ST Link’e bırakmanın en iyisi olduğunu gördüm.

Bu yayının sonu – Selçuk Özbayraktar Ağustos 2020