وقفه‌ی خارجی stm32

با سلام و وقت بخیر خدمت همه‌ی دوستان،
من از میکروکنترلر stm32f103c8 استفاده میکنم. در برنامه ای که نوشتم پس از مدتی کار کردن، وقفه‌ی خارجی میکروکنترلر از کار می افتد و با Reset کردن میکروکنترلر پس از مدتی کار کردن (به میزان قبل) دوباره از کار می افتد.
نکته‌ی عجیبی که وجود دارد این است که تا قبل از اینکه وقفه‌ی خارجی از کار بیفتد، وقفه‌ی خارجی به درستی کار می‌کند.
من مطمئنم که سیگنال وقفه به پایه‌ی میکروکنترلر می رسد.
ولی نمیدانم دلیل از کار افتادن وقفه‌ی خارجی چیست؟!
از دوستانی که در این مورد تجربه یا نظری دارند، خواهشمندم تجربه و نظرات خود را با من به اشتراک بگذارند.
ممنونم

1 پسندیده

سلام پینی که برای وقفه خارجی در نظر گرفتین 5v tolerant هست ؟ اگر نباش با رسیدن ولتاژ بیشتر از تغذیه میتونه عملکردش مختل بشه
موضوع دیگه اینکه در روتین وقفه چه زمانی بیت مربوط به وقفه رو clear میکنین؟ باید وقتی کدهای مربوط به وقفه انجام شد در انتهای روتین وقفه اون رو clear کنین تا اگر پین پشت سر هم تاگل شد یا bounce داشت وسط اجرای کد بیت وقفه یک نشه و روتین وقفه دوباره اجرا بشه.

5 پسندیده

سلام، ممنون از واکنش شما
اول اینکه پینی که برای وقفه‌ی خارجی درنظر گرفتم 5V tolerant هست و همچنین سیگنال وقفه‌ی من سطح 3.3 ولت دارد.
دوم اینکه در انتهای زیرروال وقفه فلگ مربوطه رو صفر میکنم.
همچنین مقادیر هیپ و استک را دو برابر کردم ولی تفاوتی حاصل نشد.

1 پسندیده

بدون خوندن برنامه نمیشه فهمید مشکل از کجاست.
راه کار اصلی: استفاده از دیباگر هستش.
این قسمتی که میگی: “بعد از Reset میکرو پس از مدتی کار کردن به (میزان قبل)” یه نکته داره:
و اونم اینه که به احتمال خیلی قوی یا از اون لحظه دیگه سیگنال واسه میکرو ارسال نمیشه یا اینکه برنامه تشوته شده دارای یه مشکلی هست
کلا هر وقت یه باگی داره سر یه زمان تقریبا مشخص اتفاق میفته بیشترین توجه رو به سمت خود برنامه میبره.
یه وقت جایی وقفه مربوط به اون پایه رو غیر فعال نکردی؟ یا وقفه سراسری یا از این قبیل مسایل.

2 پسندیده

سلام خیلی ممنون از واکنش شما،
امکان دیباگ به دلایلی واسم سخته ولی انگار چاره ای جز این ندارم.
دقیقا برنامه سر یه زمان مشخص دیگه وقفه ی خارجیش کار نمیکنه.
نکته ی عجیب اینکه فرض کنید از کامپیوتر یه سری دیتا میفرستم واسه میکروکنترلر و میکروکنترلر اونا رو پردازش میکنه و … و همه چی درست کار میکنه ولی بعد از 1 ثانیه ی دیگه که دوباره همون اطلاعات رو میفرستم واسه میکروکنترلر بعد از دریافت و پردازش که منتظر وقفه ی خارجی هست، با اینکه وقفه واسش میاد ولی دیگه وقفه نمیخوره.
برنامه رو هم بار ها چک کردم بنظر مشکلی نیست. وقفه ی سراسری هم غیر فعال نکردم، همچنین وقفه ی UART به خوبی کار میکنه و میکروکنترلر به خوبی دستورات رو اجرا میکنه ولی وقفه ی خارجی کار نمیکنه. :frowning:

اگر امکان دیباگ با پروگرامر نیست دو پین خروجی کنین، یکی با خوندن GPIO اون پین متصل به وقفه خارجی در while تاگل بشی یکی دیگم در روتین وقفه تاگل بشه. ببینین مشکل از io هست یا فلگ های وقفه
و اینکه ببینین چه حالتی پیش میاد که سریعتر از کار بیوفته

2 پسندیده

همینطور که دوستان گفتن پیش برید و به حالت های خاصی که منجر به Fault ها ممکنه بشه هم توجه داشته باشید…درصورت امکان برنامه رو در یک میکروکنترلر دیگری نیز اپلود کنید و نتیجه رو اعلام کنید.

1 پسندیده

دیباگ کردن میکرو های arm خیلی سادست.
اگر برای دیباگ مشکلی داشتی یه پرسش دیگه واسش باز کن دوستان سریع کارت رو راه میندازن

3 پسندیده

همونطور که گفتین دو پین رو خروجی کردم، و هر دو رو تاگل (یکی در زیرروال وقفه و یکی هم در حلقه ی while با خواندن پین وقفه ی خارجی) ولی هیچ کدام تاگل نشدند. بنظر مشکل از io هست.

1 پسندیده

خیلی ممنون، ولی از کجا متوجه بشم که Fault داده میکرو، چون میکرو داره بقیه ی دستورات رو بدرستی انجام میده؟!
برنامه رو هم روی یک میکروی دیگه آپلود کردم و نتیجه مشابه بود.

پس الان که مشکل مربوط به io هست دو رجیستر
port configuration register
port input data register
رو توسط یه پورت مثل uart پرینت کنین یا با نمایشگر نشون بدین، ممکنه یک جای دیگه برنامه به خاطر سر ریز شدن یا … روی این رجیسترها رایت کنه

1 پسندیده

سلام مجدد،
خیلی ممنون از راهکار شما، با خوندن ریجستر های PCR و IDR (از طریق دیباگ) متوجه اشتباهم شدم. اشتباهم این بود که در جایی از برنامه به اشتباه رجیستر های io مقدار دهی می‌شدند.
باز هم ممنون از شما و بقیه‌ی دوستان.

یه چیز جدید هم متوجه شدم، اینکه موقع دیباگ، تایمر واچداگ رو خاموش کنم :sweat_smile:.

5 پسندیده