در قسمت سوم از آموزش STM32 با توابع LL، یاد گرفتیم که در نرمافزار STM32CubeMX چگونه میتوان یک پروژه ایجاد کرد. همینطور در همان قسمت تنظیماتی که برای یک پروژه ساده نیاز بود را شرح دادیم و آن را پیکرهبندی کردیم و درنهایت از پیکرهبندی انجامشده برای نرمافزار Keil خروجی گرفتیم و در محیط Keil یک کد ساده را نوشته، کامپایل و بر روی برد پروگرام کردیم. اگر به خاطر داشته باشید در قسمت سوم وقتی به RCC (کنترل ریست و کلاک) و یک سری تنظیمات مربوط به کلاک رسیده بودیم، گفتیم که طبق مقاله، بدون اینکه دلیلش را بدانید تنظیمات را انجام بدهید تا در قسمتهای آتی که این قسمت باشد، همهچیز مفصلاً شرح داده شود.
در این مقاله قصد داریم در رابطه با کلاک و ریست (Reset) که در بخش کنترل ریست و کلاک (RCC) قرار دارند بهصورت کامل صحبت بکنیم. در همین حین با مفاهیمی دیگر مانند PLL، اسیلاتور، کریستال و یک سری مدارات آشنا میشویم و درنهایت نیز یک برد آموزشی برای پیشبرد آموزشها معرفی خواهیم کرد.
اجازه بدهید بااینکه کلاک چیست و چرا باید وجود داشته باشد بحث این مقاله را شروع بکنیم.
کلاک (Clock)
اگر ساختار و عملکرد یک کامپیوتر یا یک میکروکنترلر را شبیه ساختار و عملکرد بدن انسان در نظر بگیریم، CPU میشود همان مغز انسان، منبع کلاک میشود قلب انسان و خود سیگنال کلاک میشود خونی که توسط قلب یا همان منبع کلاک در رگها جاری میگردد تا مغز بتواند فرمانش را به سایر اعضای بدن ارسال بکند.
درواقع مغز با استفاده از رگها و خونی که در این رگها جاری است میتواند به اعضای بدن فرمان صادر بکند و آنها را تحت کنترل خود بگیرد و اگر برای لحظهای خون به مغز نرسد کل سیستم بدن انسان با اختلال مواجه میشود.
در میکروکنترلر هم کلاک دقیقاً همین نقش حیاتی را دارد و اگر برای لحظهای کلاک قطع بشود یا با مشکل مواجه بشود، کل میکروکنترلر با اختلال مواجه خواهد شد.
در الکترونیک دیجیتال مداراتی به اسم مدارات ترتیبی سنکرون وجود دارند که این مدارات برای هماهنگ شدن نیاز به عامل کلاک دارند. و بدون کلاک عملاً هیچ کاری صورت نمیپذیرد.
پس تا اینجا وظیفهی کلاک و اینکه چرا باید وجود داشته باشد را متوجه شدیم. اکنون باید با ذات کلاک و اینکه چگونه ایجاد میشود آشنا بشویم.
سیگنال کلاک در حالت ایده آل شبیه شکل زیر است:
برای ایجاد سیگنالی شبیه به شکل بالا، نیاز به مداری جداگانه است که همان منبع کلاک نامیده میشود.
نکتهای که باید به آن توجه کرد تفاوت ماهیت، ذات و چرایی وجود داشتن منبع کلاک و منبع تغذیه است، تفاوت منبع کلاک و منبع تغذیه را در ادامه بهصورت اساسی شرح خواهیم داد.
برای اینکه مفاهیم سریعتر و بهتر منتقل شوند رابطهی بین قلب و منبع کلاک بهصورت کلی بیان شد و این دو را معادل هم دانستیم که این رابطه دقیق و صحیح نیست، برای رابطهی دقیقتر بین این دو، به توضیحاتی که در ادامه ذکر میشود دقت کنید.
آنجایی که گفتیم قلب منبع کلاک سیستم است را باید اصلاح کنیم. قلب را بهصورت دقیقتر باید به منبع تغذیه سیستم تشبیه کرد نه منبع کلاک. درواقع منبع کلاک توان خود را از منبع تغذیه یا همان قلب دریافت میکند و بهعنوان خروجی سیگنال کلاک را تولید میکند.
پس از اصلاحات بالا باید بگوییم که قلب، همان منبع تغذیه است و اینکه چه زمانی و به چه نحوی؛ قلب خون را به مغز و سایر اعضای بدن برساند، را میتوان به منبع کلاک و خود کلاک تشبیه کرد.
همانطور که سیستم بدن ما میتواند زنده بماند اما عملکرد صحیحی نداشته باشد، در میکروکنترلر هم اگر تغذیه وجود داشته باشد اما کلاکی نباشد، میکروکنترلر روشن است ولی عملکرد صحیحی ندارد.
سعی شد با تشبیه میکروکنترلر به سیستم بدن انسان، مفاهیم بهصورت بنیادی و ساده بیان گردند. تا اینجای مقاله باید به خوبی وجود کلاک و تفاوتش با تغذیه و همچنین عملکرد آن را درک کرده باشید، اما اگر هنوز کمی این مفاهیم برایتان گنگ است بهتر است که برگردید بهعقب و یک بار دیگر این مطالب را مطالعه بفرمائید.
مدار منبع کلاک
اکنون وقت آن است که مدار منبع کلاک را تشریح کنیم، مدار زیر یکی از سادهترین مدارهایی است که برای تولید کلاک میکروکنترلر استفاده میشود.
در میکروکنترلرها معمولاً به دو روش با استفاده از مدار بالا، کلاک را تأمین میکنند. یک روش این است که کل مدار بالا بهصورت خارجی کنار میکروکنترلر قرار داده میشود و روش دیگر اینکه فقط بخشی از این مدار، کنار میکروکنترلر قرار میگیرد، چون بخش دیگر این مدار بهصورت داخلی درون خود میکروکنترلر وجود دارد.
درروش دوم فقط کریستال و دو خازن بهصورت خارجی کنار میکروکنترلر قرار میگیرند و بقیه مدار درون میکروکنترلر قرار دارد. بخشی که در خارج مدار قرار میگیرد، فیدبک مدار نامیده میشود.
وقتی کل مدار بهصورت یک ماژول کنار میکروکنترلر قرار داده میشود اصطلاحاً میگویند از اسیلاتور استفاده کردیم و وقتی بخشی از مدار کنار میکروکنترلر قرارداده میشود اصطلاحاً میگویند از کریستال استفاده کردیم.
اما این نوع اسمگذاری بهصورت اشتباه رایج شده است. چونکه اسیلاتور به معنای نوسانگر، از کلمهی Oscillate به معنای نوسان گرفتهشده است و میتواند هم درروش اول و هم درروش دوم بهکار برود. از سمتی دیگر کریستال هم که یک ماده فیزیکی است، عامل به وجودآورندهی نوسان در هر دو روش است و بهصورت فیزیکی در هر دو روش قرار دادهشده است. پس با توجه به این توضیحات این نوع نامگذاری اشتباه است.
مسلماً میتوان عبارات بهتری برای توصیف این دو پیدا کرد اما من قصد دارم همین اشتباه رایج را ادامه بدهم و به روش اول اسیلاتور و به روش دوم کریستال بگویم.
علاوه برمدار بالا، که در دو روش ذکرشده برای تأمین کلاک از آن استفاده میشود، یک مدار RC دیگر نیز بهصورت داخلی در میکروکنترلر وجود دارد که میتوانیم از این مدار برای تأمین کلاک استفاده کنیم و هیچ اسیلاتور یا کریستالی کنار میکروکنترلر قرار نگیرد، اما معمولاً به دلیل عدم دقت و وابستگی دمایی از RC داخلی میکروکنترلر استفاده نمیشود.
ریست (Reset)
واژهی ریست برای همهی ما آشناست و بارها این کلمه را در زندگی برای کارهای مختلف بهکاربردهایم، مثلاً در برخورد با دستگاههای مختلف گفتهایم که دستگاه ریست شده است یا به شوخی به دوستمان گفتهایم که ذهنت ریست شده است و …
اما این تعریف، یک تعریف کلی و انتزاعی در سطح بالا است که همهی افراد، حتی غیر الکترونیکیها نیز با آن آشنا هستند. اکنون ما میخواهیم بهعنوان یک مهندس الکترونیک کمی با جزئیات این مفهوم کلی و انتزاعی آشنا بشویم.
آیا تا به حال فکر کردهاید که وقتی میگوییم میکروکنترلر ریست شده است دقیقا چه اتفاقی میافتد؟
مفهوم کلی ریست همان چیزی است که تاکنون میدانستیم، یعنی یک بازگردانی یا برگشت به یک حالت اولیه. حال اگر بخواهیم دقیقتر و بهعنوان یک مهندس الکترونیک به مساله پاسخ بدهیم باید بگوییم که وقتی عمل ریست اتفاق میافتد رجیستر PC به خط اول برنامه برمیگردد.
در میکروکنترلرها یک رجیستر به اسم PC یا همان Program Counter به معنای شمارنده برنامه وجود دارد که مقدار ذخیرهشده در این رجیستر مشخص میکند که اکنون باید کدام خط از برنامه اجرا شود. و وقتیکه میکروکنترلر ریست شود مقدار رجیستر PC عوض میشود و خط اول برنامه به حالت اجرا میرود.
میکروکنترلر از طرق مختلفی ازجمله راههای سختافزاری و نرمافزاری میتواند ریست شود، در حال حاضر قصد نداریم به راههای نرمافزاری بپردازیم اما راههای سختافزاری شامل زمان روشن شدن، زمان خاموش شدن و زمانی که پایه ریست میکروکنترلر به سطح ولتاژی که برای ریست آن در نظر گرفتهشده است، متصل شود، میشود.
لازم است که پایه Reset میکروکنترلر برای ایمنی بیشتر، به مدار زیر متصل شود:
همانطور که میدانید هدف این مجموعه آموزشی، آموزش طراحی سختافزار برای میکروکنترلر نیست و فقط در موارد مهم، مانند همین مدار کلاک و ریست، به یک سری توضیحات کلی در مورد مدارات اکتفا میکنیم.
حال قصد داریم همهی مواردی که در رابطه با کلاک و ریست گفتیم را در نرمافزار مرور کنیم.
کنترل ریست و کلاک (RCC)
ابتدا به تصویر زیر دقت کنید:
همانطور که در تصویر بالا مشاهده میکنید، از بخش System Core، واحد RCC را انتخاب میکنیم، در این واحد ما قادر خواهیم بود انتخاب کنیم که کلاک میکروکنترلر از چه طریقی تامین بشود.
همچنین در واحد RCC دو بخش HSE و LSE وجود دارد که LSE فرکانس بسیار پایینتری نسبت به HSE دارد و برای واحد RTC یا همان ساعت از آن استفاده میشود که بعداً در قسمت تایمرها در رابطه با RTC مفصل صحبت خواهیم کرد. و HSE که فرکانس بسیار بالاتری دارد برای تأمین کلاک هسته و سایر واحدهای جانبی استفاده میشود.
طبق تصویر برای هرکدام از بخشهای HSE و LSE میتوانیم سه حالت غیرفعال، اسیلاتور و کریستال را انتخاب کنیم. ما حالت اسیلاتور را کردیم به این دلیل که بر روی بردی که در ادامه معرفی خواهیم کرد از یک کریستال 8 مگاهرتز استفادهشده است.
با انتخاب کریستال مشاهده میکنید که پینهای PD0 و PD1 فعال و سبزرنگ میشوند. در تصویر پین NRST که همان پین ریست میکروکنترلر میباشد نیز مشخصشده است.
پسازاینکه تنظیمات بالا را انجام دادیم وقت آن است که به قسمت Clock Cnfiguration برویم و مقدار کلاک را تنظیم کنیم.
ابتدا به تصویر زیر دقت کنید:
همانطور که در تصویر بالا مشاهده میکنید، از منابع کلاکهای خارجی فقط HSE فعال است، که این مورد بهصورت گرافیکی مشخص است، یکی از خوبیهای نرمافزار STM32CubeMX این است که هر تنظیماتی انجام بشود، نتیجهی آن بهصورت گرافیکی نمایش داده میشود. مثلاً اگر بهجای کریستال اسیلاتور را انتخاب بکنیم، قسمت HSE مانند تصویر زیر تغییر میکند. درواقع برای کریستال به دو پین و برای اسیلاتور به یک پین نیاز است.
بهعنوان یک نکته اگر به HSE، در حالتی که کریستال انتخابشده است توجه کنید و آن را باحالتی که اسیلاتور انتخابشده است مقایسه کنید، متوجه خواهید شد که محدودهی فرکانس ورودی فرق میکند، با انتخاب کریستال، فرکانس کریستال میتواند بین 4 تا 16 مگاهرتز و با انتخاب اسیلاتور، فرکانس اسیلاتور میتواند بین 1 تا 25 مگاهرتز باشد.
ما با استفاده از مالتی پلکسرها میتوانیم انتخاب کنیم که کلاک سیستم از طریق کدام منبع تأمین بشود و از طریق PLL میتوانیم فرکانس را افزایش و از طریق Prescaler میتوانیم فرکانس را کاهش بدهیم.
PLL را یک بلوک در نظر بگیرید که یک فرکانس را بهعنوان ورودی دریافت میکند و همان فرکانس را در عددی ضرب کرده و در خروجی برمیگرداند.
Prescaler را نیز یک بلوک در نظر بگیرید که یک فرکانس را بهعنوان ورودی دریافت میکند و همان فرکانس را به عددی تقسیم کرده و در خروجی برمیگرداند.
همچنین در تصویر دو نوسانگر RC داخلی را در قسمت LSI و HSI مشاهده میکنید، که معمولاً از این نوسانگرها استفاده نمیکنیم.
توضیحات مربوط به کنترل ریست و کلاک در اینجا بهپایان میرسد و در انتها میخواهیم یک برد آموزشی را به شما معرفی کنیم.
از قسمت پنجم به بعد میخواهیم که کدها را به صورت عملی بر روی برد تست کنیم، بدین خاطر از یک برد بسیاره ساده، اما کاربردی به اسم blue pill board که تصویر آن را در زیر مشاهده میکنید، استفاده خواهیم کرد.
در تصویر بالا، عملکرد هر کدام از پینهای میکروکنترلر به خوبی مشخص است و نیاز به توضیحات اضافی نیست. ما در هر قسمت بخشی از امکانات این میکروکنترلر را با استفاده از برد blue pill board راهاندازی خواهیم کرد.
در قسمت پنجم به GPIO-Output خواهیم پرداخت و توابع LL و HAL را مفصلا بررسی و مقایسه میکنیم. در این قسمت یک سری نکات بسیار مهم ذکر خواهد شد، که شما با دانستن این نکات بسیار مهم، به رمز سرعت بالای توابع LL پی خواهید برد.
اینجا یه اشتباه لپی هست :
طبق تصویر برای هر کدام از بخشهای HSE و LSE میتوانیم سه حالت غیر فعال، اسیلاتور و کریستال را انتخاب کنیم. ما حالت اسیلاتور را کردیم به این دلیل که بر روی بردی که در ادامه معرفی خواهیم کرد از یک کریستال 8 مگا هرتز استفاده شده است.
==> ما حالت /*کریستال*/ را انتخاب کردیم به این دلیل که …
درست میگم؟
پن : این سری آموزش عالیه!
سلام
خیلی عالیست واقعا ممنون؛
فقط یک اصلاح در مورد ریست که احتمالا بخاطر ساده شدن از قلم افتاده رو با اجازه شما کامل میکنم:
نقل قول از متن “وقتی که میکروکنترلر ریست شود مقدار رجیستر PC عوض میشود و خط اول برنامه به حالت اجرا میرود.”
کامل شده: وقتی میکروکنترلر ریست شود همه رجیسترها بحالت اولیه(پیش فرض) بر میگردند.از جمله PC.
سلام وقتتون بخیر.ممنون که خیلی روان توضیح دادین.انشاالله اگه وقت کردین همه ی رجیسترها رو همین جوری ساده و با مثال توضیح بدین.
سلام شاهین جان. سپاس از نظر مثبتتان.
حتما دوست عزیز.
عالی بود .
ممنون
سپاس علی نازنین.
خدا خیرتون بده شدیدا دنبال همچین آموزشی بودم
برای یادگیری LL چه کتابی رو پیشنهاد میکنید ؟
سپاس از محمد عزیز. متاسفانه هیچ کتاب پارسی یا انگلیسی که از توابع LL استفاده بکند من ندیدم، اما خب شما برای کار با این توابع منابع خوب خود ST رو در اختیار دارید.
شما ابتدا باید یوزر منوال میکروکنترلر مورد نظر را مطالعه بکنید تا با سختافزار و نحوهی عملکرد هر پریفرال آشنا بشوید سپس با استفاده از دانشی که از مطالعه یوزر منوال بدست آوردید و داکیومنتی که توابع LL رو شرح داده، اقدام به راهاندازی هر واحد کنید.
بسیار عالی
ممنون
خواهش میکنم، سپاس از توجهتان.
بسیار عالی بود
????
???