سلام همگی : از جلسه قبلی اموزش فیدبکی دریافت نکردم اگه مشکلی داره اعلام کنید اصلاح کنم؛ جلسه رو با یه صلوات شروع میکنیم (اللهم صل علی محمد و ال محمد )؛ خب این جلسه قراره که یکم از اطلاعات جلسات قبلی استفاده کنیم و بریم سراغ کانفیگ کردن کلاک
آموزش stm32f103 جلسه ۳ کانفیگ کردن کلاک
ی مرور کنیم به جلسه قبلی، یادمونه که گفتیم قرار بر اینه از محیط گرفیکی کیوب ببینیم در عمل چیکار قراره بکنیم و ی سری توضیحات راجب کریستال دادیم حالا قراره این کریستال رو توی برنامه به کار ببریم چجوری؟ خیلی سادس فقط یک تابع براش تعریف کنیم.
خب برای اشنایی با توابه کانفیگ کلاک میریم سراغ هدر فایل 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 |
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); #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL) void RCC_PREDIV1Config(uint32_t RCC_PREDIV1_Source, uint32_t RCC_PREDIV1_Div); #endif #ifdef STM32F10X_CL void RCC_PREDIV2Config(uint32_t RCC_PREDIV2_Div); void RCC_PLL2Config(uint32_t RCC_PLL2Mul); void RCC_PLL2Cmd(FunctionalState NewState); void RCC_PLL3Config(uint32_t RCC_PLL3Mul); void RCC_PLL3Cmd(FunctionalState NewState); #endif /* STM32F10X_CL */ 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); #ifndef STM32F10X_CL void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource); #else void RCC_OTGFSCLKConfig(uint32_t RCC_OTGFSCLKSource); #endif /* STM32F10X_CL */ void RCC_ADCCLKConfig(uint32_t RCC_PCLK2); #ifdef STM32F10X_CL void RCC_I2S2CLKConfig(uint32_t RCC_I2S2CLKSource); void RCC_I2S3CLKConfig(uint32_t RCC_I2S3CLKSource); #endif /* STM32F10X_CL */ 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); #ifdef STM32F10X_CL void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); #endif /* STM32F10X_CL */ 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); |
کلی تابع هستش نیازی نیست بدونیم همشون چیکار میکنن ولی من اونایی که لازمه رو تعریف میکنم.
یادتونه دو نوع کلاک داشتیم داخلی بود و خارجی ؟
1 |
void RCC_HSEConfig(uint32_t RCC_HSE); |
این تابع میاد خارجی یا داخلی بودن کلاک رو مشخص میکنه ما برای کلاک خارجی اینجوری ستش میکنیم
1 |
RCC_HSEConfig(RCC_HSE_ON); |
برای وصل شدن کلاک یک تاخیر کوچولو لازم هست که برای اون هم یک تابع اماده داریم به این شکل
1 |
CC_WaitForHSEStartUp(); |
اگر این تابع خروجی SUCCESS بهمون برگردوند میتونیم برای ادامه کار بریم؛ پس مینویسیم :
1 2 3 |
if(HSEStartUpStatus == SUCCESS) { } |
حالا باید به میکرو کنترلر بگیم کریستال ورودی رو ضرب در چقد بکن برای کلا اصلی (اصطلاحا pll)، که برای اون هم تابع زیر رو داریم :
1 |
void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul); |
چون کریستال ورودی ۸ مگا هرتز دارم و میخوام ۷۲ مگا هرتز رو روی میکرو ست کنم پس داریم : ۷۲/۸=۹
یعنی ۸ مگا هرتزی که کریستال میسازه رو ۹ برابر کنیم به ۷۲ مگاهرتز دست پیدا میکنیم پس تابع pll رو اینجوری کانفیگ میکنیم :
1 |
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /// PLLCLK = 8MHz * 9 = 72 MHz |
و حالا باید خود pll رو فعال کنیم که برای اینکار این تابع رو داریم :
1 |
void RCC_PLLCmd(FunctionalState NewState); |
حالا باید این تابع اینجوری کانفیگ کنیم و بهش ورودی بدیم :
1 |
RCC_PLLCmd(ENABLE); // Enable PLL |
حالا باید منتظر بشیم تا pll فعال بشه برای این کار باید مقدار فلگ رو با این تابع بخونیم و منتظر بشیم تا set بشه؛ مقدار فلک با تابع زیر خونده میشه :
1 |
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG); |
خب برای منتظر بودن هم اینجوری عمل میکنیم :
1 |
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); /// Wait till PLL is ready |
حالا باید با تابع RCC_SYSCLKConfig سیستم کلاک سورس یا SYSCLKSource رو به خروجی کلاک PLL وصل کنیم؛ برای این کار هم از تابع زیر استفاده میکنیم :
1 |
void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource); |
حالا برای کانفیگ هم مقدار تابع رو اینجوری وارد میکنیم :
1 |
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK) |
حالا باید صبر کنیم تا این خط هم کارش تموم بشه و کلاک متصل بشه برای این کار هم اینجوری مینویسیم :
1 |
while(RCC_GetSYSCLKSource() != 0x08); /// Wait till PLL is used as system clock source |
به همین سادگی الان میکرو شروع به کار میکنه با تمام قدرتش ۷۲ مگاهرتز؛ حالا اینارو میکنیم توی یک تابع به اسم RCC_Configuration مینویسیم؛ که این تابه ورودی نداره و خروجی هم نداره پس اینجوری مینویسم :
1 |
void RCC_Configuration(void) |
حالا کانفیگ های بالا رو هم توی این تابع فراخوانی میکنیم تا تابع کامل بشه و کل خروجی تابع به این شکل میشه :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void RCC_Configuration(void){ ErrorStatus HSEStartUpStatus; RCC_DeInit(); /// RCC system reset(for debug purpose) RCC_HSEConfig(RCC_HSE_ON); /// Enable HSE HSEStartUpStatus = RCC_WaitForHSEStartUp(); /// Wait till HSE is ready if(HSEStartUpStatus == SUCCESS) { RCC_HCLKConfig(RCC_SYSCLK_Div1); /// HCLK = SYSCLK RCC_PCLK2Config(RCC_HCLK_Div1); /// PCLK2 = HCLK RCC_PCLK1Config(RCC_HCLK_Div2); /// PCLK1 = HCLK/2 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /// PLLCLK = 8MHz * 9 = 72 MHz RCC_PLLCmd(ENABLE); /* Enable PLL */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); /// Wait till PLL is ready RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /// Select PLL as system clock source while(RCC_GetSYSCLKSource() != 0x08); /// Wait till PLL is used as system clock source } } |
که رو به روی هر خط هم توضیحاتش کامنت شده، اینم بگم که اینا اصلا ترس نداره بعدا میفهمیم این قابلیت ها چقد کاربردی هستند…
حالا باید تابعی که نوشتیم رو توی تابع مین برنامه فراخوانی کنیم تا کلاک کانفیگ بشه؛ اینم کل توابع اصلی برناممون اینجوری میشه :
1 2 3 4 5 6 7 |
int main(void) { RCC_Configuration(); while(1) { } } |
و تمام دیگه میکرو رسما داره کار میکنه، به همین سادگی
فایل پروژه تا اینجا رو هم میتونید از زیر دانلود کنید :
توی جلسه آینده هم gpio ها رو پیکر بندی میکنیم و یک بلینکر رو میسازیم.
اگر اموزش مشکلی هم داره بهم بگید حتما درستش میکنم تا مفید تر واقع بشه کار .
ما هم توی دعاهاتون از یاد نبرید…
با ارزوی موفقیت برای تک تکتون
یا علی
Tiktoknitro.com is an advanced tiktok services marketplace for successfull and fast promotion. We offer to buy tiktok likes and buy tiktok followers of highest quality instant and secure. The mechanisms behind our work are unique and tailored to your goals.
مهمان
سلام و خسته نباشین بابت مطالب بسیار مفیدتون
خواستم بگم در این قسمت توضیحی در مورد
RCC_HCLKConfig(RCC_SYSCLK_Div1); /// HCLK = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); /// PCLK2 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2); /// PCLK1 = HCLK/2
ندادین که چی هستن و وظیفه اشون چیه:؟
مهمان
سلام
آقا یه چند تا سوال ابتدایی داشتم در حد مهد کودک: 1: تفاوت cmsis با std periph driver چیه؟ از این جهت میگم که هم میشه در کیل بر مبنای cmsis پروژه ایجاد کرد هم میشه از پوشه همراه این درایور یکی یکی فایل ها رو اد کرد. 2-: کلاک سیستم رو در خیلی از پروژه های اماده ندیدم تنظیم کنن فقط در تنظیمات کیل مقدار کریستال فقط نوشته شره و یک فایل system_stm32f4xx.c در پروژه ها موجود هست که تنظیمات کلاک ظاهرا داره اما نه در تابع main اینکلود شده و نه تابعی از اون فراخوانی. با اینکه برنامه ها درست کار می کنند چطور میشه بدن تنظیم کلاک؟3: توی کیل زمان ایجاد پروژه دو روش وجود داره یکی که حالت کلی انتخاب سری رو داره و بعد پنجره cmsis باز میشه و دومی خود میکرو رو انتخاب می کنیم. اولین حالت چه کاربردی داره؟
مهمان
با سلام و خسته نباشید من هر کاری میکنم نمیتونم MCO که به پین pa8 متصل است را راه اندازی کنم و کلاک ازش بگیرم اگه میشه راه نمایی کنید
مهمان
سلام خسته نباشید

ممنونم بابت آموزشاتون
یه سوال ما مگه توی کیوب از طریق محیط گرافیکی فرکانس 72 مگاهرتز رو(به طور مثال) نمیسازیم یعنی به واحد pll اومدیم ضریب 9 رو دادیم و با کریستال 8 مگ فرکانس 72مگاهرتز رو ساختیم. خب بعد از اینکه پروژه توسط کیوب اجرا شد مگه کانفینگ کلاک هم کدش توسط خود کیوب نوشته نمیشه؟ چه نیازیه ما دستی دوباره کد ها رو بنویسیم؟
یا منظورتون این بوده که اگه کانفینگش رو با کیوب انجام ندادیم میتونیم کدشو خودمون بنویسیم؟
مهمان
پاسخ این سوال
مهمان
یه سوال ما مگه توی کیوب از طریق محیط گرافیکی فرکانس 72 مگاهرتز رو(به طور مثال) نمیسازیم یعنی به واحد pll اومدیم ضریب 9 رو دادیم و با کریستال 8 مگ فرکانس 72مگاهرتز رو ساختیم. خب بعد از اینکه پروژه توسط کیوب اجرا شد مگه کانفینگ کلاک هم کدش توسط خود کیوب نوشته نمیشه؟ چه نیازیه ما دستی دوباره کد ها رو بنویسیم؟
یا منظورتون این بوده که اگه کانفینگش رو با کیوب انجام ندادیم میتونیم کدشو خودمون بنویسیم؟ smileno
مهمان
سلام خدمت استاد عزیز
میشه خروجی یه پایه ی stm32f103c8 با فرکانس 50mhz (ماکزیمم فرکانس ) high / low بشه ؟
چرا من نمیتونم ؟؟
مهمان
سلام خدا قوت
سوالی که دارم اینه که آیا برنامه بوت لودر در میکروهای STM32 در هنگام ساخت در میکرو قرار داده شده یا مثل میکروهای AVR باید خودمون ابتدائا پروگرام کنیم؟
با تشکر از مطالب خوبتون
مهمان
مهمان
خدا خیرت بده مهندس
مهمان
سلام خسته نباشید مطالبتون خیلی خوبه فقط اینکه اگه بشه مطالب هر جلسه pdf شه تا بتونیم راحت پرینت بگیریم خیلی ممنون میشیم
واینکه تاریخ انتشار جلسه بعد هم ذکر شه ممنون
نویسنده این مطلب
در اخرین جلسه فایل PDF موجود هست
مهمان
با سلام از این که زحمت می کشید و این آموزش ها رو قرار میدید بسیار تشکر می کنم و عجر شما با خداوند که توفیق روز افزون به شما و خانواده هاتون بده. راستش بعد از ۱۰ سال کار با سری های AVR امروز فکر کردم که باید اپدیت بشم و خلاصه این شد که اردوینو و ارم رو باهم شروع کردم. چقدر خوب بود که بردی تهیه می کردید و آموزش هاتونو بر میبنای اون برد قرار میدادید و البته سود مناسبی از فروش برد ها برای ادامه فعالیت سایت بدست میاومد. این آموزش برای تازه کارها یکم گنگ بود شاید بشه گاهی از جاها که نیاز به توضیح بیشتر داره شما فایل صوتی قرار بدید و هم در وقت خودتون و هم در وقت خواننده صرفه جویی کنید. در ضمن میتونید فایل شبیه سازی پروتوس رو هم قرار بدید تا نیاز نباشه هر شخصی که مثلا در فلان شهرستان هست و توان مالی خانواده اش نمی رسه برد های ارم رو تهیه کنه از این آموزش بی بهره بمونه(نمونه اش خود من ۱۰ سال پیش نمیتونستم کتاب AVR بخرم با بدبختی یادگرفتم)
نویسنده این مطلب
سلام مهندس وقت بخیر
موفق باشید ❤
من خودمم بچه شهرستان هستم و این سختی ها متاسفانه برای همه ما شهرستانی ها هستش ولیکن با یکم تلاش این مشکلات قابل رفع شدنه راجب اپدیت بگم شما اردونیو رو کنار بزارید خیلی موفق تر خواهید بود و اردونیو به درد پروژه های بزرگ تر و تجاری نمیخوره راجب مبحثی که بردی تهیه بشه و اموزش ها بر اساس اون باشه پیشنهاد خوبی بود با اقا مهدی راجب فروشگاه سایت صحبت میکنم اما اگه شما مشتاق هستید میتونم برای شما یک برد جدا مونتاژ کنم بفرستم ( بردی برای تست های خودم به صورت دم دستی طراحی کردم منتظر بازگشایی شرکت ها در بعد از تعطیلات عید نوروز هستم اگر دوست داشتید یک برد اضافه برای شما هم چاپ میکنم) راجب نظر خوب و سازندتون ازتون تشکر میکنم
مهمان
سلام .خسته نباشید.رزمنده.
هر وقت هر مشکلی برام پیش مییاد در مورد میکرو اولین سایتی که سر میزنم همین سایت هستش.
رزمنده به جهاد در راه علمت ادامه بده.
به امید روزی که کسایی مثل اقا مهدی بتونن میکرو رو بسازن .
دمت گرم خداییش خیلی خوبه کارت
مهمان
سلام
من چند وقته زیاد سرمیزنم به سایتت . راستش دارم هرچی سایت و مطلب در مورد ARM هستو زیرو ورو میکنم بلکه سر در بیارم چی به چیه . تا هفته پیش نمیدونستم HAL چیه CMSIS چیه خوردنیه یا پوشیدنی !! . به لطف سایت شما و دیگران الان کمی بهتر شدم . سایت شما خیلی ساده و خوب توضیح داده برای من تازه کار خیلی عالیه . دستتون درد نکنه .مشتاقیم ادامه بدی
(بفرما اینم فیدبک :)) نگی کسی حمایت نمیکنه دوست من )
نویسنده این مطلب
چششششششششششششم
مهمان
خداقوت پهلوان ۲۲بهمن هم تبریک میگم..
مهمان
سلام
داداش او خط 647 هست ملت رو گیج نکن
فدات
نویسنده این مطلب
بله وییرایش شد