در قسمت سوم از آموزش STM32 با توابع LL، یاد گرفتیم که در نرمافزار STM32CubeMX چگونه میتوان یک پروژه ایجاد کرد. همینطور در همان قسمت تنظیماتی که برای یک پروژه ساده نیاز بود را شرح دادیم و آن را پیکرهبندی کردیم و در نهایت از پیکرهبندی انجام شده برای نرمافزار Keil خروجی گرفتیم و در محیط Keil، یک کد ساده را نوشته، کامپایل و بر روی برد پروگرام کردیم.
اگر به خاطر داشته باشید در قسمت سوم وقتی به RCC و یک سری تنظیمات مربوط به کلاک رسیده بودیم، گفتیم که طبق مقاله، بدون اینکه دلیلش را بدانید تنظیمات را انجام بدهید تا در قسمتهای آتی، که این قسمت باشد، همه چیز مفصلا شرح داده شود.
در این مقاله قصد داریم در رابطه با کلاک و ریست (Reset) که در بخش RCC (Reset and Clock Control) قرار دارند به صورت کامل صحبت بکنیم. در همین حین با مفاهیمی دیگر مانند PLL، اسیلاتور، کریستال و یک سری مدارات آشنا میشویم و در نهایت نیز یک برد آموزشی برای پیشبرد آموزشها معرفی خواهیم کرد.
اجازه بدهید با اینکه کلاک چیست و چرا باید وجود داشته باشد بحث این مقاله را شروع بکنیم.
کلاک (Clock)
اگر ساختار و عملکرد یک کامپیوتر یا یک میکروکنترلر را شبیه ساختار و عملکرد بدن انسان در نظر بگیریم، CPU میشود همان مغز انسان، منبع کلاک میشود قلب انسان و خود سیگنال کلاک میشود خونی که توسط قلب یا همان منبع کلاک در رگها جاری میگردد تا مغز بتواند فرمانش را به سایر اعضای بدن ارسال بکند.
در واقع مغز با استفاده از رگها و خونی که در این رگها جاری است میتواند به اعضای بدن فرمان صادر بکند و آنها را تحت کنترل خود بگیرد و اگر برای لحظهای خون به مغز نرسد کل سیستم بدن انسان با اختلال مواجه میشود.
در میکروکنترلر هم کلاک دقیقا همین نقش حیاتی را دارد و اگر برای لحظهای کلاک قطع بشود یا با مشکل مواجه بشود، کل میکروکنترلر با اختلال مواجه خواهد شد.
در الکترونیک دیجیتال مداراتی به اسم مدارات ترتیبی سنکرون وجود دارند که این مدارات برای هماهنگ شدن نیاز به عامل کلاک دارند. و بدون کلاک عملا هیچ کاری صورت نمیپذیرد.
پس تا اینجا وظیفهی کلاک و اینکه چرا باید وجود داشته باشد را متوجه شدیم. اکنون باید با ذات کلاک و اینکه چگونه ایجاد میشود آشنا بشویم.
سیگنال کلاک در حالت ایدهآل شبیه شکل زیر است:
برای ایجاد سیگنالی شبیه به شکل بالا، نیاز به مداری جداگانه است که همان منبع کلاک نامیده میشود.
نکتهای که باید به آن توجه کرد تفاوت ماهیت، ذات و چرایی وجود داشتن منبع کلاک و منبع تغذیه است، تفاوت منبع کلاک و منبع تغذیه را در ادامه به صورت اساسی شرح خواهیم داد.
برای اینکه مفاهیم سریعتر و بهتر منتقل شوند رابطهی بین قلب و منبع کلاک به صورت کلی بیان شد و این دو را معادل هم دانستیم که این رابطه دقیق و صحیح نیست، برای رابطهی دقیقتر بین این دو، به توضیحاتی که در ادامه ذکر میشود دقت کنید.
آنجایی که گفتیم قلب منبع کلاک سیستم است را باید اصلاح کنیم. قلب را به صورت دقیقتر باید به منبع تغذیه سیستم تشبیه کرد نه منبع کلاک. در واقع منبع کلاک توان خود را از منبع تغذیه یا همان قلب دریافت میکند و به عنوان خروجی سیگنال کلاک را تولید میکند.
پس از اصلاحات بالا باید بگوییم که قلب، همان منبع تغذیه است و اینکه چه زمانی و به چه نحوی؛ قلب خون را به مغز و سایر اعضای بدن برساند، را میتوان به منبع کلاک و خود کلاک تشبیه کرد.
همانطور که سیستم بدن ما میتواند زنده بماند اما عملکرد صحیحی نداشته باشد، در میکروکنترلر هم اگر تغذیه وجود داشته باشد اما کلاکی نباشد، میکروکنترلر روشن است ولی عملکرد صحیحی ندارد.
سعی شد با تشبیه میکروکنترلر به سیستم بدن انسان، مفاهیم به صورت بنیادی و ساده بیان گردند. تا اینجای مقاله باید به خوبی وجود کلاک و تفاوتش با تغذیه و همچنین عملکرد آن را درک کرده باشید، اما اگر هنوز کمی این مفاهیم برایتان گنگ است بهتر است که برگردید به عقب و یک بار دیگر این مطالب را مطالعه بفرمائید.
مدار منبع کلاک
اکنون وقت آن است که مدار منبع کلاک را تشریح کنیم. مدار زیر یکی از سادهترین مدارهایی است که برای تولید کلاک میکروکنترلر استفاده میشود.
در میکروکنترلرها معمولا به دو روش با استفاده از مدار بالا، کلاک را تامین میکنند. یک روش این است که کل مدار بالا به صورت خارجی کنار میکروکنترلر قرار داده میشود و روش دیگر اینکه فقط بخشی از این مدار، کنار میکروکنترلر قرار میگیرد، چون بخش دیگر این مدار به صورت داخلی درون خود میکروکنترلر وجود دارد.
در روش دوم فقط کریستال و دو خازن به صورت خارجی کنار میکروکنترلر قرار میگیرند و بقیه مدار درون میکروکنترلر قرار دارد. بخشی که در خارج مدار قرار میگیرد، فیدبک مدار نامیده میشود.
وقتی کل مدار به صورت یک ماژول کنار میکروکنترلر قرار داده میشود اصطلاحا میگویند از اسیلاتور استفاده کردیم و وقتی بخشی از مدار کنار میکروکنترلر قرار داه میشود اصطلاحا میگویند از کریستال استفاده کردیم.
اما این نوع اسمگذاری به صورت اشتباه رایج شده است. چون که اسیلاتور به معنای نوسانگر، از کلمهی Oscillate به معنای نوسان گرفته شده است و میتواند هم در روش اول و هم در روش دوم به کار برود. از سمتی دیگر کریستال هم که یک ماده فیزیکی است، عامل به وجودآورندهی نوسان در هر دو روش است و به صورت فیزیکی در هر دو روش قرار داده شده است. پس با توجه به این توضیحات این نوع نامگذاری اشتباه است.
مسلما میتوان عبارات بهتری برای توصیف این دو پیدا کرد اما من قصد دارم همین اشتباه رایج را ادامه بدهم و به روش اول اسیلاتور و به روش دوم کریستال بگویم.
علاوه بر مدار بالا، که در دو روش ذکر شده برای تامین کلاک از آن استفاده میشود، یک مدار RC دیگر نیز به صورت داخلی در میکروکنترلر وجود دارد که میتوانیم از این مدار برای تامین کلاک استفاده کنیم و هیچ اسیلاتور یا کریستالی کنار میکروکنترلر قرار نگیرد، اما معمولا به دلیل عدم دقت و وابستگی دمایی از RC داخلی میکروکنترلر استفاده نمیشود.
ریست (Reset)
واژهی ریست برای همهی ما آشناست و بارها این کلمه را در زندگی برای کارهای مختلف به کار بردهایم، مثلا در برخورد با دستگاههای مختلف گفتهایم که دستگاه ریست شده است یا به شوخی به دوستمان گفتهایم که ذهنت ریست شده است و …
اما این تعریف، یک تعریف کلی و انتزاعی در سطح بالا است که همهی افراد، حتی غیر الکترونیکیها نیز با آن آشنا هستند. اکنون ما میخواهیم به عنوان یک مهندس الکترونیک کمی با جزئیات این مفهوم کلی و انتزاعی آشنا بشویم.
آیا تا به حال فکر کردهاید که وقتی میگوییم میکروکنترلر ریست شده است دقیقا چه اتفاقی میافتد؟
مفهوم کلی ریست همان چیزی است که تا کنون میدانستیم، یعنی یک بازگردانی یا برگشت به یک حالت اولیه. حال اگر بخواهیم دقیقتر و به عنوان یک مهندس الکترونیک به مساله پاسخ بدهیم باید بگوییم که وقتی عمل ریست اتفاق میافتد رجیستر PC به خط اول برنامه برمیگردد.
در میکروکنترلرها یک رجیستر به اسم PC یا همان Program Counter به معنای شمارنده برنامه وجود دارد که مقدار ذخیره شده در این رجیستر مشخص میکند که اکنون باید کدام خط از برنامه اجرا شود. و وقتی که میکروکنترلر ریست شود مقدار رجیستر PC عوض میشود و خط اول برنامه به حالت اجرا میرود.
میکروکنترلر از طرق مختلفی از جمله راههای سختافزاری و نرمافزاری میتواند ریست شود، در حال حاضر قصد نداریم به راههای نرمافزاری بپردازیم اما راههای سختافزاری شامل زمان روشن شدن، زمان خاموش شدن و زمانی که پایه ریست میکروکنترلر به سطح ولتاژی که برای ریست آن در نظر گرفته شده است، متصل شود، میشود.
لازم است که پایه Reset میکروکنترلر برای ایمنی بیشتر، به مدار زیر متصل شود:
همانطور که میدانید هدف این مجموعه آموزشی، آموزش طراحی سختافزار برای میکروکنترلر نیست و فقط در موارد مهم، مانند همین مدار کلاک و ریست، به یک سری توضیحات کلی در مورد مدارات اکتفا میکنیم.
حال قصد داریم همهی مواردی که در رابطه با کلاک و ریست گفتیم را در نرمافزار مرور کنیم.
RCC (Reset and Clock Control)
ابتدا به تصویر زیر دقت کنید:
همانطور که در تصویر بالا مشاهده میکنید، از بخش 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 پی خواهید برد.
منبع:سیسوگ