آموزش STM32 رجیستری : پریفرال RCC و تنظیمات کلاک در STM32F1

  1. Home
  2. /
  3. آموزش STM32
  4. /
  5. آموزش STM32 : پریفرال RCC و تنظیمات کلاک

در این مقاله پریفرال RCC میکروکنترلر STM32F103C8 و رجیستر هاش رو بررسی میکنیم و اینکه برای تنظیم کلاک میکروکنترلر به 72MHz چه کدی باید بنویسیم و کدوم بیت ها رو در کدوم رجیستر پریفرال RCC باید تغییر بدیم.

مشاهده ویدئوی تنظیمات کلاک میکروکنترلر STM32F103C8 بصورت رجیستری در یوتیوب

کد تنظیم کلاک با CMSIS استاندارد برای STM32F103C8:

کد تنظیم کلاک با CMSIS با دسترسی به بیت فیلد برای STM32F103C8:

درخت کلاک در میکروکنترلر STM32F103C8

درخت کلاک نشون میده کلاک از چه منبعی تامین میشه ، چجوری تنظیم میشه و چه کلاکی به هر بخش میکروکنترلر میرسه. تصویر زیر از نرم افزار STM32CubeMX برداشته شده و شماره های قرمز رنگ هر کدوم تنظیمی هستند که در این نرم افزار اعمال میکنیم برای تنظیم کلاک. در تصویر زیر کلاک میکروکنترلر STM32F103C8 مقدارش 72MHz تنظیم شده.  

منابع کلاک کم سرعت در میکروکنترلر STM32F103C8

در میکروکنترلر STM32F103C8 دو منبع کلاک کم سرعت داریم که برای تایمر RTC و IWDG استفاده میشن.

الف) LSI – Low Speed Internal : کلاک کم سرعت داخلی با فرکانس 40KHz که منبع کلاک IWDG هست و میتونه به عنوال منبع کلاک RTC هم انتخاب بشه

ب) LSE – Low Speed External : کریستال کم سرعت خارجی که مقدارش فقط میتونه 32.768KHz باشه و میتونه به عنوال منبع کلاک RTC انتخاب بشه.

منابع کلاک کم سرعت در میکروکنترلر STM32F103C8

منابع کلاک سیستم در میکروکنترلر STM32F103C8

در میکروکنترلر STM32F103C8 دو منبع کلاک پر سرعت برای تامین کلاک سیستم داریم:

الف) HSI- High Speed Internal : کلاک خازن مقاومتی با فرکانس 8MHz که داخل خود میکروکنترلر STM32F103C8 هست. وقتی میکروکنترلر شروع به کار میکنه و قبل از اینکه HSE رو فعال کنیم کلاک HSI منبع کلاک میکروکنترلر هست و بعد از فعال سازی HSI ، اگر به هر دلیلی کریستال خارجی کار نکنه کلاک HSI منبع کلاک سیستم میشه.

ب) HSE – High Speed External : کلاک خارجی که از خارج میکروکنترلر با ماژول کلاک یا یک کریستال فراهم میکنیم و فرکانسش میتونه بین 4 تا 16MHz باشه. روی برد بلوپیل یک کریستال 8MHz قرار داره و برای تامین کلاک میکروکنترلر STM32F103C8 هم در این آموزش از همین کریستال استفاده کردم.

درخت کلاک در میکروکنترلر STM32F103C8

تنظیمات کلاک در میکروکنترلر STM32F103C8 با بررسی درخت کلاک

سه نوع ابزار برای تنظیم کلاک به فرکانس دلخواه در اختیار داریم:

  • پری اسکیلر : تقسیم فرکانس ( موارد 1 ، 2 ، 3 ، 4 ، 7 و 9 )
  • PLL : ضرب فرکانس ( مورد 6 )
  • مالتی پلکسر : انتخاب یک کلاک از بین چند کلاک ( 5 و 8 )

کنار هر کدوم از ابزار ها در درخت کلاک یک شماره نوشتم کد در ادامه توضیحات مربوط به ابزار اومده: 

1- پری اسکیلر APB1 : کلاک PCLK1 که کلاک پریفرال های روی باس APB1 هست ، با تقسیم HCLK به پری اسکیلر APB1 بدست میاد. با توجه به اینکه HCLK مقدارش 72MHz هست و ماکزیمم PCLK1 مقدارش 36MHz هست ، برای بدست آووردن ماکزیمم PCLK1 ، کلاک HCLK رو تقسیم بر 2 میکنیم. پری اسکیلر APB1 میتونه مقادیر 1 ، 2 ، 4 ، 8 یا 16 داشته باشه.

2- پری اسکیلر APB2 : کلاک PCLK2 که کلاک پریفرال های روی باس APB2 هست با تقسیم HCLK به پری اسکیلر APB2 بدست میاد. با توجه به اینکه HCLK مقدارش 72MHz هست و ماکزیمم PCLK2 هم مقدارش 72MHz هست ، برای بدست آووردن ماکزیمم PCLK2 کلاک HCLK رو تقسیم بر 1 میکنیم. پری اسکیلر APB2 میتونه مقادیر 1 ، 2 ، 4 ، 8 یا 16 داشته باشه. 

3- پری اسکیلر ADC : کلاک ADC با تقسیم کلاک PCLK2 به پری اسکیلر ADC بدست میاد. با توجه به اینکه حداکثر کلاک ADC مقدارش 14MHz هست و پری اسکیلر ADC میتونه مقادیر 2 ، 4 ، 6 یا 8 رو داشته باشه و PCLK2 هم مقدارش 72MHz هست ، مقدار پری اسکیلر ADC حداقل باید 6 باشه و کلاک ADC مقدارش  12MHz میشه.

4- پری اسکیلر AHB : کلاک HCLK با تقسیم SYSCLK به پری اسکیلر AHB بدست میاد. پری اسکیلر AHB مقدارش میتونه توان های دو از 1 تا 512 باشه. با توجه به اینکه SYSCLK مقدارش  72MHz هست و همین مقدار رو برای HCLK میخواییم ، مقدار پری اسکیلر AHB رو 1 میذاریم.

5- مالتی پلکسر کلاک سیستم : کلاک سیستم ( SYSCLK ) میتونه از سه جا تامین بشه ، HSE ، HSI یا PLL . در اینجا منبع کلاک سیستم رو PLL انتخاب کردیم.

6- PLL : ورودی PLL میتونه کلاک HSI یا HSE باشه و کار PLL اینه که کلاک ورودی رو در یک عدد (بین 2 تا 16) ضرب کنه تا کلاک خروجی PLL رو بسازه. با توجه به اینکه ورودی PLL کلاک HSE هست که مقدارش 8MHz هست و میخواهیم خروجی  PLL فرکانسش 72MHz باشه ، ضریب PLL عدد 9 انتخاب شده.

7- پری اسکیلر USB : میتونه مقادیر 1 و 1.5 داشته باشه. کلاک USB هم باید در بازه ی 47.88 تا 48.12MHz باشه. با توجه به اینکه کلاک USB با تقسیم خروجی  PLL به پری اسکیلر USB بدست میاد و فرکانس خروجی پری اسکیلر 72MHz هست ، باید مقدار 1.5 رو برای پری اسکیلر USB انتخاب کنیم تا کلاک USB مقدارش 48MHz بشه و در بازه ی قابل قبول باشه.

8- مالتی پلکسر ورودی PLL : ورودی PLL میتونه HSI تقسیم بر 2 یا HSE ( تقسیم شده بر پری اسکیلر HSE ) باشه. وظیفه ی مالتی پلکسر PLL همین انتخابه. در اینجا HSE رو انتخاب کردیم تا کلاک 8MHz کریستال خارجی ورودی PLL بشه.

9- پری اسکیلر HSE : با استفاده از پری اسکیلر  HSE میتونیم فرکانس کلاک HSE تقسیم بر 1 یا 2 کنیم. در اینجا تقسیم بر 1 کردیم چون فرکانسش 8MHz هست و همین فرکانس رو برای کلاک ورودی PLL میخواهیم.

وظایف و رجیسترهای پریفرال RCC در میکروکنترلر STM32F103C8

تصویر زیر نقشه ی رجیسترهای پریفرال RCC در میکروکنترلر STM32F103C8 هست که از صفحه ی 120 رفرنس منوال میکروکنترلر های STM32F103 تا STM32F105 برداشته شده. در ادامه قراره بصورت خلاصه هر رجیستر و وظایفش رو بررسی کنیم. شماره های قرمز مفهوم خاصی ندارند ، فقط برای این هستند که توضیحات این مقاله رو در تصویر پیدا کنید.

رجیسترهای پریفرال RCC در میکروکنترلر STM32F103C8

1- RCC_CR : فعال و غیر فعال کردن HSE ، HSI ، PLL و سیستم امنیت کلاک

2- RCC_CFGR : ابزار های تنظیمات کلاک ( پری اسکیلر ، PLL و مالتی پلکسر ها ) در این رجیستر تنظیم میشن

3- RCC_CIR : فلگ های اینتراپت ها ، بیت فعال و غیر فعال کردن اینتراپت ها و بیت های صفر کردن فلگ اینتراپت ها

4،5- RCC_APB1RSTR & RCC_APB2RSTR : در این دو رجیستر برای ریست کردن هر کدوم از پریفرال هایی که روی باس های APB1 و APB2 قرار دارند یک بیت وجود داره. با یک کردن بیت، پریفرال ریست میشه. ریست شدن پریفرال به این معنی هست که وظعیت رجیستر های اون پریفرال برمیگرده به لحظه ی بعد از ریست میکروکنترلر ، تنظیماتش برمیگرده به حالت اولیه.

6،7،8 – AHBENR & APB1ENR & APB2ENR : این سه رجیستر وظیفشون فعال و غیر فعال کردن کلاک بخش های مختلف میکروکنترلر هست ، برای هر بخش یک بیت وجود داره ، اگه یک بشه کلاک اون بخش فعال میشه ، اگه صفر بشه کلاک غیر فعال میشه.

9- RCC_BDCR : تنظیمات کلاک LSE – Low Speed External

10- RCC_CSR : فلگ های ریست و فعال کردن LSI – Low Speed Internal

تنظیم کلاک با تغییر رجیستر های پریفرال RCC در میکروکنترلر STM32F103C8

در تصویر زیر کد مورد نیاز برای تنظیم HCLK در مقدار 72MHz رو میبینید که با CMSIS نوشته شده، در ادامه خط به خط این کد و رجیسترهایی که تغییر دادیم رو بررسی میکنیم. در ابتدای مقاله لینک کد ها در github وجود داره.

کد تنظیم کلاک میکروکنترلر STM32F103C8 با CMSIS

بیت HSEBYP در رجیستر RCC_CR  میکروکنترلر STM32F103C8

برای ساخت کلاک با استفاده از کریستال به مدار زیر احتیاج داریم ، این مدار شامل دو خازن ، دو مقاومت و یک اینورتر هست . برای پیاده سازی این مدار دو راه داریم از اینورتری که داخل میکرو برای همین کار طراحی شده استفاده کنیم و در خارج میکروکنترلر فقط یک کریستال و دو خازن رو قرار بدیم و انتخاب دوم هم اینه که از ماژول های کلاک استفاده کنیم که تمام مدار لازم برای ساخت کلاک بعلاوه ی کریستال رو در خودشون دارند.

مدار کلاک خارجی در میکروکنترلر STM32F103C8

اگر از ماژول کلاک استفاده کنیم باید مدار داخلی میکروکنترلر bypass بشه ، یعنی ازش استفاده نشه ولی روی برد بلوپیل ماژول کلاک نداریم بلکه یک کریستال با دو مقاومت وجود داره پس نباید bypass انجام بدیم. برای انجام این تنظیم بیت HSEBYP در رجیستر CR پریفرال RCC باید صفر بشه.

بیت HSEBYP در رجیستر CR  در پریفرال RCC میکروکنترلر STM32F103C8

خط 20 : صفر کردن بیت HSEBYP

بیت HSEON در رجیستر RCC_CR میکروکنترلر STM32F103C8

برای فعال کردن HSE باید بیت HSEON در رجیستر RCC_CR رو یک کنیم.

بیت HSEON در رجیستر CR پریفرال RCC میکروکنترلر STM32F103C8

خط 22 : یک کردن بیت HSEON

بیت HSERDY در رجیستر RCC_CR میکروکنترلر STM32F103C8

بیت HSERDY توسط سخت افزار تغییر میکنه و اگر یک بشه به این معنی هست که کلاک HSE آماده استفاده هست. بعد از فعال کردن HSE باید بیت HSERDY رو چک کنیم و صبر کنیم تا سخت افزار این بیت رو یک کنه. اگر این بیت یک نشه به این معنی هست که کریستال خارجی مشکلی داره و کار نمیکنه.

بیت HSERDY در رجیستر CR پریفرال RCC میکروکنترلر STM32F103C8

خط 24 تا 26 : تا وقتی بیت HSERDY یک نشده while اجرا میشه ، چون ممکنه کریستال خارجی خراب باشه یک کانتر هم میذاریم

خط 28 : بقیه کد در صورتی باید اجرا بشه که کریستال خارجی آماده باشه یعنی بیت HSERDY یک باشه

بیتهای PRFTBE و LATENCY در رجیستر FLASH_ACR میکروکنترلر STM32F103C8

قبل از اینکه ادامه ی نتظیمات کلاک رو در پریفرال RCC انجام بدیم ، باید چند بیت در پریفرال FLASH رو تنظیم کنیم. بیت PRFTBE رو باید 1 کنیم تا پریفچ رو برای انیستراکشن ها فعال کنیم. با توجه به اینکه کلاک رو هم 72MHz قراره تنظیم کنیم ، باید مقدار 0b010 رو در بیت های LATENCY ثبت کنیم تا تنظیم two wait state اعمال بشه.

رجیستر ACR از پریفرال FLASH میکروکنترلر STM32F103C8

خط 30 : یک کردن بیت PRFTBE

خط 32 : صفر کردن تمام بیت های LATENCY

بیتهای HPRE در رجیستر RCC_CFGR در میکروکنترلر STM32F103C8

کلاک HCLK با تقسیم SYSCLK بر پری اسکیلر AHB بدست میاد. چهار بیت HPRE برای تنظیم مقدار پری اسکیلر AHB هستند. مقدار پری اسکیلر AHB میتونه توان های دو از 1 تا 512 باشه. با توجه به اینکه SYSCLK مقدارش 72MHz هست و همین مقدار برای HCLK هم میخواهیم مقدار پری اسکیلر AHB رو 1 تنظیم میکنیم. برای این هدف کافیه فقط پرارزش ترین بیت HPRE رو 0 کنیم. البته ما تمام بیت های HPRE رو صفر میکنیم.  

بیت های HPRE برای تنظیم پری اسکیلر AHB در رجیستر CFGR پریفرال RCC در میکروکنترلر STM32F103C8

خط 35 : صفر کردن تمام بیت های HPRE

بیتهای PPRE1 در رجیستر RCC_CFGR در میکروکنترلر STM32F103C8

کلاک PCLK1 که کلاک پریفرال های روی باس APB1 هست ، با تقسیم HCLK به پری اسکیلر APB1 بدست میاد که میتونه مقادیر 1 ، 2 ، 4 ، 8 یا 16 رو داشته باشه. تنظیم مقدار پری اسکیلر APB1 در بیت های PPRE1 هست. چون میخواهیم PCLK1 بر 2 تقسیم بشه باید مقدار 0b100 رو در بیت های PPRE1 ثبت کنیم.  

تنظیم پری اسکیلر APB1 در بیت های PPRE1 در رجیستر CFGR پریفرال RCC در میکروکنترلر STM32F103C8

خط 37 : صفر کردن سه بیت PPRE1

خط 38 : یک کردن بیت دو از بیت های PPRE1

بیتهای PPRE2 در رجیستر RCC_CFGR در میکروکنترلر STM32F103C8

کلاک PCLK2 که کلاک پریفرال های روی باس APB2 هست ، با تقسیم HCLK به پری اسکیلر APB2 بدست میاد که میتونه مقادیر 1 ، 2 ، 4 ، 8 یا 16 رو داشته باشه. تنظیم مقدار پری اسکیلر APB2 در بیت های PPRE2 هست. چون میخواهیم PCLK2 بر 1 تقسیم بشه کافیه پرارزش ترین بیت از بیت های PPRE2 رو 0 کنیم، البته ما تمام بیت هاش رو صفر میکنیم.

پری اسکیلر APB2 در بیت های PPRE2 در رجیستر CFGR پریفرال RCC در میکروکنترلر STM32F103C8

خط 40 : صفر کردن سه بیت PPRE2

بیتهای ADCPRE در رجیستر RCC_CFGR در میکروکنترلر STM32F103C8

کلاک ADC با حداکثر مقدار 14MHz از تقسیم PCLK2 بر پری اسکیلر ADC بدست میاد که میتونه مقادیر 1 ، 2 ، 4 ، 6 یا 8 رو داشته باشه . بیت های ADCPRE برای تنظیم مقدار پری اسکیلر ADC هستند. برای اینکه کلاک ADC در بازه تعیین شده باشه مقدار پری اسکیلر ADC رو 6 تنظیم میکنیم یعنی مقدار 0b10 باید در بیت های ADCPRE نوشته بشه.

تنظیم پری اسکیلر ADC در بیت های ADCPRE در رجیستر CFGR پریفرال RCC در میکروکنترلر STM32F103C8

خط 42 : صفر کردن دو بیت ADCPRE

خط 43 : یک کردن بیت یک در بیت های ADCPRE

بیت USBPRE در رجیستر RCC_CFGR در میکروکنترلر STM32F103C8

کلاک USB با تقسیم کلاک خروجی PLL بر پری اسکیلر USB بدست میاد که این پری اسکیلر میتونه مقادیر 1 یا 1.5 داشته باشه ، تنظیم این مقدار در بیت USBPRE هست . برای اینکه کلاک USB در بازه ی مشخص باشه باید مقدار پری اسکیلر USB 1.5 باشه.پس بیت USBPRE رو باید 0 کنیم.

تنظیم پری اسکیلر USB در بیت های USBPRE در رجیستر CFGR پریفرال RCC در میکروکنترلر STM32F103C8

خط 45 : صفر کردن بیت USBPRE

بیت PLLXTPRE در رجیستر RCC_CFGR در میکروکنترلر STM32F103C8

قبل از ورود HSE به PLL میتونیم این کلاک رو بر دو تقسیم کنیم. اگر بیت PLLXTPRE یک باشه کلاک HSE بر 2 تقسیم میشه. چون نمیخواهیم تقسیم بر 2 رو انجام بدیم این بیت رو صفر میکنیم.

تنظیم پری اسکیلر HSE در بیت PLLXTPRE در رجیستر CFGR پریفرال  RCC در میکروکنترلر STM32F103C8

خط 47 : صفر کردن بیت PLLXTPRE

بیت PLLSRC در رجیستر RCC_CFGR در میکروکنترلر STM32F103C8

بیت PLLSRC مشخص میکنه منبع PLL چی باشه ، با توجه به اینکه میخواهیم HSE منبع PLL باشه مقدار این بیت رو 1 میکنیم.

تنظیم منبع PLL با بیت PLLSRC در رجیستر CFGR پریفرال RCC در میکروکنترلر STM32F103C8

خط 49 : یک کردن بیت PLLSRC

بیتهای PLLMUL در رجیستر RCC_CFGR در میکروکنترلر STM32F103C8

کاربرد PLL این هست که میتونیم فرکانس کلاک ورودیش رو در یک عدد ضرب کنیم تا کلاک با فرکانس بالاتر در خروجی PLL داشته باشیم. بیت های PLLMUL برای تنظیم همین ضریب هستند . با توجه به اینکه در خروجی PLL فرکانس 72MHz میخواهیم و فرکانس ورودی PLL هم 8MHz هست ، این ضریب رو 9 انتخاب میکنیم. پس باید عدد 0b0111 در بیت های PLLMUL ثبت بشه.

تنظیم PLL با بیت های PLLMUL در رجیستر CFGR پریفرال RCC در میکروکنترلر STM32F103C8

خط 51 : صفر کردن بیت های PLLMUL

خط 52 : یک کردن سه بیت کم ارزش PLLMUL

بیتهای PLLON و PLLRDY در رجیستر RCC_CR در میکروکنترلر STM32F103C8

جهت فعال کردن PLL باید بیت PLLON رو یک کنیم سپس باید صبر کنیم تا سخت افزار بهمون بگه PLL آماده استفاده هست. برای اینکه بفهمیم PLL آماده شده باید چک کنیم ببینیم بیت PLLRDY یک شده یا نه. اگر یک شده باشه یعنی PLL آماده هست. 

فعال سازی PLL با بیت های PLLON و PLLRDY در رجیستر CR پریفرال RCC در میکروکنترلر STM32F103C8

خط 54 : یک کردن بیت PLLON

خط 56 : صبر کردن در while تا وقتی بیت PLLRDY یک بشود

بیتهای SW در رجیستر RCC_CFGR در میکروکنترلر STM32F103C8

بیت های SW برای انتخاب منبع SYSCLK هستند ، SYSCLK میتونه از HSI یا HSE یا  PLLCLK تامین بشه. با توجه به اینکه ما میخواهیم PLLCLK منبع SYSCLK باشه باید مقدار 0b10 در بیت های SW ثبت بشه.

بیت های SW برای انتخاب منبع SYSCLK در رجیستر CFGR پریفرال RCC در میکروکنترلر STM32F103C8

خط 58 : صفر کردن بیت های SW

خط 59 : یک کردن بیت یک در بیت های SW

بیتهای SWS در رجیستر RCC_CFGR در میکروکنترلر STM32F103C8

بیت های SWS توسط سخت افزار تغییر میکنند و ما فقط میتونیم بخونیمشون . بعد از تنظیم بیت های SW باید بیت های SWS رو چک کنیم تا ببینیم اون کلاکی که میخواستیم به عنوان منبع SYSCLK انتخاب شده یا نه. چون PLL رو به عنوان منبع SYSCLK میخواهیم پس در یک while صبر میکنیم تا مقدار بیتهای SWS بشه 0b10 .

بیت های SWS برای چک کردن منبع SYSCLK در رجیستر CFGR پریفرال RCC در میکروکنترلر STM32F103C8

خط 61 : صبر کردن در while تا مقدار 0b10 در بیت های SWS ثبت بشه

تموم شد. با رجیستر ها کلاک HCLK در میکروکنترلر STM32F103C8 رو 72MHz تنظیم کردیم . 

0 Comments

Submit a Comment

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *