سیسوگ در قسمت شانزدهم آموزش میکروکنترلر STM8 انواع تایمرهای STM8 را به شما معرفی کرد. در این قسمت از مجموعه مقالات آموزش میکروکنترلر STM8 قصد دارد تایمر 2 را آموزش دهد. با سیسوگ همراه باشید.
تایمر 2 :
تایمر 2 اساسیترین ویژگی هر تایمر است و همچنین نیازهای ضروری هر سیستم در آن جاسازی شده است. این حالت را میتوان با وقفه و یا بدون وقفه استفاده کرد. ما ابتدا این را بدون وقفه و سپس با وقفه مورد بررسی قرار میدهیم.
در تایمر 2، میتوانیم با استفاده از تأخیر، حلقه و روشهای دیگر زمان دقیق را بدست آوریم. تایمر 2 با استفاده از سختافزار تایمر و مستقل از بقیه قسمتها کار می کند. این تایمر کاربردهای بسیاری دارد. به عنوان مثال، با استفاده از این تایمر میتوانیم از تأخیر نرمافزار جلوگیری کنیم، شکافهای زمانی در سیستم بلادرنگ (RTOS) تولید کرد و غیره.
تمام تایمرهای STM8 مشابه هستند و تنها چند تفاوت دارند. به عنوان مثال، تایمر 1 یک شمارنده تکرار است. این مانند شمارندهای به دنبال شمارنده دیگر است. تایمرهای دیگر این بخش را ندارند. تمامی تایمرها شمارنده رو به بالا هستند، در حالیکه تایمرهای پیشرفته میتوانند شمارنده معکوس نیز باشند.
تئوری اصلی تایمر 2 به این صورت است که شما یک کلاک داخلی دارید که آن را بر حسب نیاز خود تقسیم بندی میکنید. بنابراین شما آن را تنظیم میکنید و از کلاک جدید برای شمارنده استفاده میکنید. شمارنده از 0 تا 100 شروع به شمارش میکند و بعد از اینکه به 100 رسید مجدداً از 0 شروع به شمارش میکند. رابطه زیر زمان تایمر را نشان میدهد:
فرمول بالا نشان دهنده مدت زمان سپری شده قبل از وقوع سرریز تایمر است پس از آن تایمر شمارش را از اول شروع می کند.
در این مثال، کلاک اصلی روی 2 مگاهرتز تنظیم شده است. تایمر 2 پس از تقریبا 2 ثانیه دوباره بارگذاری میشود. ما این کلاک را به 2048 قسمت تقسیم میکنیم و که در این حالت شمارنده پس از شماره 1952 مجدداً بارگیری میشود. توجه داشته باشید که تایمر 2 شمارنده تکرار ندارد و روی 1 تنظیم می شود.
اتصالات سخت افزاری
نمونه کد تایمر 2
در این مثال، LED بدون تأخیر زمانی نرم افزار چشمک می زند. تایمر 2 در اینجا برای ایجاد تأخیر زمانی استفاده میشود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | #include "STM8S.h" void clock_setup(void); void GPIO_setup(void); void TIM2_setup(void); void main(void) { clock_setup(); GPIO_setup(); TIM2_setup(); while(TRUE) { if(TIM2_GetCounter() > 976) { GPIO_WriteHigh(GPIOD, GPIO_PIN_3); } else { GPIO_WriteLow(GPIOD, GPIO_PIN_3); } }; } void clock_setup(void) { CLK_DeInit(); CLK_HSECmd(DISABLE); CLK_LSICmd(DISABLE); CLK_HSICmd(ENABLE); while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == FALSE); CLK_ClockSwitchCmd(ENABLE); CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8); CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, ENABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, DISABLE); } void GPIO_setup(void) { GPIO_DeInit(GPIOD); GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST); } void TIM2_setup(void) { TIM2_DeInit(); TIM2_TimeBaseInit(TIM2_PRESCALER_2048, 1952); TIM2_Cmd(ENABLE); } |
توضیحات
در ابتدا CPU و کلاک داخلی هر دو روی 2 مگاهرتز تنظیم می شوند.
1 2 3 4 5 | CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8); CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); …. …. CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, ENABLE); |
همانطور که قبلاً توضیح داده شد، برای اینکه تایمر هر 2 ثانیه یکبار مجدداً بارگیری شود باید شمارنده را به 2048 قسمت تقسیم بندی کنیم و شمارنده روی 1952 بارگیری شود. این تنظیمات کد در زیر نشان داده شده است:
1 2 3 4 5 6 | void TIM2_setup(void) { TIM2_DeInit(); TIM2_TimeBaseInit(TIM2_PRESCALER_2048, 1952); TIM2_Cmd(ENABLE); } |
هدف ما این است که LED برای 1 ثانیه روشن و برای 1 ثانیه خاموش باشد. برای ایجاد این زمان 2 ثانیه ای شمارنده تا شماره 1952 پیش می رود بنابرین وقتی شمارنده تا 976 پیش برود مدت زمان 1 ثانیه سپری می شود. بنابراین در حلقه اصلی مقدار شمارنده تایمر 2 را چک می کنیم. وقتی شمارنده از 0 تا 976 را می شمارد LED روشن و وقتی از 977 تا 1952 را می شمارد LED خاموش می شود. توجه داشته باشید که پایه مثبت LED به VDD متصل است و وقتی PD3 مقدار کمی دارد روشن می شود.
1 2 3 4 5 6 7 8 | if(TIM2_GetCounter() > 976) { GPIO_WriteHigh(GPIOD, GPIO_PIN_3); } else { GPIO_WriteLow(GPIOD, GPIO_PIN_3); } |
سیسوگ در قسمت های بعدی تایمرهای دیگر STM8 را مورد بررسی قرار می دهیم. در قسمت هجدهم تایمر 4 را مورد بررسی قرار میدهد. با سیسوگ همراه باشید.
لینکهای دانلود
مطالب مرتبط
- قسمت اول − میکروکنترلر STM8 چیست و از کجا آمده است؟
- قسمت دوم − معرفی بردهای Discovery میکروکنترلر STM8
- قسمت سوم − کامپایلر و پروگرامر
- قسمت چهارم − STM8CubeMX
- قسمت پنجم − آماده سازی ابزارهای نرمافزاری برای STM8
- قسمت ششم − چگونه برنامه خود را روی STM8 آپلود کنیم؟
- قسمت هفتم− LED چشمکزن
- قسمت هشتم − کلاک سیستم (CLK)
- قسمت نهم − وقفه خارجی (EXTI)
- قسمت دهم − Beeper
- قسمت یازدهم − LCD کاراکتری
- قسمت دوازدهم − مبدل آنالوگ به دیجیتال (ADC)
- قسمت سیزدهم − تایمر نگهبان آنالوگ (AWD)
- قسمت چهادهم − تایمر نگهبان (IWDG)
- قسمت پانزدهم − تایمر نگهبان محدوده ای (WWDG)
- قسمت شانزدهم− اصول اولیه تایمرها
- قسمت هجدهم −تایمر 4
- قسمت نوزدهم −PWM
- قسمت بیستم − PWM تایمر 1
- قسمت بیست و یکم − بررسی اجمالی ارتباطات
- قسمت بیست و دوم − رابط سریال (UART)
- قسمت بیست و سوم − رابط کاربری سریال (SPI)
- قسمت بیست و چهارم − رابط I2C
- دوره رایگان آموزش میکروکنترلر STM8 – سیسوگ
سلام، قسمت بعدی که در مورد تایمر ۴ هست باز نمیشه و هشدار یافت نشد میده.
لطف کنید درست کنید.
سلام دوست عزیز این مشکل برطرف شده میتونید بررسی بفرمایید.
تشکر از پیگیری سریعتون.
سلام. می تونید یه نمونه کد برای overflow تایمر 2 بگید؟ فقط میخوام بدونم تابعش چجوری نوشته میشه.
سلام
منظورتون از نمونه کد، دقیقا کدام قسمتش هست
کانفیگش یا اینتراپتش ؟!
با سلام
من تایمر دو رو با وقفه راه اندازی کردم
به عنوان مثال میخواستم که هر 200 میلی ثانیه یک بار بره توی تابع وقفه و بعد بیاد بیرون
ولی با هر کانفیگی که تنظیم کردم این کار نکرد بعد اسکوپ روی روی پایه میکرو گذاشتم دیدم فرکانس 33.9 کیلو هرتز هست
بازم تنظیمات میکرو تغییر دادم فرغی نکرد
void TIM2Config(void)
{
TIM2_DeInit();
TIM2_TimeBaseInit(TIM2_PRESCALER_32768, 15625);
TIM2_ITConfig(TIM2_IT_UPDATE , ENABLE);
TIM2_Cmd(ENABLE);
}
این تکه کد برای تنظیمات تایمر هست
و این هم کدی هست که توی فایل اینتراپت ها نوشتم
INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.*/
GPIO_WriteReverse(GPIOD,GPIO_PIN_4);
}
میکروی استفاده شده : stm8s003f3
با تشکر از اموزش های خوبتون
سلام وقت بخیر و عرض تبریک و تشکر بابت مطالبتون
سوال از خدمتتون داشتم که میشه بفرمایین که ما چطور با چه سینتکی میتونیم کلاک تایمر رو اکسترنال کنیم؟ینی منبع کلاک تایمر کلاک اصلی میکرو نباشه و روی یک پایه میکرو باشه به عبارت دیگر میخوام یک کانتر داشته باشم