
چرا پروگرامر ST-Link میکروکنترلر STM32 را نمیشناسد؟
قفل شدن حافظه، اشتباه در پایههای SWD، نیاز به فشردن دکمه Reset
اگر از توسعهدهندگان و علاقهمندان به میکروکنترلرهای قدرتمند STM32 باشید، احتمالاً حداقل یک بار با خطای روی اعصاب “No target connected” یا “Target not found” مواجه شدهاید. شما کدتان را نوشتهاید، کامپایل بدون خطا انجام شده، اما به محض اینکه دکمه دانلود (Download) یا دیباگ (Debug) را میزنید، پروگرامر ST-Link میکروکنترلر شما را نمیشناسد!
این مشکل معمولاً به معنای خرابی میکروکنترلر یا پروگرامر شما نیست. در بیشتر مواقع، دلیل این اتفاق یکی از سه مورد اصلی زیر است: اشتباه در اتصالات سختافزاری، قفل شدن حافظه (یا تغییر کاربری پایههای دیباگ در کد قبلی) و یا نیاز به ریست سختافزاری.
در این پست وبلاگ، این سه دلیل اصلی را بررسی میکنیم و راهحلهای عملی برای زنده کردن دوباره میکروکنترلر STM32 شما ارائه میدهیم.
۱. اشتباه در اتصال پایههای SWD (Serial Wire Debug)
رایجترین و پیشپاافتادهترین دلیل عدم شناسایی میکروکنترلر، اتصالات اشتباه است. پروگرامرهای ST-Link برای ارتباط با STM32 از پروتکل SWD استفاده میکنند که به حداقل ۳ (یا ۴) سیم نیاز دارد.
چه چیزی را باید بررسی کنید؟
- پایه SWDIO (دیتا): این پایه باید دقیقاً به پین SWDIO روی میکروکنترلر (معمولاً PA13) متصل شود.
- پایه SWCLK (کلاک): این پایه باید به پین SWCLK میکروکنترلر (معمولاً PA14) وصل باشد.
- پایه GND (زمین): اتصال زمین پروگرامر باید حتماً به زمین برد میکروکنترلر متصل باشد. بدون مشترک بودن GND، هیچ ارتباط دیتایی برقرار نمیشود.
- تغذیه (3.3V): مطمئن شوید که میکروکنترلر روشن است. اگر برد شما تغذیه خارجی ندارد، پین 3.3V پروگرامر ST-Link را به پایه VCC/3.3V میکرو وصل کنید. (دقت کنید که به پین 5V وصل نکنید، مگر اینکه برد شما رگولاتور داشته باشد).
نکته طلایی: گاهی اوقات کابلهای جامپر (Jumper Wires) از داخل قطعی دارند. اگر از اتصالات خود مطمئن هستید، کابلها را عوض کنید.

۲. قفل شدن حافظه و غیرفعال شدن دیباگ (رایجترین کابوس نرمافزاری!)
بسیاری از مواقع، شما یک بار میکرو را با موفقیت پروگرام میکنید، اما برای بار دوم ST-Link آن را نمیشناسد! چرا این اتفاق میافتد؟
دو دلیل عمده برای این حالت وجود دارد:
- تغییر کاربری پایههای دیباگ در کد شما: پینهای PA13 و PA14 به طور پیشفرض برای SWD تنظیم شدهاند. اگر در کد قبلی خود (مثلاً در نرمافزار STM32CubeMX) به اشتباه گزینه Debug را روی حالت Serial Wire تنظیم نکرده باشید، یا از این پینها به عنوان GPIO خروجی/ورودی استفاده کرده باشید، میکروکنترلر بلافاصله پس از روشن شدن، ارتباط پروگرامر را قطع میکند.
- قفل شدن حافظه (Readout Protection – RDP): اگر سطح محافظت از حافظه را تغییر داده باشید، پروگرامر اجازه دسترسی به میکرو را نخواهد داشت.
راهحل چیست؟ باید میکروکنترلر را در حالتی پروگرام یا پاک (Erase) کنید که هنوز کد مخربِ قبلی اجرا نشده باشد. این کار ما را به مرحله سوم میرساند.
۳. نیاز به فشردن دکمه Reset (ترفند Connect Under Reset)
وقتی پایههای دیباگ غیرفعال شدهاند یا میکرو در حالت خواب عمیق (Deep Sleep) گیر کرده است، تنها راه نجات استفاده از پین ریست سختافزاری (NRST) است. با نگه داشتن میکروکنترلر در حالت ریست، هسته پردازشی متوقف میشود و کد مخربِ داخل حافظه اجرا نمیشود، در نتیجه پایههای SWD در حالت پیشفرض خود باقی میمانند و پروگرامر میتواند به آن متصل شود.
مراحل انجام این ترفند جادویی:
- نرمافزار STM32CubeProgrammer (یا ST-Link Utility قدیمی) را باز کنید.
- در تنظیمات اتصال (در سمت راست تصویر)، حالت Mode را روی Under Reset تنظیم کنید.
- پین NRST (ریست) روی پروگرامر ST-Link را به پین Reset روی برد STM32 متصل کنید.
- اگر پروگرامر شما پین ریست ندارد (مثل بعضی از دانگلهای ST-Link V2 چینی):
- دکمه Reset روی برد STM32 را با دست فشار دهید و نگه دارید.
- در نرمافزار روی دکمه Connect کلیک کنید (یا در محیط برنامه نویسی خود دکمه Download را بزنید).
- حدود نیم ثانیه بعد از کلیک، دکمه Reset روی برد را رها کنید.
- پس از اتصال موفق، به بخش “Erase & Programming” بروید و گزینه Full Chip Erase را بزنید تا کل حافظه (و کد مشکلدار) پاک شود.
حالا میکروکنترلر شما مثل روز اول خام شده و به راحتی پروگرام میشود!
جمعبندی
خطای عدم شناسایی میکروکنترلر STM32 توسط ST-Link معمولاً با چک کردن چند مورد ساده حل میشود. ابتدا از درستی اتصالات پایههای SWD و تغذیه مطمئن شوید. اگر اتصالات درست بود، احتمالاً در کد قبلیِ خود، پایههای دیباگ را غیرفعال کردهاید. در این صورت، با استفاده از نرمافزار STM32CubeProgrammer و تکنیک نگه داشتن دکمه Reset حین اتصال، حافظه تراشه را کاملاً پاک (Erase) کنید.
فراموش نکنید که همیشه در تنظیمات اولیه پروژههای خود (مخصوصاً در STM32CubeMX)، در بخش SYS، گزینه Debug را روی Serial Wire قرار دهید تا دیگر هرگز با مشکل قفل شدن پایههای پروگرامر مواجه نشوید!
آیا شما هم تجربه مشابهی با این خطا داشتهاید؟ کدام روش مشکل شما را حل کرد؟ نظرات خود را با ما در میان بگذارید.



