سیسوگ در قسمت هفتم آموزش میکروکنترلر STM8 آموزش ها را به صورت عملی به کار گرفت و نتیجه را به صورت پروژه LED چشمکزن مشاهده کردیم. در این قسمت از آموزش های میکروکنترلر STM8 قصد دارد، سیستم کلاک میکروکنترلر CLK را بیان کند. با سیسوگ همراه باشید.
سیستم کلاک داخلی STM8 به ما این اجازه را میدهد که سرعت عملکرد CPU را متناسب با نیاز خود تنظیم کنیم. تأخیر نرمافزار و توان مصرفی به تنظیمات کلاک سیستم وابسته است.
در میکروکنترلرهای STM8، سه منبع کلاک اصلی CLK وجود دارد. کلاک داخلی سرعت بالا (HSI)، کلاک خارجی سرعت بالا (HSE) و کلاک داخلی کم مصرف (LSI). کلاک داخلی سرعت بالا (HSI) دارای فرکانس نوسان 16 مگاهرتز است و یک نوسانگر داخلی RC با دقت خوب است – حدود 1٪ تحمل در طیف گستردهای از دما. HSE میتواند به عنوان یک مدار کلاک خارجی، نوسانگر کریستالی با جبران حرارت (TCXO) یا تشدید کننده کریستال معمولی باشد. میتواند فرکانسهای از 1 مگاهرتز تا 24 مگاهرتز را بپذیرد. در نهایت، کلاک LSI مبتنی بر اسیلاتور RC داخلی است که عمدتاً برای حالتهای کم مصرف و تایمر نظارت مستقل (IWDG) استفاده میشود. این کلاک دارای فرکانس ثابت 128 کیلوهرتز است و مانند HSE و HSI دقیق نیست. همچنین تقسیم کنندههای کلاک/ پیمایشگرها در نقاط مختلف به منظور اندازهگیری کلاکها وجود دارد. به طور عمده به دو پیمایشگر، پیمایشگر HSI و تقسیم کننده CPU نیاز داریم. Peripherals به طور مستقیم توسط منبع کلاک اصلی تأمین میشود. به علاوه یک پین خروجی برای کلاک (CCO) وجود دارد که فرکانس ساعت را به خروجی میدهد. از این میتوان برای کلاک دیگر میکروها نیز استفاده کرد، برای دیگر آی سیهای منطقی کلاک تولید میکند. همچنین میتواند به عنوان یک نوسانساز آزاد و یا آزمایشات عملکرد کلاک مورد استفاده قرار گیرد. یک حالت کلاک امنیتی fail-safe وجود دارد که باعث میشود در زمانی که HSE از کار افتاد به صورت خودکار HSI شروع به فعالیت کند. بلوک دیاگرام داخلی آن در زیر نشان داده شده است:
اتصالات سخت افزاری
نمونه کد کلاک سیستم CLK
کد زیر نشان میدهد چگونه CPU را با استفاده از HSI با کلاک 2 مگاهرتز راه اندازی کنید و کلاک 500 کیلوهرتز را روی پین CCO به عنوان خروجی داشته باشیم. HSE به 8 تقسیم شده است، یعنی 16 مگاهرتز تقسیم بر 8 برابر 2 مگاهرتز شده است. این 2 مگاهرتز منبع کلاک اصلی است و 4 مرتبه دیگر تقسیم شده است تا فرکانس 500 کیلوهرتز را تولید کند.
توجه داشته باشید پین CCO تنها در برخی از پین در دسترس است. به عنوان مثال، در STM8S003F3 این پین تنها در PC4 است. ما باید عملکرد پیش فرض پین PC4 را به حالت خروجی CCO بدهیم.
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 | #include "STM8S.h" #define LED_pin GPIO_PIN_4 #define LED_port GPIOC void setup(void); void clock_setup(void); void GPIO_setup(void); void main(void) { setup(); GPIO_WriteLow(LED_port, LED_pin); while(TRUE) { }; } void setup(void) { clock_setup(); GPIO_setup(); } 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_CPUDIV4); 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_UART1, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, DISABLE); CLK_CCOConfig(CLK_OUTPUT_CPU); CLK_CCOCmd(ENABLE); while(CLK_GetFlagStatus(CLK_FLAG_CCORDY) == FALSE); } void GPIO_setup(void) { GPIO_DeInit(LED_port); GPIO_Init(LED_port, LED_pin, GPIO_MODE_OUT_OD_HIZ_FAST); } |
توضیحات کد
پیکربندی CCO به صورت زیر است:
1 2 3 | CLK_CCOConfig(CLK_OUTPUT_CPU); CLK_CCOCmd(ENABLE); while(CLK_GetFlagStatus(CLK_FLAG_CCORDY) == FALSE); |
این خطوط منبع کلاک را انتخاب می کند که پین CCO به عنوان خروجی خواهد بود. ماژول CCO را فعال کرده و صبر می کند تا آن را تثبیت کند. در اینجا من CCO را برای خروجی CPU انتخاب کردم.
در این قسمت درباره کلاک سیستم CLK صحبت کردیم. در قسمت نهم آموزش میکروکنترلر STM8 سیسوگ قصد دارد روی وقفه خارجی تمرکز کند. در ادامه نیز سیسوگ را همراهی نمایید.
لینکهای دانلود
مطالب مرتبط
- قسمت اول − میکروکنترلر STM8 چیست و از کجا آمده است؟
- قسمت دوم − معرفی بردهای Discovery میکروکنترلر STM8
- قسمت سوم − کامپایلر و پروگرامر
- قسمت چهارم − STM8CubeMX
- قسمت پنجم − آماده سازی ابزارهای نرمافزاری برای STM8
- قسمت ششم − چگونه برنامه خود را روی STM8 آپلود کنیم؟
- قسمت هفتم− LED چشمکزن
- قسمت نهم − وقفه خارجی (EXTI)
- قسمت دهم − Beeper
- قسمت یازدهم − LCD کاراکتری
- قسمت دوازدهم − مبدل آنالوگ به دیجیتال (ADC)
- قسمت سیزدهم − تایمر نگهبان آنالوگ (AWD)
- قسمت چهادهم − تایمر نگهبان (IWDG)
- قسمت پانزدهم − تایمر نگهبان محدوده ای (WWDG)
- قسمت شانزدهم− اصول اولیه تایمرها
- قسمت هفدهم− تایمر 2
- قسمت هجدهم −تایمر 4
- قسمت نوزدهم −PWM
- قسمت بیستم − PWM تایمر 1
- قسمت بیست و یکم − بررسی اجمالی ارتباطات
- قسمت بیست و دوم − رابط سریال (UART)
- قسمت بیست و سوم − رابط کاربری سریال (SPI)
- قسمت بیست و چهارم − رابط I2C
- دوره رایگان آموزش میکروکنترلر STM8 – سیسوگ
سلام من این تنظیمات کلاکی که در این جلسه اموزش فرمودید رو فعال نکردم اما کدم با فرکانس حدودا 128کیلو هرتز(یعنی فرکانسLSI؟؟!!) کار میکنه میخواستم ببینم لازمه که این کد نوشته بشه یانه و اگر باید نوشته بشه داخل فایل main که بقیه کدم رو نوشتم باید این کد رو بنویسم؟؟؟و اینکه راه دیگ ای به جز این کد نیست که به حداکثر فرکانس دسترسی پیداکنم؟؟و اینکه چرا با کمترین فرکانس داخلی کار میکنه چرا با بیشترین کارنمیکنه؟؟؟
سلام من با STM8S003F3P6 کار میکنم روی پی سی بی من کلاک در نظر گرفته نشده با این فرض که از کلاک داخلی در حالت پیش فرض استفاده میشه و میکرو نو هست. و الان هرکاری میکنم پروگرم نمیشه، از پروگرمر های ST LINK که شبیه فلش هستن استفاده میکنم.
سلام
خوب خبر خوب اینه که برای پروگرام کردن نیاز به اوسیلاتور خارجی ندارید و همون اسیلاتور داخلی کفایت میکنه
چه پایه هایی رو متصل کردید ؟ آیا ریست رو هم متصل کردید ؟
ولتاژ ها درست است ؟
سلام خسته نباشید
ممنون از آموزش های خوبتون
مفهوم دو خط زیر چیه و چه ورودی هایی میگیره؟
CLK_ClockSwitchCmd(ENABLE);
CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI,
DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);
سلام دوست عزیز – خوب در خصوص خط اول که از اسمش هم معلومه کارش اینه که قسمت سوییچ کلاک رو فعال میکنه
اما در مورد خط دوم – کارش اینه که از یک منبع کلاک به منبع دیگه ای سوییچ کنه – با استفاده از این دستور شما روی منبع اسیلاتور خارجی سوییچ می کنید. برای جزییات بیشتر در مورد دستور به این لینک مراجعه کنید.
سلام
به نظر من ترجمه یه دفترچه آموزشی بدون اینکه هر خط کد رو بتونین توضیح بدین هیچ کمکی به برنامه نویس نمیکنه وقتی اینجا توضیح داده نمیشه که مثلا یه خط دقیق چرا استفاده شده و چطور میشه تغییرش داد تا مشخصه دیگه ای رو تنظیم کرد اینطور میشه که با جلو رفتن اموزش درکشم سخت تر و نا مفهموم میشه.
وارد جزییات بیش از حد شدن هم میتونه خسته کننده باشه
البته من موافق شما هستم که باید جزییات کامل باشه ولی واقعا با محدودیت زمانی فراوانی که وجود داره کار خیلی سختی هست
با سلام و تشکر از بابت زحماتی که در ترجمه این مطالب میکشید. در دنیای امروز و بخصوص برنامه نویسی لازم هست که زبان انگلیسی تقویت شود و برنامه نویس واقعا بدون زبان انگلیسی به مشکل خواهد خورد. ممنون میشم اگه نام سایت http://embedded-lab.com رو که مرجع بیشتر مطالب این بخش از آموزش هست رو در ابتدای آموزش ذکر بکنید تا آرام آرام برنامه نویسها ماهیگیری را یاد بگیرند .فقط ماهی ندید هر از گاهی ماهی گیری هم ببرید.
سلام دوست عزیز
منبعی که فرمودید پایین مطلب از زمان انتشار قرار گرفته , و ما در سیسوگ سعی کردیم تا بحال مطلبی بدون ارائه منبع قرار ندادیم این موضوع هم بحث فنی هست و هم اخلاقی
و خیلی از مطالبی که شما منبعی نمیبنید توسط مولف نوشته شده
ممنون بابت حساسیت و یاداوری شما
سلام
من کار با میکرو رو تازه شروع کردم
لطفا اختصار هایی که نوشته می شه رو معنیشون (کاملشون)رو هم بزارین
مثلا cco مخفف چیه ؟
یا داخل کدها CLK_ClockSwitchCmd
Cmd مخفف چیه؟!
یا اگه راهی هست که خودمون پیدا کنیم که بهتره.
با تشکر
سلام دوست عزیز – تا جای ممکن این کار و انجام میدیم
برای پیدا کردن عبارت کامل میتونید به یوزر منوال آیسی مراجعه کنید مثلا برای cco توضیح زیر رو نوشته
These devices have internal and external clock source inputs and one output clock (CCO).
Cmd مخفف کامند یا دستور است.
خواهش میکنم
سلام
ببخشید من یه کتابخونه برای ds18b20 پیدا کردم که داخلشاز کتابخونه delay استفاده شده ولی من کتابخونه ی delay نتونستم پیدا کنم لطفا راهنمایی کنید
ممنون
http://embedded-lab.com/blog/stm8-microcontrollers-final-chapters/5/
سلام دوست عزیز
برای ایجاد تاخیر دو راه وجود داره راه اول که بیشتر مرسوم هست استفاد از حلقه است چیزی مثل کد زیر
for(i=0;i<10000;i++)
;
و راه دوم که برای ایجاد تاخیر دقیق بیشتر مورد استفاده قرار میگره ؛ استفاده از تایمر هست که میتونید به آموزش تایمر همین بخش مراجعه کنید.
باسلام
حتما نیاز هست که () CLK_PeripheralClockConfig مربوط به بخش های دیگر را مثل i2c غیر فعال نماییم ؟
فکر میکنم بشکل پیش فرض غیرفعال باشن قسمت های مختلف ؛ تنها لازمه اون قسمت هایی که لازم دارید رو فعال کنید.
توضیحات قسمت کلاک خیلی ناقص هستند.
لطفا دو قسمت مهم کلاک داخلی و کلاک خارجی و نحوه فعال کردن هر کدام رو توضیح بدهید.
این دو بخش مهم تر از مطالب بالا هستند
سلام
در این بخش به کلاک داخلی و خارجی و تفاوت آن ها پرداخته شده و در مثال بیان شده چگونه CPU را با استفاده از کلاک داخلی راه اندازی کنید و خروجی CPU را به عنوان کلاک خارجی داشته باشید. لطفا نمونه کد را خودتان به صورت عملی پیاده کنید و سپس اگر سوالی داشتید مطرح نمایید.