سیسوگ در قسمت چهاردهم آموزش میکروکنترلر STM8 تایمر نگهبان (IWDG) را که در اکثر میکروکنترلرها وجود دارد آموزش داد و اجرای برنامه آن را روی STM8 با هم مشاهده کردیم. در این قسمت از مجموعه مقالات آموزش میکروکنترلر STM8 قصد دارد تایمر نگهبان محدوده ای (WWDG) را به شما آموزش دهد.
تایمر نگهبان محدوده ای (WWDG)
WWDG یک تایمر نگهبان پیشرفته است. برخلاف تایمر نگهبان (IWDG) در اینجا اگر شمارنده از یک محدوده زمانی از پیش تعیین شده بالاتر یا پایین تر برود فرمان ریست صادر میشود. این نوع تایمر بیشتر در میکروکنترلرهای پیشرفته مانند ARM ، ATXMEGA و میکروپروسسورهای اخیر دیده میشود. وقتی چنین ویژگیهایی را بررسی میکنیم مشاهده میشود که STM8s در مقایسه با دیگر میکروکنترلرهای 8 بیتی مقرون به صرفهتر است.
WWDG با مقایسه مقادیر شمارنده معکوس در یک محدوده زمانی کار میکند. این شمارنده تنها زمانی که مقدار آن بزرگتر از 0x7F و یا کمتر از مقدار تعیین شده محدوده باشد میتواند رفرش شود. اگر شمارنده به 0x7F برسد فرمان ریست سیستم صادر میشود. برنامهنویس باید در زمان مناسب شمارنده را رفرش کند. توجه داشته باشید که برخلاف IWDG، در اینجا WWDG به کلاک اصلی وابسته است.
با استفاده از فرمول زیر می توان وقفه WWDG را محاسبه کرد. tWWDG بر اساس ms است:
TCPU کلاک داخلی سیستم و بر اساس ms است.
اتصالات سخت افزاری
نمونه کد WWDG
در اینجا نمونه کد برای مشاهده عملکرد WWDG را نشان داده میشود. برای این تست به LED روی برد و پاور سوئیچ نیاز داریم. زمانی که کد شروع به اجرا می کند، LED به آرامی چشمک میزند که نشان دهنده شروع برنامه است. هنگامی که برنامه حلقه اصلی را اجرا میکند، LED به سرعت چشمک میزند که اجرای حلقه اصلی را نشان میدهد. اگر به صورت تصادفی سوئیچ فشرده شود، میکروکنترلر ریست میشود زیرا شمارنده خارج از محدوده مجاز رفرش شده است. گاهی ممکن است که میکروکنترلر ریست نشود که این نشان میدهد شمارنده در محدوده مجاز بوده است. به همین دلیل به این نوع تایمر، تایمر نگهبان محدوده ای گفته می شود.
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 69 70 71 72 73 74 75 76 77 78 79 | #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، فقط باید مقدار شمارنده معکوس و محدوده پنجره را تنظیم کنیم.
1 2 3 4 | void WWDG_setup(void) { WWDG_Init(0x7F, 0x60); } |
ما باید روی WWDG نظارت کنیم تا در زمان مناسب شمارنده را رفرش کنیم.
1 2 3 4 5 6 7 8 9 10 | 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 سیسوگ قصد دارد اصول اولیه تایمرها را بیان کند. همچنان سیسوگ را همراهی کنید.
لینکهای دانلود
مطالب مرتبط
- قسمت اول − میکروکنترلر STM8 چیست و از کجا آمده است؟
- قسمت دوم − معرفی بردهای Discovery میکروکنترلر STM8
- قسمت سوم − کامپایلر و پروگرامر
- قسمت چهارم − STM8CubeMX
- قسمت پنجم − آماده سازی ابزارهای نرمافزاری برای STM8
- قسمت ششم − چگونه برنامه خود را روی STM8 آپلود کنیم؟
- قسمت هفتم− LED چشمکزن
- قسمت هشتم − کلاک سیستم (CLK)
- قسمت نهم − وقفه خارجی (EXTI)
- قسمت دهم − Beeper
- قسمت یازدهم − LCD کاراکتری
- قسمت دوازدهم − مبدل آنالوگ به دیجیتال (ADC)
- قسمت سیزدهم − تایمر نگهبان آنالوگ (AWD)
- قسمت چهادهم − تایمر نگهبان (IWDG)
- قسمت شانزدهم− اصول اولیه تایمرها
- قسمت هفدهم− تایمر 2
- قسمت هجدهم −تایمر 4
- قسمت نوزدهم −PWM
- قسمت بیستم − PWM تایمر 1
- قسمت بیست و یکم − بررسی اجمالی ارتباطات
- قسمت بیست و دوم − رابط سریال (UART)
- قسمت بیست و سوم − رابط کاربری سریال (SPI)
- قسمت بیست و چهارم − رابط I2C
- دوره رایگان آموزش میکروکنترلر STM8 – سیسوگ
با سلام؛ به نظرتون کپی کردن مطالب دیگران بدون ذکر منبع کار درستیه؟؟
سلام
قطعا کار ناپسندی است و به شدت محکوم میکنیم !
تمام مطالب سایت سیسوگ در صورت وجود منبع ؛ حتما منبع انها ذکر میشه ؛ اگر منظورتون این مطلبه ، همین مطلب هم منبعش ذکر شده اخر پست رو ببینید.
سلام
روزتون بخیر می خواستم بدونم 0x3F رو از کجا آوردین ؟
if((GPIO_ReadInputPin(GPIOB, GPIO_PIN_7) == FALSE)
و
GPIO_WriteReverse(GPIOD, GPIO_PIN_0);
توی آخرین قسمت برنامه اشتباه چاپ شده 7و0
توی برنامه اصلی درسته.
دوست گرامی واقعا بابت این همه تلاش خالصانتون برای آموزش آدم های تازه کاری مثل ما ممنونیم . خدا هواتونو داشته باشه !
عدد 3F اشتباه تایپ شده و در واقع 7ّF باید باشه چون کانتر 7 بیتی است.
قسمت دوم هم اصلاح شده ؛
متشکر از شما دوست عزیز برای دقت و تذکر 🙂
موفق باشین!
با سلام و احترام
بابت این آموزش خیلی خیلی ممنون . مفهوم WWDG رو نمی فهمیدم حالا کاملا برام روشن شد.
انشالله همواره موفق باشید.
سلام
باعث خوشحالیه که آموزش های سیسوگ تونسته ابهامات شما را بر طرف کنه.
موفق باشید.
سلام و خسته نباشید
قیمت میکروهای stm8 در مقایسه با سری stm32f0 چندان جذاب نیست و 32 بیتی هاارزانتر هم هستند
اینجور که دیدم stm8 زیر 10هزار تومن نیست ولی سری stm32f0 از 6 تومن شروع میشه
من لزوم کار با این میکروها را نمیفهمم
به نظرم بجای این اموزش اگر زیر و بم stm32 کامل اموزش داده بشه خیلی بهتره
در هر صورت بابت مطالب اموزنده و تجارب ارزشمندتون خیلی ممنونم
سلام دوست عزیز
در حال حاضر مجموعه آموزش میکروکنترلر STM32 به صورت هفتگی در سایت متشر میشه و احتمالا در آینده مجموعه آموزشی دیگری هم برای این میکروکنترلر داشته باشیم.
موفق باشید.
دوست عزیز ؛ همیشه قیمت ملاک نیست ! میکروکنترلرهایی هستند که خیلی خیلی ارزان تر هم هستند ! ولی مساله مهم اینه که باید در نظر داشته باشیم هر میکروکنترلری برای پوشش نیازی خاص تولید میشه و نمیشه گفت وقتی ARM سی و دو بیتی هست چرا کسی میره سراغ AVR !
سری دوم STM32 هم توی راه هست و به زودی با اتمام این سری ؛ شروع خواهد شد.