آموزش رجیستری STM32: اینتراپت ها

  • فرق اینتراپت و ایونت چیه؟
  • وقتی یک اینتراپت اتفاق افتاد میکروکنترلر چجوری میفهمه چه تابعی رو باید فراخوانی کنه؟
  • مدیریت اینتراپت یعنی چی و در تابع IRQHandler چه چیزهایی باید نوشته بشه؟
  • تابع callback چیه؟
اینها سوالاتی هست که جوابشو در این مقاله میگیرید.

 

 

 

فهرست

– اینتراپت و ایونت

– بررسی جدول اینتراپت ها از دیتاشیت STM32F1

– فراخوانی تابع IRQHandler در میکروکنترلر STM32

– مدیریت اینتراپت و نوشتن تابع IRQHandler در STM32

اینتراپت و ایونت در میکروکنترلر STM32

ایونت ها در میکروکنترلر های STM32

ایونت یعنی اتفاق ، یک واقعه در یکی از پریفرال های میکروکنترلر ، مثلا یک لبه ی بالارونده یا پایین رونده روی یک پین در پریفرال EXTI میتونه ایونت بسازه یا ریلود شدن رجیستر کانتر در پریفرال تایمر ، یا پرشدن دیتا رجیستر USART در نتیجه ی دریافت داده جدید. یک اونت ممکنه کار های مختلفی انجام بده مثلا:

– بعضی ایونت ها میتونن میکروکنترلر رو از حالت sleep خارج کنن

– ایونت میتونه از یک پریفرال به پریفرال دیگه یک سیگنال ارسال کنه ، مثلا یک پریفرال به پریفرل DMA یک پالس میفرسته که DMA بره داده رو جابجا کنه

– ایونت میتونه فلگ اینتراپت رو یک کنه تا در صورتی که اینتراپت فعال شده باشه درخواست اینتراپت به پریفرال NVIC ارسال بشه

اینتراپت چیه؟

اینتراپت یعنی وقفه در عملکرد CPU . فرض کنید یکی داره حرف میزنه بعد یکی دیگه میپره وسط حرفش ، در زبان انگلیسی به پریدن وسط حرف دیگران میگن اینتراپت . اینتراپت میکروکنترلر هم شبیه همینه ، فرض کنید CPU داره یک کدی رو اجرا میکنه ، وقتی اینتراپت اتفاق بیافته CPU باید اجرای کد رو رها کنه و بره تابع IRQHandler مربوط به اون اینتراپت رو اجرا کنه، بعد از تموم شدن اجرای تابع CPU برمیگرده و کدی که داشته اجرا میکرده رو ادامش رو اجرا میکنه.

جدول اینتراپت ها برای میکروکنترلر های STM32

در جدول زیر هر سطر معرف یکی از اینتراپت های میکروکنترلر STM32 هست، تا Systick اینتراپت های CPU و از WWDG به بعد اینتراپت های پریفرال های میکروکنترلر هستند. برای همه ی میکروکنترلر های STM32 میتونید این جدول رو در رفرنس منوال پیدا کنید.  در این بخش قراره ستون های این جدول رو بررسی کنیم.

 

آموزش STM32 ، جدول اینتراپت ها

شماره ی اینتراپت ها در میکروکنترلر های STM32

ستون اول با نام position شماره ی اینتراپت یا ID هست. همونطور که میبینید اینتراپت های CPU شماره ندارند (البته دارند و شمارشون منفی هست ، ولی اینجا ننوشته ) و شماره ی اینتراپت های پریفرال های میکروکنترلر از صفر شروع میشه. بیت های مربوط به فعالسازی اینتراپت ها در رجیستر های ISER پریفرال NVIC ، غیر فعالسازی در رجیستر های ICER پریفرال NVIC و .. به ترتیب همین شماره اینتراپت چیده شدن. توابع CMSIS که برای تنظیمات اینتراپت ها وجود دارند، برای اینکه بفهمن برای تنظیمات هر اینتراپت چه بیتی رو باید تغییر بدن یک ورودی از نوع IRQn_Type دارند ، که همین شماره اینتراپت هست.

 

اولیت پیش فرض اینتراپت ها در میکروکنترلر های STM32

ستون دوم اولویت پیش فرض هست که از -3 برای reset شروع شده و بالا رفته و برای هر اینتراپت یک عدد متفاوت هست. برای هر اینتراپت چهار بیت در رجیستر های IPR پریفرال NVIC داریم ، برای مشخص کردن اولیت. اگر عددی که در اون چهار بیت مینویسیم برای دو اینتراپت برابر باشه و اون دو اینتراپت همزمان اتفاق بیافتن، اون اینتراپتی اجراش اولویت داره که عددی که در ستون دوم این جدول داره کمتر باشه.

 

نوع اولیت اینتراپت ها در میکروکنترلر های STM32

ستون سوم نوع اولویت هست که فقط برای Reset ، NMI و HardFault مقدارش fixed هست و برای بقیه settable . یعنی بجز برای سه تا اینتراپت اول میشه اولویت رو تنظیم کرد. سه تا اینتراپت اول اولیتشون قابل تغییر نیست.

ستون چهارم و پنجم به ترتیب اسم و توضیحات خلاصه در مورد اینتراپت هست.

 

آدرس توابع IRQHandler برای اینتراپت های میکروکنترلرهای STM32

اسم ستون ششم آدرس هست و در این ستون برای هر اینتراپت یک آدرس نوشته شده. این آدرس ها از 0x4 شروع شدن و چهار تا چهار تا زیاد میشن. در هر کدوم از این آدرس ها ، آدرس تابع IRQHandler اینتراپت مربوطه ذخیره میشه. اینجوری هست که میکروکنترلر میدونه وقتی یک اینتراپت اتفاق میافته کدوم تابع IRQHandler رو باید فراخوانی کنه.  

فراخوانی تابع IRQHandler در میکروکنترلر STM32

در این بخش بررسی میکنیم قبل از اینکه تابع IRQHandler برای یک اینتراپت فراخوانی بشه چه اتفاقاتی میافته. قبلش باید با چند تا مفهوم رو براتون توضیح بدم. 

منبع اینتراپت

الان میخوام با یه مثال بهتون بگم که چجوری یک اینتراپت میتونه چند تا منبع داشته باشه. در جدول اینتراپت ها برای تایمر 2 فقط یک سطر وجود داره ، یعنی تایمر 2 فقط یک اینتراپت داره و اگر اینتراپتش اتفاق بیافته تابع TIM2_IRQHandler فراخوانی خواهد شد.

 

ایتراپت تایمر 2 در جدول اینتراپت ها

 

ولی در پریفرال تایمر دو ، شش اتفاق میتونن باعث ارسال درخواست اینتراپت به پریفرال NVIC بشن ، یعنی تایمر دو ، 6 تا منبع اینتراپت داره ولی فقط یک اینتراپت در پریفرال NVIC داره، یعنی برای هر 6 درخواست اینتراپت یک تابع IRQHandler داریم ، تابع TIM2_IRQHandler. برای فعالسازی هر کدوم از شش منبع اینتراپت در پریفرال تایمر 2 یک بیت در رجیستر DIER این پریفرال داریم ، با یک کردن این بیت درخواست اینتراپت مربوطه فعال میشه. همچنین اینتراپت تایمر 2 یک بیت فعالسازی هم در پریفرال NVIC داره. 

 

آموزش stm32 بیت های فعالسازی اینتراپت های تایمر 2

 

فلگ اینتراپت

در پریفرال تایمر دو 6 منبع اینتراپت داریم و هر کدوم یک بیت فلگ اینتراپت دارند . سخت افزار بیت فلگ رو در نتیجه وقوع اتفاقی که قراره اینتراپت تولید کنه یک میکنه. در پریفرال تایمر دو ، 6 اتفاق میتونن منجر به ارسال درخواست اینتراپت بشن ، هر کدوم از این اتفاق ها بوقوع بپیونده ، فلگ مربوطه یک میشه. 

 

آموزش stm32 ، فلگ های اینتراپت های تایمر 2 در رجیستر TIM_SR

 

ویژگی مشترک تمامی فلگ های اینتراپت در تمامی منابع اینتراپت پریفرال ها این هست که فقط سخت افزار میتونه فلگ ها رو یک یا set کنه و فقط نرم افزار ( نرم افزار یعنی کدی که ما مینویسیم ) میتونه فلگ رو صفر یا clear کنه. 

صفر کردن فلگ درخواست های اینتراپت به شکل های متفاوت انجام میشه ، فقط دقت کنید که تغییر بیت های فلگ باید atomic باشه ، یعنی وقتی یک فلگ رو صفر میکنید نباید بقیه ی فلگ ها تاثیری ببینند.برای صفر کردن فلگ ها از عملگر های &= و |= استفاده نکنید. 

 

جمع بندی وقایع قبل از فراخوانی تابع IRQHandler

1- اتفاقی که قراره باعث ارسال درخواست اینتراپت بشه در پریفرال رخ میده و فلگ اینتراپت رو یک میکنه. مثلا در پریفرال تایمر2 کانتر ریلود میشه ، این ایونت فلگ UIF در رجیستر TIM2_SR رو یک میکنه

2- وقتی فلگ یک شد ، در صورتی که درخواست اینتراپت رو فعال کرده باشیم ، درخواست اینتراپت به پریفرال NVIC ارسال میشه. مثلا برای فعالسازی درخواست اینتراپت آپدیت تایمر 2 باید بیت UIE در رجیستر TIM2_DIER یک بشه.

3- بعد از ارسال درخواست اینتراپت به پریفرال NVIC در صورتی که در پریفرال NVIC ، اینتراپت تایمر 2 رو در رجیستر ISER0 فعال کرده باشیم ، اینتراپت به حالت pending میره ، یعنی میره در صف اجرا.

مدیریت اینتراپت در STM32 ، نوشتن تابع IRQHandler و فراخوانی تابع callback

تابع callback چیه؟ 

ما به این علت از اینتراپت استفاده میکنیم چون اینتراپت در کد به ما اطلاع میده که ایونت های خاص کی اتفاق میافتن و ممکنه بخواهیم بعد از رخ دادن ایونت های مشخص با اجرای یک کد به اون اتفاق رسیدگی کنیم. مثلا بعد از آپدیت ایونت در تایمر باید تابعی اجرا بشه تا به این اتفاق رسیدگی کنه، اسم این تابع ، callback هست.

هر اینتراپت یک تابع IRQHandler داره ، هر منبع اینتراپت یک تابع callback داره. مثلا برای پریفرال تایمر 2 فقط یک اینتراپت داریم با تابع TIM2_IRQHandler و در این پریفرال 6 منبع اینتراپت وجود داره که هر کدوم یک تابع callback دارند.

 

در تابع IRQHandler چه کارهایی باید انجام بشه

استراتژی نوشتن تابع IRQHandler برای هر اینتراپت متفاوت هست ، ولی بصورت کلی 3 مرحله داره:

1- پیدا کردن منبع اینتراپت : در قدم اول باید بفهمیم کدوم یکی از منابع اینتراپت باعث فراخوانی تابع IRQHandler شده ، برای پیدا کردن منبع اینتراپت مذکور باید فلگ های اینتراپت و بعضی وقتها بیت های فعالسازی منابع اینتراپت رو چک کنیم.

2- صفر کردن فلگ : اگر برای یکی از منابع اینتراپت ، فلگ یک بود و بیت فعالسازی درخواست هم یک بود ، به این معنی هست که درخواست از طرف اون منبع اینتراپت ارسال شده ، قدم دوم این هست که فلگ اینتراپت رو که توسط سخت افزار یک شده رو در کد صفرش کنیم.

3- فراخوانی تابع callback : بعد از پیدا کردن منبع اینتراپت و صفر کردن فلگ منبع اینتراپت باید تابع callback مربوط به اون درخواست اینتراپت رو فراخوانی کنیم.

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

پیمایش به بالا