تقریباً هر مدار دیجیتال یک راهی برای همگامسازی مدارهای داخلی خود یا همگامسازی خود با مدارهای دیگر نیاز دارد. کلاک بخشی است که سیگنالهای پریودیک تولید میکند و بزرگترین منبع ضربان قلب در الکترونیک دیجیتال است.
با این حال، سیگنالهای کلاک یکسان را نمیتوان برای تغذیه همه اجزا و تجهیزات جانبی ارائه شده توسط میکروکنترلرهای مدرن مانند STM32 استفاده کرد. علاوه بر این، توان مصرفی یک جنبه حیاتی است که مستقیماً با سرعت کلاک یک واحد جانبی مشخص ارتباط دارد. داشتن قابلیت غیرفعال کردن یا کاهش سرعت کلاک برخی از بخشهای MCU امکان بهینهسازی مصرف توان کلی سیستم را فراهم میکند. این امر مستلزم آن است که کلاک در یک ساختار منظم سازماندهی شود و به توسعهدهنده امکان انتخاب سرعتها و منابع کلاک مختلف را بدهد.
در این مقاله به معرفی مختصری از شبکه توزیع پیچیده کلاک در میکروکنترلر STM32 میپردازیم. هدف ما ارائه ابزارهای لازم برای درک و مدیریت درخت کلاک (Clock tree) به خواننده است تا عملکردهای اصلی ماژول HAL_RCC را دریابد.
توزیع کلاک
کلاک بخشی است که معمولاً یک سیگنال مربعی با سیکل کاری 50 درصد تولید میکند:
سیگنال کلاک بین سطوح ولتاژ VL و VH در نوسان است، که برای میکروکنترلرهای STM32 کسری از ولتاژ تغذیه VDD است. اساسی ترین پارامتر یک کلاک فرکانس است که نشان میدهد چند بار در یک ثانیه از VL به VH تغییر میکند. فرکانس بر حسب هرتز بیان میشود.
اکثر میکروکنترلرهای STM32 را میتوان با دو منبع کلاک مجزا راه اندازی کرد: یک نوسانگر داخلی RC oscillator (به نام داخلی با سرعت بالا (HSI)) یا یک نوسانگر RC oscillator کریستالی اختصاصی خارجی (به نام خارجی با سرعت بالا (HSE)). دلایل مختلفی برای ترجیح کریستال خارجی به نوسانگر داخلی RC وجود دارد:
کریستال خارجی دقت بالاتری در مقایسه با شبکه داخلی RC دارد، که با دقت 1% درجه بندی میشود، بهویژه زمانی که دمای عملیاتی PCB از دمای 25 درجه سانتیگراد محیط فاصله داشته باشد.
برخی از تجهیزات و واحدهای جانبی، به ویژه آنهایی که سرعت بالا دارند، فقط توسط یک کریستال خارجی اختصاصی که در فرکانسی معین کار میکند، میتوانند کار کنند.
در کنار اسیلاتور پرسرعت، میتوان از منبع کلاک دیگری برای بایاس کردن نوسان ساز کم سرعت استفاده کرد، که به نوبه خود میتواند توسط یک کریستال خارجی (به نام خارجی با سرعت پایین (LSE)) یا نوسانگر داخلی اختصاصی RC (به نام داخلی با سرعت پایین) کلاک شود. نوسان ساز کم سرعت برای راهاندازی Real Time Clock (RTC) و واحد Independent Watchdog (IWDT) (IWDT) استفاده میشود.
فرکانس نوسانگر پرسرعت فرکانس واقعی هسته Cortex-M و سایر تجهیزات و واحدهای جانبی را فراهم نمیکند. یک شبکه توزیع پیچیده که درخت کلاک clock tree نامیده میشود، مسئول انتشار سیگنال کلاک در داخل میکروکنترلر STM32 است. با استفاده از چندین programmable Phase-Locked Loops (PLL) و prescalers، میتوان فرکانس منبع کلاک را در صورت نیاز (بسته به عملکردی که میخواهیم به آن برسیم، حداکثر سرعت برای یک واحد جانبی یا گذرگاه (باس) معین و توان مصرفی) افزایش/کاهش داد.
بررسی STM32 Clock Tree
درخت کلاک میکروکنترلر STM32 میتواند ساختار واقعاً مفصلی داشته باشد. حتی در MCUهای “ساده تر” STM32F0، شبکه کلاک داخلی میتواند تا چهار مرحله PLL/prescaler داشته باشد و سیستم Clock Multiplexer (همچنین به عنوان System Clock Switch (SW) شناخته میشود) می تواند توسط چندین منبع جایگزین، تغذیه شود.
توضیح عمیق درخت کلاک هر خانواده STM32 یک کار پیچیده است، که مستلزم تمرکز بر روی یک قطعه STM32 خاص است. در واقع، ساختار درخت کلاک عمدتاً تحت تأثیر جنبههای کلیدی زیر است:
خانواده اصلی میکروکنترلر STM32. به عنوان مثال، تمام MCU های STM32F0 فقط یک گذرگاه جانبی (APB1) را ارائه میدهند که میتواند با حداکثر فرکانس هسته Cortex-M کلاک شود. سایر میکروکنترلرهای STM32 معمولاً دو گذرگاه جانبی را ارائه میدهند و تنها یکی از آنها (APB2) میتواند به حداکثر سرعت کلاک CPU برسد. در عوض، هیچ یک از باسهای جانبی موجود در میکروکنترلر STM32F7 نمیتواند به حداکثر فرکانس هسته برسد. جدول 1 حداکثر سرعت کلاک را برای باس های AHB، APB1 و APB2 (با تایمرهای مربوط به سرعت کلاک) MCU های مختلف را گزارش میدهد: برای برخی از MCU های STM32، رسیدن به حداکثر سرعت کلاک فقط با استفاده از یک نوسان ساز خارجی HSE امکان پذیر است.
نوع و تعداد تجهیزات و واحدهای جانبی ارائه شده توسط MCU. پیچیدگی درخت کلاک با تعداد تجهیزات و واحدهای جانبی موجود افزایش مییابد. علاوه بر این، برخی از تجهیزات جانبی به منابع کلاک و سرعت اختصاصی نیاز دارند که به تعداد مراحل PLL تأثیر میگذارد.
نوع پکیج MCU و تعداد واحد جانبی ارائه شده
شکل زیر درخت کلاک یکی از سادهترین میکروکنترلرهای STM32 را نشان میدهد: STM32F030R8. برای بسیاری از تازهکارها در میکروهای STM32، این تصویر کاملاً بیمعنی است و رمزگشایی آن بسیار سخت است، بهخصوص اگر در میکروکنترلرها تازه کار باشند. مرتبط ترین مسیر با رنگ قرمز مشخص شده است: مسیری که از نوسانگر HSI به هسته Cortex-M0، گذرگاه AHB و DMA میرود. حال بخشهای این مسیر را معرفی خواهیم کرد.
مسیر از نوسانگر داخلی 8 مگاهرتز شروع میشود. همانطور که قبلا گفته شد، این یک نوسانساز RC است که توسط ST با دقت 1% در دمای محیط 25 درجه سانتیگراد کالیبره شده است. سپس کلاک HSI میتواند برای تغذیه System Clock Switch (SW) همانطور که هست (مسیری که در شکل 3 با رنگ آبی مشخص شده است) استفاده شود یا میتوان از آن برای تغذیه PLL پس از تقسیم شدن بر دو توسط prescaler میانی استفاده کرد. PLL اصلی میتواند کلاک 4 مگاهرتز را تا ضریب 12 افزایش دهد تا حداکثر فرکانس کلاک سیستم (SYSCLK) یعنی 48 مگاهرتز را به دست آورد. منبع SYSCLK را میتوان برای تغذیه واحد جانبی I2C1 (جایگزین HSI) و prescaler میانی دیگر، prescaler مرتبط با AHB، برای کاهش سرعت (HCLK)، برای بایاس گذرگاه AHB، هسته و SysTimer استفاده کرد.
چرا این همه مراحل میانی PLL/Prescaler وجود دارد؟
همانطور که قبلاً گفته شد، سرعت کلاک عملکرد کلی را تعیین میکند، اما بر توان مصرفی کل MCU نیز تأثیر میگذارد. داشتن قابلیت روشن/خاموش کردن یا کاهش سرعت کلاک برخی از قسمتهای MCU امکان کاهش توان مصرفی را بر اساس توان محاسباتی موثر مورد نیاز میدهد. MCUهای L0/1/4 حتی مراحل PLL/prescaler بیشتری را معرفی میکنند تا توسعه دهندگان کنترل بیشتری بر توان مصرفی کل MCU داشته باشند.
پیکربندی clock tree از طریق یک واحد جانبی اختصاصی به نام Reset and Clock Control (RCC) انجام میشود، و این فرآیند اساساً از سه مرحله تشکیل شده است:
در صورت استفاده از HSE، منبع نوسان ساز پرسرعت (HSI یا HSE) انتخاب شده و به درستی پیکربندی میشود.
اگر بخواهیم SYSCLK را با فرکانس بالاتر از فرکانس ارائه شده توسط نوسانگر پرسرعت تغذیه کنیم، باید PLL اصلی (که سیگنال PLLCLK را ارائه میدهد) را پیکربندی کنیم. در غیر این صورت میتوانیم از این مرحله بگذریم.
System Clock Switch (SW) با انتخاب منبع کلاک مناسب (HSI، HSE، یا PLLCLK) پیکربندی میشود. سپس تنظیمات prescaler مناسب AHB، APB1 و APB2 (در صورت وجود) را انتخاب میکنیم تا به فرکانس مورد نظر High-speed clock (HCLK – که هسته، DMA و گذرگاه AHB را تغذیه میکند) و Advanced Peripheral Bus 1 (APB1) و APB2 (در صورت وجود) برسیم.
دانستن مقادیر مجاز برای PLLها و prescalers ، به خصوص برای MCU های پیچیده تر STM32 میتواند یک کابوس باشد. پیکربندی نامناسب آنها میتواند به طور بالقوه به MCU آسیب برساند یا حداقل باعث اختلال در عملکرد آنها شود (پیکربندی اشتباه کلاک میتواند منجر به رفتار غیرعادی، ریستهای عجیب و غیرقابل پیشبینی و غیره شود). خوشبختانه مهندسان STM32 برای ما، یک ابزار عالی برای ساده کردن پیکربندی کلاک ارائه کردهاند: CubeMX.
پیکربندی Clock Tree با استفاده از CubeMX STM32
شکل زیر درخت کلاک میکروکنترلر F0 را نشان میدهد. همانطور که میبینید، شبکه توزیع پیچیدگی کمتری دارد:
در این مورد نیز، مرتبطترین مسیرهای واحد کلاک به رنگ قرمز و آبی مشخص شده است. هنگامی که یک پروژه جدید ایجاد میشود، CubeMX به طور پیش فرض نوسانگر HSI را به عنوان منبع کلاک پیش فرض انتخاب میکند. همانطور که در شکل بالا نشان داده شده است، HSI نیز به عنوان منبع کلاک پیشفرض برای System Clock Switch (مسیر به رنگ آبی) انتخاب شده است.
CubeMX همچنین به ما توصیه میکند که حداکثر فرکانس برای کلاک سرعت بالا (HCLK) و گذرگاه APB1 برابر با 48 مگاهرتز است (نوشتههای به رنگ آبی). برای افزایش فرکانس CPU، ابتدا باید PLLCLK را به عنوان منبع کلاک برای System Clock Switch انتخاب و سپس ضریب مناسب PLL را انتخاب کنیم. با این حال، CubeMX یک راه سریع برای انجام این کار ارائه میدهد: میتوانید به سادگی “48” را در قسمت HCLK بنویسید و کلید enter را بزنید. CubeMX به طور خودکار تنظیمات مربوطه را انجام میدهد و مسیر درست را در درخت کلاک درست انتخاب میکند (مسیر قرمز در شکل بالا)
اگر برد شما به کریستال HSE/LSE خارجی متصل است، قبل از اینکه بتوانید از آن به عنوان منبع کلاک اصلی برای نوسانگر مربوطه استفاده کنید، باید آن را در واحد جانبی RCC فعال کنید (خواهیم دید که چگونه این کار را گام به گام انجام دهیم). هنگامی که نوسان ساز خارجی فعال می شود، میتوان فرکانس آن را مشخص کرد (در داخل کادر آبی با عنوان ” input frequency “) و PLL اصلی را برای دستیابی به سرعت SYSCLK مورد نظر پیکربندی کرد (شکل زیر را ببینید). در غیر این صورت، فرکانس ورودی نوسان ساز خارجی میتواند مستقیماً به عنوان منبع کلاک برای System Clock Switch استفاده شود.
برای فعال کردن منبع کلاک خارجی، باید واحد جانبی RCC را بر این اساس پیکربندی کنیم. این کار را میتوان از بخش Pinout در CubeMX، همانطور که در شکل زیر نشان داده شده است، انجام داد.
CubeMX برای هر دو اسیلاتور HSE و LSE، سه گزینه پیکربندی ارائه میدهد:
Disable: نوسانساز خارجی استفاده نمیشود و نوسان ساز داخلی مربوطه استفاده میشود.
Crystal/Ceramic Resonator: یک رزوناتور کریستال/سرامیک خارجی استفاده میشود و فرکانس اصلی مربوطه از آن استخراج میشود. یعنی از پینهای RCC_OSC_IN و RCC_OSC_OUT برای ارتباط با HSE استفاده میشود و I/Os مربوطه برای کاربردهای دیگر در دسترس نیست (اگر از یک کریستال خارجی low-speed استفاده میکنیم، از ورودی/خروجیهای RCC_OSC32_IN و RCC_OSC32_OUT مربوطه نیز استفاده میشود).
BYPASS Clock Source: منبع کلاک خارجی استفاده شده توسط دستگاه فعال دیگری تولید میشود. یعنی RCC_OSC_OUT بدون استفاده رها شده و امکان استفاده از آن به عنوان GPIO معمولی وجود دارد. تقریباً در تمام بردهای توسعه ST (شامل بردهای Nucleo) پین خروجی Master Clock Output (MCO) رابط ST-LINK به عنوان منبع کلاک خارجی برای میکروکنترلر هدف STM32 استفاده می شود. با فعال کردن این گزینه می توانید از STLINK MCO به عنوان HSE استفاده کنید.
واحد جانبی RCC همچنین اجازه میدهد تا خروجی Master Clock Output (MCO)، که یک پین متصل به منبع کلاک میباشد را فعال کنید. ار این پین میتوان به عنوان کلاک یک دستگاه خارجی دیگر استفاده کرد که در استفاده از آیسی کریستال خارجی دیگر صرفه جویی میشود. هنگامی که MCO فعال شود، میتوان منبع کلاک آن را با استفاده از Clock Configuration view انتخاب کرد.
نمای کلی ماژول HAL_RCC
تاکنون دیدیم که واحد جانبی Reset and Clock Control (RCC) مسئول پیکربندی کل درخت کلاک یک میکروکنترلر STM32 است. ماژول HAL_RCC شامل توصیفگرها و روالهایی در CubeHAL برای پیاده سازی RCC است. با این حال، اجرای واقعی این ماژول ناگزیر منعکس کننده ویژگیهای درخت کلاک در سری معینی از STM32 و پارت نامبر مربوطه است. اکنون مروری کوتاه بر ویژگیهای اصلی آن و مراحل مربوط به پیکربندی درخت کلاک خواهیم داشت.
مرتبط ترین ساختار C برای پیکربندی درخت کلاک ، RCC_OscInitTypeDef و RCC_ClkInitTypeDef هستند. اولین مورد برای پیکربندی منابع نوسان ساز داخلی/خارجی RCC HSE، HSI، LSE، LSI، به علاوه برخی منابع کلاک اضافی ( در صورت ارائه توسط MCU) استفاده میشود. به عنوان مثال، برخی از MCU های STM32 از سری F0 (STM32F07x، STM32F0x2 و STM32F09x) پشتیبانی از USB 2.0، علاوه بر یک نوسان ساز داخلی اختصاصی و کالیبره شده با سرعت بالا، با فرکانس 48 مگاهرتز را برای بایاس USB 2.0 ارائه میدهند. در این صورت، ساختار RCC_OscInitTypeDef نیز برای پیکربندی آن منابع کلاک اضافی استفاده میشود. ساختار RCC_OscInitTypeDef همچنین دارای یک نمونه ای از ساختار RCC_PLLInitTypeDeff، بوده که PLL اصلی مورد استفاده برای افزایش سرعت منبع کلاک را پیکربندی میکند. این ساختار انعکاسدهنده سخت افزار PLL اصلی میباشد و بسته به سری STM32 میتواند توسط چندین فیلد تشکیل شود (در MCU های STM32F2/4/7 میتواند ساختار کاملاً پیچیدهای داشته باشد).
ساختار RCC_ClkInitTypeDef، در عوض، برای پیکربندی کلاک منبع System Clock Switch (SWCLK)، برای گذرگاه AHB و گذرگاههای APB1/2 استفاده میشود.
با استفاده از برنامه CubeMX میتوان کد مناسب اولیه را برای پیکربندی درخت کلاک میکروکنترلر مورد نظر ایجاد کرد. تمام کدهای لازم در روتین SystemClock_Config() گنجانده شده است که در پروژه هایی که تاکنون تولید شده با آن مواجه شده ایم. به عنوان مثال، در تابع زیر، پیکربندی درخت کلاک برای STM32F030R8 که با فرکانس 48 مگاهرتز کار میکند؛ پیاده شده است:
1 void SystemClock_Config(void) {
2 RCC_OscInitTypeDef RCC_OscInitStruct;
3 RCC_ClkInitTypeDef RCC_ClkInitStruct;
4
5 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
6 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
7 RCC_OscInitStruct.HSICalibrationValue = 16;
8 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
9 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
10 RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;
11 RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
12 HAL_RCC_OscConfig(&RCC_OscInitStruct);
13
14 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
15 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
16 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
17 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
18 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
19
20 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
21
22 HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
23
24 /* SysTick_IRQn interrupt configuration */
25 HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
26 }
خطوط [5:12] HSI را به عنوان منبع نوسانگر انتخاب و PLL اصلی را فعال میکنند و HSI را به عنوان منبع کلاک خود از طریق مالتی پلکسر PLL تنظیم میکنند. سپس فرکانس کلاک دوازده برابر افزایش مییابد (فیلد PLLMUL). خطوط [14:18] فرکانس SYSCLK را تنظیم میکنند. PLLCLK به عنوان منبع کلاک انتخاب میشود (خط 15). به همین ترتیب، فرکانس SYSCLK به عنوان منبع برای گذرگاه AHB و همان فرکانس HCLK (RCC_HCLK_DIV1) به عنوان منبع برای گذرگاه APB1 انتخاب میشود. خطوط دیگر کد تایمر SysTick را تنظیم میکند، تایمر ویژهای که در هسته Cortex-M برای همگام سازی برخی از فعالیتهای داخلی HAL استفاده میشود (یا برای هدایت زمان بندی یک RTOS). HAL مبتنی بر وقفه 1 میلی ثانیه تایمر SysTick است. از آنجایی که ما کلاک SysTick را طوری پیکربندی میکنیم که در حداکثر فرکانس هسته 48 مگاهرتز کار کند (به این معنی که SYSCLK 48.000.000 چرخه کلاک را در هر ثانیه انجام میدهد)، میتوانیم تایمر SysTick را طوری تنظیم کنیم که هر 48.000.000 cycles/1000ms=48.000 چرخه کلاک، وقفه ایجاد کند.
محاسبه فرکانس کلاک در زمان اجرا
گاهی اوقات مهم است که بدانیم هسته CPU با چه سرعتی کار میکند. اگر فریمور طوری طراحی شده باشد که همیشه در یک فرکانس مشخص اجرا شود، میتوانیم به راحتی آن مقدار را در نرم افزار با استفاده از یک ثابت نمادین hardcode کدگذاری کنیم. با این حال، این روش یک سبک برنامه نویسی ضعیف به شمار میرود، و اگر فرکانس CPU را به صورت پویا تغییر دهیم، کاملاً غیر قابل اجرا است. CubeHAL تابع HAL_RCC_GetSysClockFreq() را ارائه میدهد که میتواند برای محاسبه فرکانس SYSCLK استفاده شود. با این حال، برای استفاده از این تابع باید مراقبت ویژهای انجام شود.
تابع HAL_RCC_GetSysClockFreq() فرکانس واقعی SYSCLK را بر نمیگرداند (در واقع هیچ وقت نمیتواند مقدار قابل اعتمادی را بدون داشتن یک مرجع خارجی شناخته شده و دقیق انجام دهد)، اما نتیجه ارائه شده بر اساس الگوریتم زیر میباشد:
اگر منبع SYSCLK نوسانگر HSI باشد، مقدار را بر اساس ماکرو HSI_VALUE برمیگرداند.
اگر منبع SYSCLK نوسانگر HSE باشد، مقدار را بر اساس ماکرو HSE_VALUE برمیگرداند.
اگر منبع SYSCLKواحد PLLCLK باشد، مقداری بر اساس HSI_VALUE/HSE_VALUE ضرب در ضریب PLL، برمیگرداند.
ماکروهای HSI_VALUE و HSE_VALUE در داخل فایل stm32xxx_hal_conf.h تعریف شدهاند و مقادیر hardcod کدگذاری شده هستند. HSI_VALUE توسط ST هنگام طراحی تراشه تعریف میشود و ما میتوانیم به مقدار ماکرو مربوطه اعتماد کنیم (1% دقت). در عوض، اگر از یک نوسانساز خارجی به عنوان منبع HSE استفاده میکنیم، باید مقدار واقعی ماکرو HSE_VALUE را ارائه دهیم، در غیر این صورت مقدار بازگردانده شده توسط تابع HAL_RCC_GetSysClockFreq() اشتباه است و بر فرکانس تیک (یعنی مدت زمان ایجاد وقفه تایمر) تایمر SysTick تأثیر میگذارد.
همچنین میتوانیم فرکانس هسته را با استفاده از متغیر گلوبال SystemCoreClock مربوط به CMSIS بازیابی کنیم.
تذکر: اگر تصمیم گرفتیم پیکربندی درخت کلاک را بدون استفاده از روالهای CubeHAL تغییر دهیم، باید به خاطر داشته باشیم که هر بار که فرکانس SYSCLK را تغییر میدهیم، باید تابع CMSIS (SystemCoreClockUpdate) را فراخوانی کنیم، در غیر این صورت ممکن است برخی روالهای CMSIS نتایج اشتباهی را ارائه دهند. این تابع به طور خودکار توسط روتین HAL_RCC_ClockConfig () برای ما فراخوانی میشود.
فعال سازی Master Clock Output
همانطور که قبلاً گفته شد، بسته به پکیج آی سی مورد استفاده، MCU های STM32 اجازه میدهند تا سیگنال کلاک را به یک یا دو I/O که Master Clock Output (MCO) نامیده میشود، هدایت کنند. این کار با استفاده از تابع زیر انجام میشود:
void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv);
به عنوان مثال، برای هدایت PLLCLK به پایه MCO1 در میکروکنترلر STM32F401RE (که مربوط به پایه PA8 است)، باید تابع فوق را به روش زیر فراخوانی کنیم.
HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLLCLK, RCC_MCODIV_1);
تذکر: لطفاً توجه داشته باشید که هنگام پیکربندی پین MCO به عنوان GPIO خروجی، سرعت آن (یعنی slew rate) بر کیفیت کلاک خروجی تأثیر میگذارد. علاوه بر این، برای فرکانسهای کلاک بالاتر، compensation باید به روش زیر فعال شود:
HAL_EnableCompensationCell();
برای اطلاعات بیشتر در این مورد به دیتاشیت MCU خود مراجعه کنید.
فعال سازی Clock Security System
سیستم امنیتی کلاک (CSS) Clock Security System یکی از ویژگیهای واحد جانبی RCC است که برای تشخیص نقص عملکرد HSE خارجی استفاده میشود. CSS یک ویژگی مهم در برخی از کاربردهای حیاتی است که در آن نقص HSE میتواند باعث آسیب به کاربر شود. اهمیت آن با تشخیص خرابی از طریق استثنا NMI ثابت میشود (یک استثنا در Cortex-M که غیرفعال نمیشود.)
هنگامی که خرابی HSE شناسایی شد، میکروکنترلر به طور خودکار به کلاک HSI سوئیچ می کند که به عنوان منبع برای کلاک SYSCLK انتخاب می شود. بنابراین، اگر فرکانس هسته بالاتری مورد نیاز است، باید مقداردهیه مناسبی را در کنترل کننده استثنا NMI انجام دهیم.
برای فعال کردن CSS، از تابع HAL_RCC_EnableCSS() استفاده میکنیم، و باید تابع handler را برای استثنای NMI به روش زیر تعریف کنیم:
void NMI_Handler(void) {
HAL_RCC_NMI_IRQHandler();
}
راه درست برای تشخیص خرابی ساعت HSE ، تعریف callback است:
void HAL_RCC_CSSCallback(void) {
//Catch the HSE failure and take proper actions
}
کالیبراسیون HSI
ما خط 7 در کد تابع SystemClock_Config() را بدون توضیح رها کردیم که برای انجام کالیبراسیون دقیق اسیلاتور HSI استفاده میشد. اما دقیقا چه کاری انجام میدهد؟
همانطور که قبلاً گفته شد، فرکانس نوسانگرهای داخلی RC ممکن است از یک تراشه به تراشه دیگر به دلیل تغییرات فرآیند تولید متفاوت باشد. به همین دلیل، نوسانگرهای HSI توسط ST به صورتی در کارخانه کالیبره شدهاند تا دقت 1% در دمای اتاق را داشته باشند. پس از ریست، مقادیر کالیبراسیون کارخانه به طور خودکار در بایت دوم (HSICAL) رجیستر پیکربندی RCC (RCC_CR) بارگذاری میشود (شکل زیر این رجیستر را در STM32F401RE17 نشان میدهد)
فرکانس نوسان ساز داخلی RC را میتوان برای دستیابی به دقت بهتر با دامنه وسیع تر دما و ولتاژ تغذیه، تنظیم کرد. برای این منظور از. پنج بیت trimming ، RCC_CR->HSITRIM[4:0] برای تنظیم دقیق استفاده میشود. مقدار پیشفرض trimming ،16 است. افزایش/کاهش این مقدار باعث افزایش/کاهش فرکانس HSI میشود. نوسان ساز HSI در هر سطح با تقریب 0.5 درصد از سرعت کلاک HSI به خوبی تنظیم میشود:
مقدار trimming در محدوده 17 تا 31 فرکانس HSI را افزایش میدهد.
مقدار trimming در محدوده 0 تا 15 فرکانس HSI را کاهش میدهد.
مقدار trimming برابر با 16 باعث میشود که فرکانس HSI مقدار پیش فرض خود را حفظ کند.
HSI را میتوان با استفاده از روش زیر کالیبره کرد:
تنظیم کلاک داخلی سیستم نوسان ساز RC با سرعت بالا.
اندازه گیری فرکانس داخلی نوسانگر RC برای هر مقدار trimming .
محاسبه خطای فرکانس برای هر مقدار trimming (بر اساس یک مرجع شناخته شده).
در نهایت، بیتهای trimming را با مقدار بهینه (مطابق با کمترین خطای فرکانس) تنظیم کنید.
فرکانس نوسانگر داخلی به طور مستقیم اندازهگیری نمیشود، اما از تعداد پالسهای کلاک شمارش شده با استفاده از یک تایمر در مقایسه با مقدار معمولی محاسبه میشود. برای انجام این کار، یک فرکانس مرجع بسیار دقیق مانند فرکانس LSE ارائه شده توسط کریستال خارجی 32.768 کیلوهرتز، باید در دسترس باشد.