سلام دوباره؛ جلسه قبلی ( آموزش آرم stm32f103 جلسه ۵ کانفیگ اولیه تایمر ) رو یادتونه؟ خب داخلش ی قولی دادیم که بریم سراغ اینکه با تایمر یکسری دیلای بسازیم تا دقیق دربیاد؛ حالا میخوایم ی تایمر رو جوری پیکر بندی کنیم که چنتا زمان دقیق رو بهمون بده و روی دستورات تاخیر استفاده کنیم.
آموزش آرم stm32f103 جلسه ۶ دیلای های دقیق
برای این کار من دوتا تابع مینویسم یکی برای تاخیر میلی ثانیه و دیگری برای تاخیر میکرو ثانیه؛ برای راحتی کار اول تاخیر میکرو ثانیه رو میسازیم (واحد کوچیک تر) و بعدش تاخیر میلی ثانیه رو بر اساس میکرو ثانیه میسازیم (مثلا توی میلی ثانیه مینویسم اینقد میکرو ثانیه صبر کن )؛ خب، این توابع رو اینجوری اسم میزارم و یک ورودی براش تعریف میکنم
1 2 |
void delay_us(volatile uint32_t us) { } |
حالا باید یک متغیر سراسری تعریف کنیم تا کل زمان ها رو داخلش نگه داریم برای اینکار هم یک متغیر گلوبال تعریف میکنم؛ اینجوری :
1 |
uint32_t volatile DELAY_US = 0; |
میریم توی وقفه تایمر تا دستورات مربوطه رو اونجا بنویسیم؛ اونجا باید اگر متغیر DELAY_US مقدار داشت ازش کم کنیم (یعنی هر باری که تایمر سر ریز میشه یکی از این متغیر کم کنه تا به ۰ برسه؛ پس یک شرط میزاریم برای اینکار و دستور کم شدن مقدار رو توی اون شرط مینویسیم (تا اگر متغیر ۰ بود دیگه ازش کم نکنه )؛ اینجوری مینویسیم :
1 |
if(DELAY_US)DELAY_US--; |
حالا کل تابع تایمر ما میشه این :
1 2 3 |
void SysTick_Handler(void){ if(DELAY_US)DELAY_US--; } |
میریم سراغ اصل تابع دیلای اونجا باید ی دستوری بنویسیم تا مقدار متغیر زمان یعنی DELAY_US مساوی با ۰ نشده برنامه رو توی همون خط نگه داره اینجوری مینویسیم :
1 2 |
DELAY_US = us; while(DELAY_US); |
خط اول میاد ورودی تابع رو میریزه توی متغیر زمان تا تایمر بتونه ازش کم کنه
خط دوم هم میاد منتظر میمونه تا مقدار متغیر که یکی یکی توسط تایمر کم میشه صفر بشه ……
خب تا اینجا میکرو ثانیه رو ساختیم برای میلی ثانیه هم اینجوری عمل میکنیم که برای هر میلی ثانیه ۱۰۰ میکرو ثانیه توقف میکنیم یعنی از میلی ثانیه رو هم بر اساس تابع میکرو ثانیه میسازیم که کل این تابع میشه ابن :
1 2 3 |
void delay_ms(volatile uint32_t ms ) { while (ms--) {delay_us( 100 );} } |
خب تمومه دیگه الان دوتا تابع داریم که دیلای هایی دقیق رو برامون بر اساس تایمر میسازن
از تاخیر بین جلسات عذر خواهی میکنم سرم شلوغ شده درگیر چنتا پروژه هستم
انشالله سری بعد اموزش ها تایمر هست و بعدش کتابخونه برای nokia 5110 lcd مینویسم.
در ضمن stm یک انجمن قوی و خوب هم داره میتونید برای سوالتتون ازش کمک بگیرید : انجمن stm
موفق باشید
مهمان
سلام استفاده از وقفه برای تولید تاخیر اگر توی یک تابع وقفه باشیم مشکل بوجود نمیاره؟ توی تابع وقفه ها به طور خودکار وقفه غیر فعال میشه و ورود به دستور تاخیری که با وقفه غیر فعال شده کار میکنه باعث یه حلقه بی نهایت میشه
راه حلی بجوز استفاده از تکنیک وقفه های تو در تو وجود داره برای stem ها؟
مهمان
سلام
آقا ما موفق نشدیم
میشه بیشتر راهنمایی کنید؟تاخیر ایجاد میشه ولی دقیق نیست اصلا
خیلی فرق میکنه با مقدار تنظیم شده
مهمان
سلام به دوستان. در تایپیک من یه مشکل کوچیک دیدم اونم اینکه هر 1000 میکرو ثانیه میشه 1 میلی ثانیه نه هر 100 میکرو
پس احتمالا اگه بجای 100 عدد 1000 بزارین در صورت صحیح بودن برنامه تون تاخیر خیلی دقیقی بدست میارین
مهمان
اگه میشه آموزشا رو کامل کنید
نویسنده این مطلب
سلام بلهیکم وقتم ازاد بشه
مهمان
خیلی عالی هستین خدا خیرتون بده جهاد علم و ذکاته خوبی برای خودتون میدین..
ادامه بدین لطفا…
مهمان
چشم حتما
نویسنده این مطلب
چشم حتما
مهمان
واقعا افرین باید بهت گفت
خسته نباشید و ارزوی موفقیت دارم براتون
نویسنده این مطلب
مچکرم قربان