استفاده از gpio interrupt (وقفه) در freeRTOS برای STM32

من یه پروژه با bluepill انجام دارم میدم و توی کدنویسیم از freeRTOS کمک گرفتم بر برنامه رو بر اساس اون دارم مینویسم.
در حال حاضر توی برنامم 4 تا تسک دارم که و دارم حافظه stack کم میارم یکی از دلایلش هم اینه که مثلا یه تسک صرفا برای خوندن یه gpio و بررسی وضعیتش ایجاد کردم.
اون gpio هم به flow meter وصله و باید صرفا لبه های پالس رو بشماره که بتونم حجم آب جابجا شده رو اندازه گیری کنم

حالا میخوام ببینم چطوری میتونم این تسک رو حذف کنم و با کمک وقفه این gpio رو بخونم که نیازی به تسک جدا نداشته باشه

سلام،
خب اول از همه اینکه طبق چیزی که گفتید بهترین روش به نظر همون استفاده از وقفه باشه و FreeRTOS و ایجاد تسک کار بهینه‌ای نباشه. اما با این حال این که شما به مشکل حافظه stack برخوردید احتمالاً به خاطر عدم مدیریت صحیح حافظه و تخصیص غیر بهینه‌ی stack به تسک‌هاتون بوده. مثلاً برای کاربرد خواندن GPIO شما نیاز به حافظه‌ی زیادی ندارید. اما؛
در مورد استفاده از وقفه دقیقاً متوجه نشدم مشکل شما کجاست. شما میتونید خودتون و یا با استفاده از stm32cubemx پایه‌های مورد نظر رو به صورت وقفه تعریف کنید و حالت تریگ رو هم بذارید لبه بالا رونده (و یا پایین رونده، بسته به نیازتون) وقفه‌ی سراسری رو هم فعال میکنید و از اون به بعد روتین وقفه هر زمان پایه تریگ بشه فراخوانی میشه. برای جزئیات بیشتر میتونید از آموزش همین مورد در سیسوگ استفاده کنید.
با استفاده از توابع LL:
https://sisoog.com/2020/11/25/آموزش-stm32-با-توابع-ll-قسمت-هفتم-interrupt/

با استفاده از توابع HAL:
https://sisoog.com/2022/09/12/آموزش-stm32-با-توابع-hal-قسمت-7-وقفه-ها-در-hal-و-external-interru/

این سایت خارجی هم ممکنه کمک کننده باشه:

1 پسندیده

من فکر میکنم که وقفه ها تداخل داشته باشه با freeRTOS
من از وقفه یوآرت استفاده کردم ولی دیدم که بعد از یه بار فعال شدن وقفه یوآرت دیگه freeRTOS کارنکرد و هنگ کرد
البته برای GPIO رو تست نکردم هنوز
مثلا برای توقف هم میتونیم از hal_delay استفاده کنیم و کار میده اما روش درستش استفاده از osDelay هست

سلام
برای اینکه مشکل هنگ کردن تون با uart حل بشه باید Flag Intterup (پرچم وقفه ) رو موقع دریافت وقفه بخونید و سپس غیر فعال کنید.(اگر در فانکشن Call Back وقفه دریافتی سریال چیزی قرار ندید و خالی باشه میکرو کنترلر به Hardfualt میره و هنگ میکنه )

2 پسندیده

این مساله میتونه به دلیل اولویت وقفه هم باشه
اگر اشتباه نکنم وقفه های شما باید اولویت کمتری نسبت به اولویت اسکجولر سیستم عامل داشته باشن
Understanding priority levels of ISR and FreeRTOS

چرا از تایمر برای خواندن تعداد پالس ورودی استفاده نمی کنید ؟ اینطوری دیگه نیازی هم به اینتراپت ندارید

3 پسندیده