در قسمت پیشین از سری آموزش STM32 با توابع HAL، و نرمافزارهای مورداستفاده آشنا شدیم و نحوه پیکربندی پروژهها را یاد گرفتیم. در این قسمت قصد آشنایی با واحد RCC در کتابخانه HAL، تشریح ویژگیهای آن و همچنین چگونگی تنظیم و استفاده از منابع کلاک و ریست راداریم.
واحد RCC در کتابخانه HAL
RCC یا Reset and Clock Control، یکی از دستگاههای جانبی میکروکنترلر است که وظیفه کنترل کردن و توزیع سیگنال ریست و کلاک برای سیستم و دستگاههای جانبی را بر عهده دارد. سیگنالهای کلاک ورودی به واحد RCC، شامل سیگنالهای کلاک داخلی (مثل LSI، HSI و CSI) و خارجی (LSE و HSE) میشوند. هرکدام از منابع کلاک میتوانند بهصورت مستقیم یا غیرمستقیم (از طریق PLL) کلاک بخشهای مختلف سختافزار را تأمین کنند. در ادامه مطلب RCC در کتابخانه HAL، به توضیح مختصر در مورد ریست میکروکنترلر و هرکدام از منابع کلاک نامبرده شده میپردازیم.
ریست در میکروکنترلر
میکروکنترلرها مانند هر سیستم دیجیتالی دیگری، امکان ریست شدن دارند. ریست میکروکنترلر میتواند دلایل متفاوتی داشته باشد. عوامل ریست کننده میکرو نیز همیشه یکسان نیستند (این عامل بهعنوانمثال میتواند تایمر نگهبان، ریست نرمافزاری یا سختافزاری باشد) اما در اینجا میخواهیم به این سؤال پاسخ دهیم که ریست شدن میکرو دقیقاً به چه معناست و وقتی میکرو ریست میشود چه اتفاق یا اتفاقاتی خواهد افتاد؟
ریست شدن میکرو به معنای ساده، آغاز کار یا شروع دوباره میکروکنترلر برای اجرای کد نرمافزار، بهصورت کنترلشده است. زمانی که هر یک از عوامل، میکروکنترلر را ریست کنند، ابتدا مراحل زیر به ترتیب انجام میشوند؛
- مقدار رجیستر شمارنده برنامه یا PC، با آدرس 0 یعنی 0x00000000 پر میشود. این آدرس مربوط به بالای حافظه Stack است.
- در این زمان میکروکنترلر مقدار ذخیرهشده در آدرس 0x00000000 یا بالای Stack را در اشارهگر اصلی Stack یا همان MSP مینویسد.
- سپس مقدار PC بهاضافه 4 خواهد شد تا به آدرس بعدی در حافظه اشاره کند. آدرس بعد یعنی 0x00000004، حاوی اشارهگر به روال ریست (reset handler function) است که مراحل ریست را کنترل میکند.
- تابع ریست ابتدا تمامی وقفهها را غیرفعال میکند.
- سپس نوبت به مقداردهی اولیه سگمنتهای مختلف حافظه ازجمله data، Bss و stack میرسد.
- در این زمان وقفهها دوباره فعال خواهند شد.
- در آخر نیز تابع main فراخوانی میشود.
منابع کلاک
سیگنال کلاک چیست؟
همانطور که در هر سیستم دیجیتال ترتیبی یا دارای حافظه از یک سیگنال هماهنگکننده کلاک استفاده میشود، در پردازندهها و میکروکنترلرها نیز برای کارکرد خود به یک سیگنال کلاک وابسته هستند. در یک واحد پردازشی، بأس، رجیسترها و دستگاههای جانبی بهوسیله سیگنال کلاک هماهنگ میشوند. همچنین سیگنال کلاک تعیین میکند که پردازنده با چه سرعتی دستورات خود را پردازش میکند. بهعلاوه، Baud rate ارتباط سریال، سرعت تبدیل سیگنال آنالوگ به دیجیتال و بسیاری پارامترهای دیگر، توسط کلاک تعیین میشوند.
بهطورکلی کلاک سیستم از سه منبع مختلف میتواند تأمین شود که عبارتاند از:
- کلاک اسیلاتور HSI (یا اسیلاتور پرسرعت داخلی)
- کلاک اسیلاتور HSE (یا اسیلاتور پرسرعت خارجی)
- کلاک PLL اصلی
همچنین دو منابع کلاک دیگر نیز برای دستگاههای جانبی موجود است که عبارتاند از:
- مدار RC داخلی و کمسرعت (LSI RC) که فرکانس 32kHz را تولید میکند. از این کلاک معمولاً برای تایمر نگهبان مستقل (Independent Watchdog) و همچنین برای RTC هنگامیکه بخواهیم از Auto-wakeup استفاده کنیم.
- کلاک کریستال کمسرعت خارجی (LSE crystal) با فرکانس 32.768kHz که میتواند بهعنوان منابع کلاک RTC استفاده شود.
همانطور که گفته شد، سه منابع کلاک اول برای تأمین کلاک سیستم در میکروکنترلر بهکار میروند و دو منابع کلاک بعدی، سیگنال کلاک کمسرعت تأمین میکنند که استفاده اصلی آن برای تایمرهای نگهبان یا واحد RTC است. قابلذکر است که بهمنظور بهینگی مصرف توان، هر منبع کلاک میتواند بهصورت مستقل از منابع دیگر، خاموش و یا روشن شود.
در برخی میکروکنترلرها، علاوه بر منابع کلاک گفتهشده، کلاکهای دیگری نیز وجود دارند. مثلاً مدارات نوسانساز RC مثل CSI که یک RC داخلی توان پایین است که کلاکی با فرکانس 4MHz را تولید میکند. نکتهی دیگری که در مورد انتخاب اسیلاتور منبع کلاک باید به آن توجه کرد این است که اسیلاتور توانایی پشتیبانی از کارایی و سرعت پردازش مورد انتظار از میکروکنترلر را داشته باشد. بهبیاندیگر، بتواند نرخ کلاک موردنظر را تأمین کند. همچنین ازآنجاییکه برخی از اسلاتورها پیچیدگی بیشتر و قیمت بالاتری دارند، انتخاب نوع اسیلاتور بر پیچیدگی بورد و قیمت آن نیز تأثیر گذار خواهد بود.
همانطور که گفته شد، برای تولید سیگنال کلاک موردنیاز میکروکنترلر راههای مختلفی وجود دارد. در دیتاشیت هر دستگاه نیز، اطلاعات موردنیاز درباره اینکه چه نوع اسیلاتوری میتوان استفاده کرد و همچنین در مورد نحوه به کاربران و اتصال سختافزاری آن به سیستم، نوشتهشده است. در ادامه به دستهبندی منابع کلاک بر اساس نوع اسیلاتور میپردازیم و سپس در مورد مزایا و معایب هرکدام صحبت خواهیم کرد.
منابع داخلی
- مدار RC (مقاومت_خازنی)
- PLL (حلقه قفل فاز) برای چندبرابر کردن فرکانس
منابع خارجی
- کلاک CMOS
- کریستال
- رزناتور سرامیکی
- مدار RC
- خازن به تنهایی
نوسانسازهای داخلی
استفاده از نوسانسازهای داخلی و درنتیجه ساده نگهداشتن سیستم، به دلایلی منطقی، طرفداران خودش را دارد. توصیه میشود درصورتیکه منبع کلاک داخلی نیازهای ما را برآورده میکند، بهجای به کاربردن منبع خارجی، از آن استفاده کنیم. اولین مزیت این کار، بینیاز بودن از قطعات خارجی است. علاوه بر آن، ازآنجاکه سازنده میکروکنترلر این منبع کلاک را طراحی کردهاند، میتوان اطمینان داشت که فرکانس آن به خوبی انتخابشده است. دلیل دیگر این است که معمولاً مشخصات مربوط به کارکرد سیستم با این منبع کلاک، ازجمله دقت اولیه، Duty cycle، وابستگی دمایی در دیتاشیت، نوشتهشده است.
اما نقطهضعف اصلی نوسانسازهای داخلی، دقت پایین و عدم پایداری فرکانسی آنها است. میدانیم که فرکانس پایه این نوسانسازها، به عناصر پسیو سازنده آنها، بستگی دارد و تلرانس پارامترهای این عناصر، چندان کوچک نیست. بهعلاوه، مقدار خازن و مقاومت به دما نیز وابسته است و درنتیجه با تغییرات دما، فرکانس نوسان نیز دچار تغییر خواهد شد.
بااینحال، در خیلی از کاربردها، نوسانساز داخلی جوابگو است و خطاهای آن قابلچشمپوشی هستند. بهخصوص زمانی که فرکانس آن توسط سازنده کالیبره شده باشد. درحالیکه نوسانسازهای میکروکنترلرهای قدیمی تلرانسی در حدود %20± داشتند، در میکروکنترلرهای جدیدتر، این مقدار به کمتر از %1.5± بهبودیافته است که دقت کافی برای ارتباط RS-232 و حتی USB (در صورت استفاده از مدار clock-recovery) را فراهم میکند.
روش دیگری که برای افزایش کارایی نوسانساز داخلی وجود دارد تریم (Trimming) کردن بهصورت دستی است. درصورتیکه میکروکنترلر مورداستفاده دارای رجیستر Trimming/Calibration باشد، میتوان با تغییر مقدار این رجیستر، فرکانس را تنظیم کرد. این روش بهخصوص برای کاربردهایی که در تعداد محدود طراحی و تولید میشوند، میتواند بسیار مفید واقع شود. مراحل انجام کار نیز به این صورت است که فرکانس کلاک بهوسیله اسیلوسکوپ یا فرکانس شمار اندازهگیری میشود و سپس نوسانساز بر همین اساس و از طریق رجیستر نامبرده شده، تریم خواهد شد.
ابزار دیگری که برای کارایی بهتر نوسانساز در اختیارداریم، حلقه قفل فاز یا همان PLL است. با استفاده از PLL میتوانیم دقت و پایداری یک اسلاتور سریع اما کم کیفیت داخلی را به یک اسیلاتور خارجی دقیق، نزدیک کنیم. بااینحال باید توجه کنیم که یک PLL عموماً ما را از عناصر خارجی بینیاز نمیکند. زیرا معمولاً از یک کریستال برای تأمین کلاک رفرنس موردنیاز PLL استفاده میشود. اگرچه در این مورد نیز استثنایی وجود دارد. همچنان میتوان در مواردی که روی PCB یک کلاک با دقت و کیفیت بالا داریم (که به دلیل سرعتپایین آن قابلاستفاده برای میکروکنترلر نیست) از PLL برای بالا بردن فرکانس آن استفاده کنیم.
کلاک CMOS
گزینهی دیگری که برای تأمین کلاک وجود دارد بانام “CMOS clock” شناخته میشود. درواقع “CMOS clock” را میتوان به هر نوع سیگنال کلاکی که توسط یک عنصر خارجی روی بورد، تأمین میشود، اطلاق کرد. درواقع درجاهایی که بورد طراحیشده، شامل یک سیگنال کلاک با فرکانس مناسب و مشخصات الکتریکی سازگار برای ورودی CMOS clock میکروکنترلر میشود، این گزینه انتخاب بسیار خوبی به نظر میرسد. اما ازآنجاکه در بیشتر موارد چنین سیگنال کلاکی در دسترس نیست، میخواهیم دو روش برای تولید چنین سیگنال کلاکی را بررسی کنیم.
گزینه اول استفاده از کریستال نوسانساز (“Crystal Oscillator”) است. جا دارد که در اینجا به این نکته اشارهکنیم که یک کریستال کوارتز، بهتنهایی نمیتواند نوسانساز باشد. بلکه بهعنوان عنصر اصلی و مرکزی یک مدار نوسانساز کریستال کوارتزی، استفاده میشود. چنین مداری میتواند در شکل و شمایلی مانند مدار زیر باشد:
کوارتز و سرامیک
در کاربردهایی که نیاز بهدقت و پایداری بالا وجود دارد، اما قصد نداریم که برای IC نوسانساز کریستالی هزینه کنیم، میتوانیم از خود کریستال بهتنهایی استفاده کنیم. در میکروکنترلرهایی که از چنین روشی پشتیبانی میکنند، بخشی از مدار نوسانساز کریستالی که در بالا در مورد آن صحبت کردیم، گنجاندهشده است. تنها قطعه موردنیاز که باید در کنار کریستال استفاده شود، خازنهای لود مناسب هستند. خازن لود معادلی (CLTOTAL) که باید با کریستال استفاده شود، در دیتا شیت آن نوشتهشده است. بر همین اساس، خازنهای لود بهوسیله رابطه زیر انتخاب میشوند:
در این رابطه، CP نشاندهنده خازنهای پارازیتی است. استفاده از این رابطه نیز بسیار ساده است؛ ابتدا باید یک مقدار منطقی برای CP در نظر بگیریم (بهعنوانمثال pF 5). سپس مقدار CP را از CLTOTAL کم کرده و حاصل را ضربدر 2 میکنیم. برای مثال اگر خازن لود معادل در دیتاشیت برابر با pF 18 تعیینشده باشد، خواهیم داشت:
رزناتورهای سرامیکی نسبت به کریستالها دقت کمتری دارند؛ بهطورمعمول، تلرانس آنها حدود 1000 تا 5000 ppm است. بااینحال اگر بهدقت کریستال کوراتز نیاز نداشته باشیم، استفاده از رزناتورهای سرامیکی باعث کاهش هزینه خواهد شد. علاوه بر این، مزیت اصلی رزناتورهای سرامیکی این است که بهصورت مجتمع در آنها خازنهای لود نیز بهکاررفته و دیگر نیازی به خازن خارجی ندارند.
خازن و مقاومت
در اکثر کاربردها، اسیلاتور خازن-مقاومتی و یا خازنی، بهعنوان یک منبع کلاک استفاده نمیشود. بااینحال ممکن است بسته به کاربرد و بنا به دلایلی، این نوع اسیلاتور خارجی به گزینههای قبلی ترجیح داده شود (و استفاده از اسیلاتور داخلی میکروکنترلر نیز مطلوب یا امکانپذیر نباشد). در این صورت برای جزییات طراحی و نحوه اتصال مدار نوسانساز، باید به دیتاشیت میکروکنترلر مورداستفاده، مراجعه کرد. برای نمونه برای میکروکنترلرهای C8051F12x–13x، با توجه به دیتاشیت آنها، اتصالهای گفتهشده، به این صورت هستند:
برای جمعبندی و خلاصه کردن نحوه انتخاب منبع کلاک، با توجه به نکات گفتهشده راجع به انواع منابع تولید سیگنال کلاک، میتوان دو مورد زیر را در نظر داشت:
-درزمانی که اسیلاتور داخلی جوابگوی کاربرد موردنظر ماست، به همان اکتفا کنیم.
-درصورتیکه دقت بالا موردنیاز است و مشکل هزینه وجود ندارد، به سراغ نوسانساز سیلیکونی میرویم. در غیر این صورت نیز کریستال کوارتزی را انتخاب میکنیم.
نحوه تنظیم کلاک در محیط STM32Cube IDE
در بخش قبلی سری آموزش HAL، نحوه پیکربندی پروژهها بررسی شد و گفتیم که تنظیمات مربوط به کلاک را در این قسمت توضیح میدهیم. پس دوباره به صفحه تنظیم کلاک در بخش پیکربندی پروژه با STM32CubeIDE (یا STM32CubeMX) برمیگردیم؛
در تب Pinout & Configuration و در بخش System Core -> RCC، میتوانیم نوع منبع کلاک را مشخص کنیم. قسمت LSE مربوط به کلاک کمسرعت خارجی و قسمت HSE مربوط به کلاک پرسرعت خارجی است که در پروژههای اول تنها نیاز به تنظیم همین قسمت خواهیم داشت. ازآنجاکه ما میخواهیم از کریستال روی بورد Blue Pill، بهعنوان منبع کلاک استفاده کنیم، مانند شکل گزینه Crystal/Ceramic Resonator را انتخاب میکنیم. بقیه پارامترها ازجمله HSI Calibration (که مربوط به رجیستر Trim/Calibration است که در ابتدای متن اشاره کردیم) را بدون تغییر رها میکنیم.
در تب بعد یعنی Clock Configuration، مانند شکل زیر میتوانیم بهصورت گرافیکی کلاک هر بخش را تنظیم کنیم. از طریق مالتیپلکسر مشخصشده در شکل میتوانیم از میان گزینههای HSI، HSE و PLLCLK منبع تأمینکننده کلاک سیستم را انتخاب کنیم؛
گزینه Enable CSS که در پایین مالتیپلکسر مشخصشده در شکل بالا، وجود دارد، مربوط به فعال کردن سیستم حفاظت کلاک (Clock Security Systerm) است. این سیستم که تنها در صورت استفاده از HSE به شکل مستقیم یا غیرمستقیم (از طریق PLL)، قابل فعالسازی است، باعث میشود که اگر به هر دلیلی HSE دچار اشکال شود، سیستم (از طریق break event تولیدشده توسط CSS) به حالت امن (Safe State) برود. بهعنوانمثال این قابلیت میتواند در کاربردهای حساسی مثل کنترل موتور استفاده شود.
سیگنال کلاک ورودی PLL نیز با استفاده از مالتیپلکسر پایین شکل قابل تنظیم است. برای ورودی PLL میتوانیم یکی از دو منبع کلاک HSI یا HSE را انتخاب کنیم؛
همانطور که میدانیم PLL امکان افزایش نرخ کلاک را به ما میدهد. با انتخاب مقدار PLLMul میتوانیم کلاک ورودی سیستم را براساس مضربی از سیگنال ورودی PLL تنظیم کنیم؛
برای تنظیم کلاک بخشهای مختلف سیستم، ازجمله باسها و پریفرالها، میتوانیم از تقسیمکنندهها و ضرب کننده های موجود در مسیر کلاک آنها، استفاده کنیم؛
همچنین یک روش دیگر برای تنظیم کلاک بخشهای مختلف، نوشتن مقدار کلاک موردنظر در باکس موجود در مسیر کلاک آن قسمت است. به این طریق، خود نرمافزار ضرب و تقسیمهای مناسب برای دستیابی به کلاک مشخصشده را محاسبه میکند. البته درصورتیکه کلاک مشخصشده قابل دستیابی و در محدوده نرخ کلاک ممکن برای میکروکنترلر باشد.
اکنون میخواهیم در مورد دو مالتیپلکسر دیگر که در این شکل وجود دارند صحبت کنیم. مالتیپلکسر اول در بالا سمت چپ و مربوط به کلاک RTC است. درصورتیکه در تب Pinouts & Configuration، واحد RTC را فعال کرده باشیم، کلاک آن از میان سه گزینه LSI (با فرکانس KHz 40)، LSE و HSE تقسیمبر 128، قابل انتخاب است؛
مالتیپلکسر دوم نیز در قسمت پایین شکل و مربوط به خروجی کلاک میکروکنترلر است. درصورتیکه مال در تب Pinouts & Configuration، پایه مربوط به خروجی کلاک میکروکنترلر را فعال کرده باشیم، میتوانیم از طریق این مالتیپلکسر انتخاب کنیم که چه کلاکی را روی این پایه بفرستیم؛
در این قسمت از سری آموزش STM32 با توابع HAL، در مورد RCC در کتابخانه HAL (ریست و کلاک میکروکنترلر) نکات مفیدی را یاد گرفتیم. در قسمت بعدی میخواهیم در مورد نحوه دیباگ کد پروژه در نرمافزار STM32CubeIDE صحبت کنیم. با ما همراه باشید.
منبع: سیسوگ