قسمت پانزدهم: تایمر نگهبان محدوده‌ای(WWDG)

0
823
تایمر نگهبان محدود‌ه‌ای(WWDG)
تایمر نگهبان محدود‌ه‌ای(WWDG)

در قسمت چهاردهم آموزش میکروکنترلر STM8 تایمر نگهبان (IWDG) را که در اکثر میکروکنترلرها وجود دارد آموزش دادیم و اجرای برنامه آن‌ را روی STM8 باهم مشاهده‌کردیم. در این قسمت از مجموعه مقالات آموزش میکروکنترلر STM8 قصد داریم تایمر نگهبان محدوده‌ای (WWDG) را به شما آموزش‌دهیم.

تایمر نگهبان محدوده‌ای (WWDG)

WWDG یک تایمر نگهبان پیشرفته است. برخلاف تایمر نگهبان(IWDG) در اینجا اگر شمارنده از یک محدوده زمانی ازپیش تعیین‌شده بالاتر یا پایین‌تر برود فرمان ریست صادر می‌شود. این نوع تایمر بیشتر در میکروکنترلرهای پیشرفته مانندARM ، ATXMEGA و میکروپروسسورهای اخیر دیده می‌شود. وقتی چنین ویژگی‌هایی را بررسی می‌کنیم مشاهده می‌شود که STM8s درمقایسه با دیگر میکروکنترلرهای ۸بیتی مقرون‌به‌صرفه‌تر است.

میکروکنترلرهای 8 بیتی
میکروکنترلرهای 8 بیتی

 

WWDG با مقایسه مقادیر شمارنده معکوس در یک محدوده زمانی کار می‌کند. این شمارنده تنها زمانی‌که مقدار آن بزرگتر از 0x7F و یا کمتر‌ از مقدار تعیین‌شده محدوده باشد می‌تواند رفرش شود. اگر شمارنده به 0x7F برسد فرمان ریست سیستم صادر می‌شود. برنامه‌نویس باید در زمان مناسب شمارنده را رفرش کند. توجه‌داشته‌باشید که برخلاف IWDG، در اینجا WWDG به کلاک اصلی وابسته است.

WWDG
WWDG

 

با‌استفاده‌از فرمول زیر میتوان وقفه WWDG را محاسبه کرد. tWWDG براساس ms است:

فرمول وقفه WWDG
فرمول وقفه WWDG

 

TCPU کلاک داخلی سیستم و براساس ms است.

اتصالات سخت‌افزاری

اتصالات سخت‌افزاری
اتصالات سخت‌افزاری

 

نمونه‌کد WWDG

در اینجا نمونه‌کد برای مشاهده عملکرد WWDG را نشان‌داده می‌شود. برای این تست به LED روی برد و پاور سوئیچ نیاز داریم. زمانی‌که کد شروع‌به اجرا میکند، LED به‌آرامی چشمک می‌زند که نشان‌دهنده شروع برنامه است. هنگامی‌که برنامه حلقه اصلی را اجرا می‌کند، LED به‌سرعت چشمک می‌زند که اجرای حلقه اصلی را نشان می‌دهد. اگر به‌صورت تصادفی سوئیچ فشرده‌شود، میکروکنترلر ریست می‌شود زیرا شمارنده خارج از محدوده مجاز رفرش شده‌است. گاهی ممکن‌است که میکروکنترلر ریست نشود که این نشان می‌دهد شمارنده در محدوده مجاز بوده‌است. به‌همین‌دلیل به این نوع تایمر، تایمر نگهبان محدوده‌ای گفته می‌شود.

#include "STM8S.h"


void clock_setup(void);
void GPIO_setup(void);
void WWDG_setup(void);


void main(void)
{
unsigned char i = 0x00;
int j;

clock_setup();
GPIO_setup();


for(i = 0x00; i < 0x04; i++)
{
GPIO_WriteReverse(GPIOD, GPIO_PIN_3);
for(j=0;j<0x02FF;j++);
}

WWDG_setup(); 

while(TRUE)
{
if((GPIO_ReadInputPin(GPIOB, GPIO_PIN_5) == FALSE) || 
((WWDG_GetCounter() > 0x60) && (WWDG_GetCounter() < 0x7F)))
{
WWDG_SetCounter(0x7F);
}
GPIO_WriteReverse(GPIOD, GPIO_PIN_3);
for(j=0;j<0x00FF;j++);
};
}


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_CPUDIV64);

CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, 
DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);

CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, DISABLE);
CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, 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, DISABLE);
CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, DISABLE);
}


void GPIO_setup(void)
{ 
GPIO_DeInit(GPIOB);
GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_IN_PU_NO_IT);

GPIO_DeInit(GPIOD);
GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
}


void WWDG_setup(void)
{
WWDG_Init(0x7F, 0x60);
}

 

توضیحات

تایمرهای نگهبان در میکروکنترلرها همیشه فعال هستند و راهی برای فعال‌کردن آن‌ها به‌صورت‌دستی وجود ندارد. بااینحال، بیت‌هایی برای پیکربندی وجود دارد که اگر IWDG و WWDG در سخت‌افزار یا نرم‌افزار فعال هستند انتخاب‌شوند. آنها تنها در زمانی که پیکربندی می‌شوند اثرگذار هستند و این خیلی‌خوب است.

تایمرهای نگهبان
تایمرهای نگهبان

 

برای WWDG، فقط باید مقدار شمارنده معکوس و محدوده پنجره را تنظیم کنیم.

void WWDG_setup(void)
{
WWDG_Init(0x7F, 0x60);
}

 

ما باید روی WWDG نظارت‌کنیم تا در زمان مناسب شمارنده را رفرش کنیم.

 while(TRUE)
{
if((GPIO_ReadInputPin(GPIOB, GPIO_PIN_5) == FALSE) || 
((WWDG_GetCounter() > 0x60) && (WWDG_GetCounter() < 0x7F)))
{
WWDG_SetCounter(0x7F);
}
GPIO_WriteReverse(GPIOD, GPIO_PIN_3);
for(j=0;j<0x00FF;j++);
};

 

به‌یاد داشته‌باشید که رفرش‌کردن در زمان نامناسب باعث ریست‌شدن میکروکنترلر می‌شود. در‌واقع میکروکنترلر خارج‌از محدوده تعیین‌شده ریست می‌شود.

برد نهایی
برد نهایی

 

در قسمت شانزدهم آموزش میکروکنترلر STM8 قصد داریم اصول اولیه تایمرها را بیان کنیم. همچنان ما را همراهی کنید.

 

 

منبع:‌سیسوگ

مطلب قبلیهک بزرگ سخت افزاری چین
مطلب بعدیآموزش میکروکنترلر STM32 قسمت چهاردهم: رجیستر های پشتیبان RTC

پاسخ دهید

لطفا نظر خود را وارد کنید!
لطفا نام خود را در اینجا وارد کنید