آموزش STM32 رجیستری : پریفرال RCC و تنظیمات کلاک در STM32F1
در این مقاله پریفرال 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 دو منبع کلاک پر سرعت برای تامین کلاک سیستم داریم:
الف) HSI- High Speed Internal : کلاک خازن مقاومتی با فرکانس 8MHz که داخل خود میکروکنترلر STM32F103C8 هست. وقتی میکروکنترلر شروع به کار میکنه و قبل از اینکه HSE رو فعال کنیم کلاک HSI منبع کلاک میکروکنترلر هست و بعد از فعال سازی HSI ، اگر به هر دلیلی کریستال خارجی کار نکنه کلاک HSI منبع کلاک سیستم میشه.
ب) HSE – High Speed External : کلاک خارجی که از خارج میکروکنترلر با ماژول کلاک یا یک کریستال فراهم میکنیم و فرکانسش میتونه بین 4 تا 16MHz باشه. روی برد بلوپیل یک کریستال 8MHz قرار داره و برای تامین کلاک میکروکنترلر 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 برداشته شده. در ادامه قراره بصورت خلاصه هر رجیستر و وظایفش رو بررسی کنیم. شماره های قرمز مفهوم خاصی ندارند ، فقط برای این هستند که توضیحات این مقاله رو در تصویر پیدا کنید.

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 وجود داره.

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

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

خط 20 : صفر کردن بیت HSEBYP
بیت HSEON در رجیستر RCC_CR میکروکنترلر STM32F103C8
برای فعال کردن HSE باید بیت HSEON در رجیستر RCC_CR رو یک کنیم.

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

خط 24 تا 26 : تا وقتی بیت HSERDY یک نشده while اجرا میشه ، چون ممکنه کریستال خارجی خراب باشه یک کانتر هم میذاریم
خط 28 : بقیه کد در صورتی باید اجرا بشه که کریستال خارجی آماده باشه یعنی بیت HSERDY یک باشه
بیتهای PRFTBE و LATENCY در رجیستر FLASH_ACR میکروکنترلر STM32F103C8
قبل از اینکه ادامه ی نتظیمات کلاک رو در پریفرال RCC انجام بدیم ، باید چند بیت در پریفرال FLASH رو تنظیم کنیم. بیت PRFTBE رو باید 1 کنیم تا پریفچ رو برای انیستراکشن ها فعال کنیم. با توجه به اینکه کلاک رو هم 72MHz قراره تنظیم کنیم ، باید مقدار 0b010 رو در بیت های LATENCY ثبت کنیم تا تنظیم two wait state اعمال بشه.

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

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

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

خط 40 : صفر کردن سه بیت PPRE2
بیتهای ADCPRE در رجیستر RCC_CFGR در میکروکنترلر STM32F103C8
کلاک ADC با حداکثر مقدار 14MHz از تقسیم PCLK2 بر پری اسکیلر ADC بدست میاد که میتونه مقادیر 1 ، 2 ، 4 ، 6 یا 8 رو داشته باشه . بیت های ADCPRE برای تنظیم مقدار پری اسکیلر ADC هستند. برای اینکه کلاک ADC در بازه تعیین شده باشه مقدار پری اسکیلر ADC رو 6 تنظیم میکنیم یعنی مقدار 0b10 باید در بیت های ADCPRE نوشته بشه.

خط 42 : صفر کردن دو بیت ADCPRE
خط 43 : یک کردن بیت یک در بیت های ADCPRE
بیت USBPRE در رجیستر RCC_CFGR در میکروکنترلر STM32F103C8
کلاک USB با تقسیم کلاک خروجی PLL بر پری اسکیلر USB بدست میاد که این پری اسکیلر میتونه مقادیر 1 یا 1.5 داشته باشه ، تنظیم این مقدار در بیت USBPRE هست . برای اینکه کلاک USB در بازه ی مشخص باشه باید مقدار پری اسکیلر USB 1.5 باشه.پس بیت USBPRE رو باید 0 کنیم.

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

خط 47 : صفر کردن بیت PLLXTPRE
بیت PLLSRC در رجیستر RCC_CFGR در میکروکنترلر STM32F103C8
بیت PLLSRC مشخص میکنه منبع PLL چی باشه ، با توجه به اینکه میخواهیم HSE منبع PLL باشه مقدار این بیت رو 1 میکنیم.

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

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

خط 54 : یک کردن بیت PLLON
خط 56 : صبر کردن در while تا وقتی بیت PLLRDY یک بشود
بیتهای SW در رجیستر RCC_CFGR در میکروکنترلر STM32F103C8
بیت های SW برای انتخاب منبع SYSCLK هستند ، SYSCLK میتونه از HSI یا HSE یا PLLCLK تامین بشه. با توجه به اینکه ما میخواهیم PLLCLK منبع SYSCLK باشه باید مقدار 0b10 در بیت های SW ثبت بشه.

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

خط 61 : صبر کردن در while تا مقدار 0b10 در بیت های SWS ثبت بشه
تموم شد. با رجیستر ها کلاک HCLK در میکروکنترلر STM32F103C8 رو 72MHz تنظیم کردیم .
0 Comments