Halt شدن STM32F103

سلام

تو While(1) اینها رو دارم:

ابتدای برنامه تایع چک کردن کیپد رو درج کردم که هر دکمه ای از کیپد فشرده شد بفهمم و در کتابخونه هم هیچ وقفه سخت افزاری ندارم خیلی ساده 4 تا ردیف و نوبتی 1 میکنم و نوبتی 4 ستونش رو میخونم (خلاصه گفتم)

سناریوی اول یعنی فعال شدن DMA در حالت Circular اجرا میشه جهت دریافت پیامک از ماژول SIM800 و ادامه ی ماجرا جهت تحلیل و فرمان به خروجی و غیره که خود این سناریو تو یک شرط قرار داده شده.

سناریوی دوم رو گذاشتم بر این بنا که اگر دکمه ای از Keypad فشرده شد بره تو یک شرط در انتهای همون while(1) که اونجا وارد مد دستی بشیم و نور LCD فعال شه و غیره

مشکل اینجاست که گاهی بمحض ورود به مد دستی و گاهی بعد از مدتی برنامه از حلقه while (1) میپره بیرون تو main() و میکرو به Halt عظمی میره و تا ریست نکنم و دوباره بوت رو با ST Link Utility با ژانگولر بازی رو مدهای Core Reset و غیره بالا نیارم میکرو شناسایی نمیشه.

چی میشه که از حلقه while میپره بیرون در اون شرط ؟!
وقفه سخت افزاری؟
چند تا دارم که در سناریوی اول مثل ساعت بدون مشکل کار میکنند و الویت بندی شده هم هستند!

LCD 128X64 Graphical KS108 Driver هستش که کتابخونش رو خریدم از سایتی و بارها در نرم افزارهای مختلف ازش استفاده کردم بدون مشکل !

Keypad 4x4 هستش و کتابخانش خیلی پیچیدگی نداره و بدون مشکل کار میکنه نمیدونم چی میشه در اون قسمت دوم که میکرو از حلقه while خارج میشه با ورود به اون که البته گاهی اوقات مدتی طول میکشه و بعد از مدتی این اتفاق میفته در زیر منوها …
بدیش اینه که نقطه ی خاصی نیست که بگم به اونجا که رسیدم اینطوری میشه یک وقتها به محض ورود به سناریوی دوم گاهی هم بعد از چند دقیقه کار کردن و ورود به زیر منوها !

(معمولا زمانی هالت میشه که دستم رو دکمست و در حالت Debug mode نرم افزار Keil هستم)

مدل میکرومم بالا نوشتم ! اورجیناله !
چجور میشه اینجا متن انگلیسی رو چپ پین نوشت؟ نتونستم وگرنه شبه کد مینوشتم…
باتشکر

1 پسندیده

سلام. در مورد مشکلتون متاسفانه نظری ندارم :frowning:
اما برای چپ چین شدن میتونید اینطوری بنویسید که البته مخصوص کد هست ولی خب…

your text
1 پسندیده

امروز کتابخانه کیپد رو حذف کردم و 4 تا ردیف رو یک میکنم با وقفه سخت افزاری کلید رو با اسکن میخونم، شبه کدش این شده:

 main(){
set output;
scan_kpad();
while(1){
if(key==0){...}
else{...}
}
}

توی اون else مقادیر کیپد اسکن میشه و رو LCD نمایش داده میشه و برنامه کلا از شرط اول میاد بیرون اما گاهی موقع فشردن کلید میپره بیرون از while و اون خروجی که ابتدا فعال کردم تو تابع اصلی قبل از while شروع میکنه به دائما قطع و وصل کردن عین حالت اینکه برنامه دیگه داخل While نشه و دائما همونجا بمونه و قطع و وصل کنه …
:smiling_face_with_tear:

یافتم !
از سوراخی گزیده شدم که بارها قبلا گزیده شدم ولی معلوم نیست کی قراره آدم شم !
وقتی میگی یک تسته دیگه بزار رو برد بورد ببندم ببینم چی میشه حالا …
نتیجه سوار کردن LCD با اون پایه های حساس که از کتابخانه کنترل میشند و در حالت عادی Float هستند معمولا بهمراه کیپدی که داری با سرعت بالا رفرشش میکنی بعلاوه ی سیم های نازک برد بوردی بدرد نخور و خود برد بوردی که خونه های زیرش بعضی هاش سست شده و اصلا اتصال نداره میشه اینکه یک روز کامل وقتت اینطوری به چخ میره …
سیم های مفتول خشک رو مستقیم لحیم کردم به سر کیپد و اتصالات LCD رو تقویت کردم درست شد عین ساعت سوئیسی کار میکنه برنامه.
گفتم بزار بگم چطور این مشکل بزرگ با یک راه حل مسخره حل شد بلکه شما نکنید از این کارا …

3 پسندیده