سلام دوستان. سیسوگ در مقاله پنجم آموزش میکروکنترلر STM32 ، آموزش داد که چطور چند وقفه خارجی در برنامه داشته باشیم و چطور باید آنها از یکدیگر تفکیک کنیم. در این مقاله در ابتدا، تنظیم لبه بالا رونده و پایین رونده هر پین از پورت را آموزش میدهد و سپس طریقه کار با تایمر واتچ داگ را آموزش میدهد و در نهایت وقفههای خطا را معرفی میکند. با سیسوگ همراه باشید.
تنظیم لبه بالا رونده و پایین رونده هر پین
خوب حالا که یاد گرفتیم چطور میتوانیم از طریق توابع کتابخانه hal لبه وقفه خارجی خود را تغییر بدهیم، بهتر است یک راه حل مناسب و سادهتر برای اینکار پیدا کنیم آن هم راه حل استفاده از کار مستقیم با رجیسترها است. برای این منظور فقط لازم است با دو رجیستر ساده با نام های EXTI->RTSR که به انتخاب لبه بالا رونده هر پین از پورت مربوط میشود و رجیستر EXTI->FTSR که به انتخاب لبه پایین رونده هر پین از پورت مربوط میشود، کار کنیم. روند کار هم بسیار ساده است، بدین صورت که هر بیت از هر کدام از رجیسترها متناظر با همان پین از پورت است، یعنی اگر ما بعنوان مثال بخواهیم یک پین مشخص را با لبه بالا رونده تنظیم کنیم باید بیت متناظر با این پین را در رجیستر EXTI->RTSR یک کنیم و متقابلاً همان بیت را در رجیستر EXTI->FTSR صفر نمائیم، یا اگر بخواهیم آن پین را روی لبه پایین رونده تنظیم کنیم بالعکس این عمل را انجام میدهیم و اگر بخواهیم پین مورد نظر را همزمان هم روی لبه بالا رونده و هم روی لبه پایین رونده تنظیم کنیم بیت متناظر با آن پین را در هر دو رجیسترهای EXTI->FTSR و EXTI->FTSR یک میکنیم به همین راحتی … برای فهم بیشتر مسئله به مثالهای زیر توجه کنید.
حالا اگر به مثال بالا توجه کنید ما از ماکروهای SET_BIT و CLEAR_BIT استفاده کردیم که اینها یک سری ماکرو ابتدائی هستند که در برگه stm32f1xx.h قرار دارند برای فهم بیشتر عملکرد این ماکروها به عکس زیر توجه کنید:
توجه داشته باشید ما در آینده نیز در آموزشهای بعدی از ماکروهای بالا که ماکروهای عمومی هستند استفاده خواهیم کرد.
تایمر واتچ داگ
در این قسمت طریقه کار با تایمر واتچ داگ را خواهیم آموخت، طبق معمول نرمافزار cubemx را باز میکنیم و بعد از تنظیم بخش کلاک میکرو و پروگرامر و دیگر تنظیمات مورد نیاز طبق عکس زیر گزینه IWDG را از قسمت Pinout انتخاب میکنیم.
اولین کاری که میکنیم به صفحه Clock Configuration میرویم و طبق عکس زیر میزان کلاک واتچ داگ را مشاهده میکنیم.
همانطور که در عکس بالا میبینید، برای امنیت و پایداری بیشتر، کلاک تایمر واتچ داگ از یک اسیلاتور 40 کیلوهرتز داخلی تامین شده است. بعد از این مرحله به صفحه Configuration میرویم و دکمه IWDG را میزنیم تا صفحه زیر باز شود.
همانطور که در عکس بالا میبینید ما در اینجا دو گزینه برای تنظیم داریم اولی تقسیم کننده کلاک تایمر واتچ داگ هست، که طبق عکس زیر گزینههای مختلفی دارد و کلاک تایمر واتچ داگ که همان 40 کیلو هرتز هست را به عدد مورد نظر ما تقسیم میکند:
و گزینه بعدی هم که محدوده آن در قسمت توضیحات پایین کادر نشان داده شده همان دوره تناوب تایمر واتچ داگ است:
شیوه عملکرد هم بدین صورت است که کلاک تایمر واتچ داگ ابتدا بر مقدار گزینه تقسیم کننده اول تقسیم میشود و در مرحله بعد طی تعداد شمارشی که ما توسط گزینه دوم مشخص کردیم سرریز تایمر صورت میپذیرد و باعث ریست شدن میکروکنترلر میگردد. ما در اینجا میخواهیم اعداد را طوری قرار دهیم که هر 2 ثانیه سرریز تایمر واتچ داگ صورت پذیرد بدین منظور اگر ما تقسیم کننده را مساوی 256 قرا دهیم و دوره تناوب را هم مساوی 312 قرار دهیم 2 ثانیه حاصل میشود.
توضیح اینکه 40000/256=156 (که منظور از 4000 همان کلاک کار تایمر و منظور از 256 همان مقدار تقسیم کننده است) یعنی ما برای یک ثانیه احتیاج به 156 شمارش داریم در نتیجه با قرار دادن دوره تناوب با 312 دو ثانیه تا زمان سرریز تایمر خواهیم داشت.
حال در قدم بعدی از نرم افزار CubeMX خروجی میگیریم و به محیط نرم افزار keil میرویم تا برنامه را کامل کنیم. در عکس زیر میتوانید روال اصلی برنامه را مشاهده کنید:
همانطور که در عکس میبینید، شکل عملکرد برنامه بسیار ساده است به این صورت که ما هر یک ثانیه وضعیت یک خروجی را بالعکس میکنیم و همان یک ثانیه یکبار هم تایمر واتچ داگ را بازنشانی میکنیم تا قبل از رسیدن به دو ثانیه (که قبلا برای تایمر واتچ داگ تنظیم کردیم) از ریست شدن میکروکنترلر جلوگیری شود.
وقفه خطا
در میکروکنترلر STM32 ما چهار وقفه خطا متفاوت داریم. که در برگه stm32f1xx_it.c میتوانید روتینهای وقفه مربوطه را ببینید:
همانطور که میبینید داخل همه این روتینهای وقفه یک حلقه بینهایت وجود دارد، که یک فایده آن این است که باعث میشود برنامه در همینجا متوقف بماند تا تایمر واتچ داگ سرریز شود و میکرو ریست شود ، همانطور که میبینید شما میتوانید کدهای مورد نظرتان را که در هنگام رخ دادن خطای مورد نظر در بین کدهای USER CODE BEGIN و USER CODE END قرار دهید. البته معمولا بهترین کدی که میتوانیم قرار دهیم فرمان HAL_NVIC_SystemReset(); است که کار آن ریست نرم افزاری میکروکنترلر است.
توجه داشته باشید در CubeMX که برنامه را تنظیم میکنیم، اجبارا باید این وقفهها فعال باشد ولیکن ما میتوانیم از طریق همان فرمان HAL_NVIC_EnableIRQ و فرمان HAL_NVIC_DisableIRQ در طول برنامه آنها را فعال و غیر فعال کنیم.
در قسمت هفتم آموزشهای میکروکنترلر STM32 تنظیمات نرم افزار CubeMX برای رابط سریال uart را آموزش خواهیم داد. با سیسوگ همراه باشید.
سلام از مطلب خوبتون تشکر میکنم.
تو این سایت دقیقا همین مطلب با همین عکسا رو گذاشته بدون ذکر اینکه منبعش شمایید.گفتم بهتون بگم که باهاشون صحبت کنید ببینید چرا این کار رو انجام دادن.اینطوری زحمات شما دیده نمیشه و به نظرم این درست نیست.
لینک حذف شده است.
سلام دوست عزیز
ما این انتقاد را هم ازشون داشتیم و قرار شده حئداقل یک لینک از ما بگذارند و امیدواریم لطف کنند بزارند :-))
با عرض سلام و خسته نباشید و تشکر فراوانو
من مبتدیم و خیلی خوب توضیح میدید فقط یه سوال داشتم اون TOGGLE_OUT1;بافر هستش یا چیز دیگه چون کمپایلر ایراد میگیره و اینکه
delay_ms چرا استفاده شده و نه خود تابع HAL_DELAY()
مرسی
سلام دوست عزیز
TOGGLE_OUT1 در واقع یک ماکرو یا تابع است که یکی از خروجی ها رو برعکس میکنه – حالا میتونه هر خروجی دلخواهی باشه اگر صفر بود یک میکنه اگر هم یک بود صفر میکنه
من به شخصه تابع HAL_DELAY() رو توصیه میکنم حالا نظر نویسنده این بوده که تابع تاخیر رو هم خودشون بنویسند
سلام. ممنون از مطالب خوبتان.
در کامپایلر کیل خطای invalid c99 برای چیه میشه مشکلش رو حل کرد؟
سلام برای رفع این خطا توی تنظیمات پروژه – قسمت c/c++ یه تیک هست که استاندارد c99 رو فعال میکنه و دقیقا عبارت c99 رو نوشته
با سلام و ممنون بابت مطلب مفیدی که گذاشتید
من یه مشکل دارم با واچ داگ،اونم اینه که من یه برنامه دماسنج دارم که یه تایمر نزولی هم داره،وقتی واچ داگ رو در برنامه قرار میدم و مقدار واچ داگ رو بابر ۸ ثانیه میگذارم،درست زمانی که تایمر نزولی ۸ ثانیه ازش کم میشه،واچ داگ فعال میشه و میکرو رو ریست میکنه و تایمر و برنامه ها از دوباره شروع بکار میکنند و این روند همینطور ادامه داره،اگه میشه راهنمایی کنید که چیکار کنم؟
خوب دوست عزیز شما لازمه که ولچ داگ رو در سریعترین زمان ممکن ریست کنید
وقتی واچ داگ رو ریست نکنید – واچ داگ سر ریز میکنه و میکرو رو ریست میکنه ! این عملکرد ذاتی واچ داگ هست
شما باید توی برنامه بسته به نوع واچ داگ (ویندو واچ داگ یا واچ داگ معمولی ) اونو متناوبا ریست کنید.
سلام خیلی ممنون بابت مطالب مفیدتون واقعا عالیه
یه درخواستی داشتم اینکه امکانش هست آموزش محاسبه طول پالس ورودی در پایه ی اینتراپت به واحد میکرو ثانیه را هم قرار دهید؟(برای محاسبه سیگنال دریافتی از رادیو کنترلر)
سلام فکر میکنم در دستور آموزش های جدید که تحت عنوان STM32F4 داره منتشر میشه باشه