با سلام این قسمت از آموزش CH، قسمت بسیار ساده و کوتاهی هست و یه جورایی آشنایی با واحد تأمین کلاک میکرو هست یجورایی میشه بهش گفت آرامش قبل طوفان، چون قسمت بعدی آموزش ما بخش تایمرها هست و مد کاری آنها.
اگر با کلاک و منابع آن آشنایی قبلی ندارید پیشنهاد میکنم در این آموزش کمی با آنها آشنا شوید.
این نمای کلی دیاگرام داخلی بخش کلاک میکرو هست:
همانطور که میبینید کلی کانفیگ مختلف میشه برای کلاک تنظیم کرد، حالا سؤالی که پیش میاد در این همه آموزش قبلی کلاک میکرو چقدر بود؟ کی تنظیمش کرده بود؟ ما که جایی در مورد کلاک خود میکرو تنظیمات خاصی انجام ندادیم؟؟؟؟
خب اگه درست یادتون باشه زمانی که شما با استفاده از MRS یک پروژه MRS میسازید یک سری توابع آماده برای ما درست میکرد که رابط سریال رو بهصورت پیشفرض برای Debug فعال میکرد.
اگه کمی با دقت به کدهایی که برای ما درست کرده نگاه کنید با این تابع روبهرو میشید.
1 | SystemCoreClockUpdate(); |
اگه این تابع رو باز کنیم متوجه میشیم که یک سری توابع از قبل ساختهشدن که اگر کریستال میکروی ما 8 مگاهرتز باشه با یک سری از دیفاین ها میشه از کریستال خارجی برای فرکانسهایی که باز هم خودش تعیین کرده استفاده کرد.
خب پس اگر کریستال خارجی ما هشت مگ هرتز بود نیازی به فعالکردن خط SYSCLK_FREQ_HSE و تنظیمکردن مقدار HSE_VALUE نیست، ولی اگر کریستال لحیم شده روی برد شما 8 مگ نبود این خط رو انکامنت کنید و مقدار فرکانس کریستال خودتون رو به هرتز بنویسید.برای تعیین کردن کلاک کاری هم فقط یکی از دیفاین هارو بسته به نیازتون انکامنت کنید و بقیه باید کامنت بمونن.
خب اینا که شد توابع از پیش تعیین شده ولی اگر برای واحد خاصی کلاک خاصی مد نظرتون بود، تابع RCC اینجا هم مارو ناامید نکردهاند. یک سری توابع مانند توابع زیر برای تنظیمکردن هر یک از بخشهای واحد PLL هست و همچنین امکان دسترسی بهتمامی مالتی پلکسها و یا واحدهای ضرب یا تقسیم کلاک نیز وجود دارد.
اگر در کتابخانه RCC بگردید این توابع رو پیدا میکنید که اگر در آینده برای آموزشی نیازمون شد یک سر بهشون میزنیم؛ ولی فعلاً در حد آشنایی ببینیدشون، تقریباً از اسم توابع کار کرد آنها نیز پیداست.
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 65 66 67 | void RCC_DeInit(void); void RCC_HSEConfig(uint32_t RCC_HSE); ErrorStatus RCC_WaitForHSEStartUp(void); void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue); void RCC_HSICmd(FunctionalState NewState); void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul); void RCC_PLLCmd(FunctionalState NewState); void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource); uint8_t RCC_GetSYSCLKSource(void); void RCC_HCLKConfig(uint32_t RCC_SYSCLK); void RCC_PCLK1Config(uint32_t RCC_HCLK); void RCC_PCLK2Config(uint32_t RCC_HCLK); void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState); void RCC_ADCCLKConfig(uint32_t RCC_PCLK2); void RCC_LSEConfig(uint8_t RCC_LSE); void RCC_LSICmd(FunctionalState NewState); void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource); void RCC_RTCCLKCmd(FunctionalState NewState); void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks); void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); void RCC_BackupResetCmd(FunctionalState NewState); void RCC_ClockSecuritySystemCmd(FunctionalState NewState); void RCC_MCOConfig(uint8_t RCC_MCO); FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG); void RCC_ClearFlag(void); ITStatus RCC_GetITStatus(uint8_t RCC_IT); void RCC_ClearITPendingBit(uint8_t RCC_IT); void RCC_ADCCLKADJcmd(FunctionalState NewState); void RCC_OTGFSCLKConfig(uint32_t RCC_OTGFSCLKSource); void RCC_USBCLK48MConfig(uint32_t RCC_USBCLK48MSource); |
در یک استراکت هم میتوان مقادیر زیر را به هرتز خواند که به شکل زیر میتوان از آنها استفاده کرد:
حالا شاید از خودتون بپرسید اصلاً چرا من لازم دارم کلاک برخی از واحدها یا PLL هارو دستی کم یا زیاد کنم؟!
علت اینکه این مبحث قبل از تایمرها مطرح شد همین بود که اگر در تایمر ما به یک فرکانس خاص برای ورودی پریفرال تایمرمون نیاز داشتیم چیکار بکنیم؟ در واقع چنین اتفاقی بسیار نادره که لازم بشه فرکانس ورودی تایمرمون را تغییر بدیم، چون با همون مقادیر ARR و PSC که در جلسه بعد با آنها آشنا شویم خیلی از فرکانسها و کارها رو میشه انجام داد.
همینطور با تغییر کلاک میکرو در زمانهایی خاص میتوان باعث کاهش توان مصرفی میکرو شد، مخصوصاً اگر دستگاه ما با باتری کار میکند.
حالا که بحثمون رسید به پاور بزارید یک اشاره ریز هم به بخش توابع پاور داشته باشیم، برخی توابع از پیش تعیین شده برای بخش PWR وجود دارد که برای به SLEEP بردن یا درآوردن میکرو از مد SLEEP به ما کمک میکند.
این بخش همچنین یک ساختار از پیش تعریف شده دارد که فقط دو رجیستر بخش PWR رو در اختیار شما میگذارد به باید بهصورت بیتی با آن کار کنید یا از مقدارهای از پیش تعیین شده استفاده کنید برای مثال به شکل زیر:
ولی استفاده از توابع از پیش تعریف شده رو بهتون پیشنهاد میکنم، مگر اینکه واقعاً میدونید چیکار دارید میکنید با رجیسترها.
برای به دیدن اینکه هر بیت رجیستر چکاری انجام میده میتونید از رفرنس منوال میکرو بخش PWR کمک بگیرید.
برخی توابع از پیش تعریف شده بخش پاور نیز بهصورت زیر است.
این مبحث رو همانطور که در اول هم گفته شد زیاد طولانیش نمیکنیم. درصورتیکه بسیار مهم و کلیدی هست، این مبحث به علت اینکه در طول مسیر آموزش بقیه پریفرال ها با آن کار میکنیم، در طول آموزش بهصورت کلی با این بخش آشنا میشید، رسالت این قسمت از آموزش آشنایی با درخت تقسیم کلاک میکرو و نحوه تغییر کلاک میکرو و مدیریت توان مصرفی در میکرو بود.
در قسمت بعد با آموزش تایمر با ما همراه باشید.
نویسنده شو !
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.