در قسمت شانزدهم آموزش میکروکنترلر STM8 انواع تایمرهای STM8 را به شما معرفی کردیم. در این قسمت از مجموعه مقالات آموزش میکروکنترلر STM8 قصد داریم تایمر۲ را آموزش دهیم. با ما همراه باشید.
تایمر ۲:
تایمر۲ اساسیترین ویژگی هر تایمر است و همچنین نیازهای ضروری هر سیستم در آن جاسازی شدهاست. این حالت را میتوان باوقفه و یا بدونوقفه استفادهکرد. ما ابتدا این را بدونوقفه و سپس باوقفه موردبررسی قرار میدهیم.
در تایمر۲، میتوانیم بااستفادهاز تأخیر، حلقه و روشهایدیگر زمان دقیق را بدست آوریم. تایمر۲ بااستفادهاز سختافزار تایمر و مستقلاز بقیه قسمتها کار می کند. این تایمر کاربردهای بسیاری دارد. بهعنوانمثال، بااستفادهاز این تایمر میتوانیم از تأخیر نرمافزار جلوگیریکنیم، شکافهای زمانی در سیستم بلادرنگ (RTOS) تولید کرد و… .
تمام تایمرهای STM8 مشابههستند و تنها چند تفاوت دارند. بهعنوانمثال، تایمر۱ یک شمارندهی تکرار است. این مانند شمارندهای بهدنبال شمارنده دیگر است. تایمرهای دیگر این بخش را ندارند. تمامی تایمرها شمارنده روبهبالا هستند، درحالیکه تایمرهای پیشرفته میتوانند شمارندهمعکوس نیز باشند.
تئوری اصلی تایمر۲ بهاینصورت است که شما یک کلاک داخلی دارید که آنرا برحسب نیازخود تقسیمبندی میکنید. بنابراین شما آن را تنظیم میکنید و از کلاک جدید برای شمارنده استفاده میکنید. شمارنده از صفر تا ۱۰۰ شروعبه شمارش میکند و بعداز اینکه به ۱۰۰ رسید مجدداً از صفر شروعبه شمارش میکند. رابطهی زیر زمان تایمر را نشان میدهد:
فرمولبالا نشاندهندهی مدتزمان سپریشده قبلاز وقوع سرریز تایمر است پساز آن تایمر شمارش را از اول شروع میکند.
در این مثال، کلاک اصلی روی ۲مگاهرتز تنظیمشدهاست. تایمر۲ پساز تقریبا ۲ثانیه دوباره بارگذاری میشود. ما این کلاک را به ۲۰۴۸قسمت تقسیم میکنیم و که در اینحالت شمارنده پساز شماره۱۹۵۲ مجدداً بارگیری میشود. توجهداشتهباشید که تایمر۲ شمارنده تکرار ندارد و روی۱ تنظیم میشود.
اتصالات سختافزاری
نمونه کد تایمر 2
در این مثال، LED بدون تأخیرزمانی نرمافزار چشمک می زند. تایمر۲ در اینجا برای ایجاد تأخیرزمانی استفاده میشود.
#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 و کلاک داخلی هردو روی ۲مگاهرتز تنظیم میشوند.
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8); CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); …. …. CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, ENABLE);
همانطورکه قبلاً توضیحدادهشد، برایاینکه تایمر هر ۲ثانیه یکبار مجدداً بارگیری شود باید شمارنده را به۲۰۴۸ قسمت تقسیمبندی کنیم و شمارنده روی ۱۹۵۲ بارگیری شود. این تنظیمات در کد زیر نشانداده شدهاست:
void TIM2_setup(void) { TIM2_DeInit(); TIM2_TimeBaseInit(TIM2_PRESCALER_2048, 1952); TIM2_Cmd(ENABLE); }
هدف ما این است که LED برای ۱ثانیه روشن و برای ۱ثانیه خاموش باشد. برای ایجاد این زمان ۲ثانیهای شمارنده تا شماره ۱۹۵۲ پیش میرود بنابرین وقتی شمارنده تا ۹۷۶ پیشبرود مدت زمان ۱ثانیه سپری میشود. بنابراین در حلقهی اصلی مقدار شمارنده تایمر۲ را چک میکنیم. وقتی شمارنده از صفر تا ۹۷۶ را میشمارد LED روشن و وقتی از ۹۷۷ تا ۱۹۵۲ را میشمارد LED خاموش میشود. توجهداشتهباشید که پایه مثبت LED به VDD متصلاست و وقتی PD3 مقدارکمی دارد روشن میشود.
if(TIM2_GetCounter() > 976) { GPIO_WriteHigh(GPIOD, GPIO_PIN_3); } else { GPIO_WriteLow(GPIOD, GPIO_PIN_3); }
در قسمتهای بعدی تایمرهای دیگر STM8 را موردبررسی قرار میدهیم. در قسمت هجدهم تایمر۴ را موردبررسی قرار میدهیم. با ما همراه باشید.
منبع: سیسوگ