ARM, STM, STM32, آموزش, توصیه شده, مقاله

آموزش میکروکنترلر Stm32f10x به صورت کاملا رجیستری قسمت اول: GPIO-خروجی

آموزش میکروکنترلر STM32 به صورت کاملا رجیستری

خدایا با نام تو، با یاد تو و برای تو

مهدی حسن زاده آملی هستم با یک آموزش پایه‌ای و کاملا رجیستری در زمینه STM32f103  Cortex-m3، در خدمت شما هستم.
شاید برای شما سوال شده باشه چرا اصلا رجیستری، مگر توابع cmsis و یا توابع Hal جواب‌گوی پروژه‌هایمان نیستند و نمی‌توانیم از توابع آماده استفاده کنیم؟
خب به این سوال هر کسی با هر اندازه تجربه می‌تواند پاسخ دهد اما پاسخی که حداقل من را به خود قانع می‌کند این است که درسته ما توابع متنوعی را در اجرای پروژه‌هایمان می‌توانیم استفاده کنیم اما آیا در کنار اجرای پروژه‌ها به درک عمیقی خواهیم رسید؟ و آیا نسبت به توابعی که دیگران آن را نگارش کردند اطمینان خاطر داریم؟ و …

اکنون با این دید که می‌خواهیم درکی متفاوت و عمیق در زمینه میکروکنترلرهای آرم سری Cortex-m3 از خانواده‌ی بزرگ شرکت ST پیدا کنیم کار خود را شروع می‌کنیم.

طبق روال ما از ایجاد پروژه، کار خود را شروع می‌کنیم و سعی می‌کنیم یک پین را خروجی کرده و led ای را روشن و خاموش کنیم. برای کدنویسی میکروکنترلرهای ARM نرم‌افزارهای زیادی موجود است که انصافا با توجه به قدرت دیباگ نرم‌افزار کیل من از نرم‌افزار کیل استفاده می‌کنم اما شما می‌توانید از IAR ،eclips و … استفاده کنید، مهم اصول کار کردن است که باهم و در کنار هم یاد می‌گیریم.

من درمورد نصب کردن نرم‌افزار کیل چیزی نمی‌گم چون دوستان لطف کردن در این سایت و فضای اینترنت مطالب زیادی رو تهیه و به اشتراک گذاشتند و اگر باز هم مشکل داشتید در آخر این پست کامنت کنید و در قالب پستی نو برای شما آموزشی خواهم گذاشت.

اما ایجاد پروژه:
برای ایجاد پروژه کاملا طبق عکس‌های زیر عمل خواهیم کرد:
1: ایجاد پروژه جدید

پروژه جدید در کیل

2: مشخص کردن محل ذخیره فایل پروژه و تعیین نامی مناسب برای پروژه:

ذخیره فایل در کیل

3: انتخاب میکروکنترلر مورد استفاده (من از STM32f103ret6 استفاده می‌کنم) برای انجام پروژه:

انتخاب میکروکنترلر در کیل

4: انتخاب امکانات اولیه برای کدنویسی و انتقال فایل startup  به پروژه:

انتقال فایل startup به پروژه در کیل

5:اضافه کردن فایل main به پروژه:

اضافه کردن فایل main به پروژه در کیل

اضافه کردن فایل main به پروژه در کیل

خب بعد ایجاد پروژه، طبق معمول در همه‌ی پروژه‌ها به زبان C، تابع main را به پروژه خود اضافه می‌کنیم.

اما برای اینکه به امکانات میکروکنترلرهای سری M3 دسترسی داشته باشیم باید فایل هدر میکروکنترلر را به پروژه اضافه کنیم.

اما با اضافه کردن این هدر کار تمام شده نیست، بلکه باید وارد این هدر شده و میکروکنترلر مورد نظر خود را از حالت کامنت خارج کرده تا از امکانات این میکروکنترلر بهره‌مند شویم طبق عکس زیر:

اضافه کردن کتابخانه میکروکنترلر در کیل

رفع کامنت در کیل

اما اگر فایل stm32f10x.h را در پوشه‌ی پروژه ذخیره نکنیم نمی‌توانیم define STM32F10X_HD # را از حالت کامنت خارج کنیم.

حالا می‌ریم سروقت اصل ماجرا. برای اینکه یک پین را on یا off کنیم اول باید یک سری توضیحات درمورد بعضی رجیسترها بدهم تا اصل ماجرا رو بفهمیم، بعد بریم سراغ پروژه.
دانستن این نکته مهمه که شرکت ST علاقه دارد هر پورت خود را 16 بیتی تقسیم کند و این 16 بیت را به دو دسته 8 بیت کم ارزش و 8 بیت پرارزش تقسیم کند و برای کنترلشان نیز رجیستری را در نظر می‌گیرد.
برای خروجی کردن هر پین می‌توانیم از دو مدل آرایش مداری که به صورت نرم‌افزاری انتخاب می‌شود استفاده کنیم (PushPull و یا OpenDrin)
برای ورودی کردن هم طبق معمول حالت ها PullUp ,PullDown ,Float و آنالوگ را پشتیبانی می‌کند. و یک حالت Alternate Function هم وجود دارد که به موقع توضیح خواهم داد.

لیست حالت های پین IO

نکته بعدی هم اینکه در حالت خروجی ما می‌توانیم حداکثر فرکانسی را که از پین مورد نظرمون عبور کند را هم مشخص کنیم (10Mhz ,2Mhz ,50Mhz)

خب می‌ریم سر وقت رجیستری که ورودی-خروجی را مشخص می‌کند. اگر یادتان باشد گفتم هر پورت به دو دسته 8 بیتی تقسیم می‌شود پس به خاطر این دسته‌بندی ما از دو رجیستر برای تنظیم حالت های ورودی–خروجی استفاده می‌کنیم که اسمشان CRL و CRH است؛ که CRL برای رجیستر های 8 بیت کم ارزش و CRH برای رجیستر های 8 بیت پر ارزش است.

رجیستر CRL:

رجیستر CRL

همانطور که در عکس بالا نمایش داده شده است این رجیستر 32 بیتی است و برای تنظیم هر پین ما چهار بیت را در اختیار خواهیم داشت که به صورت جدول زیر تنظیم می‌شود.

CNF-MODE

جدول بالا به ما این را می‌فهماند که اگر بخواهیم پین مورد نظر را خروجی از نوع پوش-پول کنیم باید در چهار بیتی که دراختیار داریم، در دو بیت CNF عدد “00” را نوشته و در دوبیت mode بر اساس سرعتی که می‌خواهیم، عدد موردنظر را قرار دهیم، که من می‌خواهم از سرعت 50Mhz استفاده کنم، که میشود “11” و اگر بخواهیم به صورت هگز بنویسیم می‌شود 0x3 اما چگونه باید کد نوشت؟

مثلا من برای پورت A.0 می‌‎خواهم تنظیمات رو پیکربندی کنم:

حالا شاید برای شما سوال شده باشه که چرا اول (0x0000000F)~ را با رجیستر CRL به صورت AND بیتی نوشتم! جوابتون هم یک جملست: چون درحالت اولیه تمام پین ها، ورودی و از نوع شناور یا همان float هستند (با توجه به مقدار Reset value = 0x4444 4444) و ما در ابتدا باید بیت‌های موردنظر را صفر کنیم، سپس در آن‌ها بنویسیم. عبارت (0x0000000F)~ برابر است با 0xFFFFFFF0، یعنی وقتی این عبارت با رجیستر CRL به صورت بیتی AND شود، 4 بیت اول رجیستر CRL صفر می‌شوند.

خب بعد از شناخت اولیه نسبت به رجیستر CRL (نگران نباشید در آینده آنقدر با این رجیستر سروکله خواهیم زد که شما قطعا بر این موضوع اشراف پیدا خواهید کرد) می‌ریم سروقت مقداردهی به پین موردنظرمون.

برای روشن و خاموش کردن یک پین ما سه رجیستر کاملا مجزا داریم، رجیستر های ODR ,BRR ,BSRR که هر سه تاشو توضیح می‌دم.

رجیستر ODR:

رجیستر ODR

این رجیستر همانطور که در عکس بالا مشخص است یک رجیستر 32 بیتی است که فقط 16 بیت آن در دسترس است که هر بیت برای مقداردهی به هر پین منتاظر است.

از این رجیستر برای نوشتن مقدار صفر و یک در پین موردنظر استفاده می‌شود اما بهتر است فقط برای نوشتن مقدار یک از این رجیستراستفاده کنیم چون با هر بار مقداردهی به این رجیستر اگر مقدار قبلی را OR با مقدار جدید نکنیم کل مقدار قبلی را پاک می‌کنه و مقدار جدید را رایت می‌کنه (جایگزینش BSRR است)

یک را شیفت به چپ میدهیم صفرتا =>یعنی بیت صفرم پورت Aرا یک کن

اما برای خاموش کردن این پین از رجیستر BRR استفاده می‌کنیم.

رجیستر BRR :

رجیستر BRR

این رجیستر هم 32 بیتی است که 16 بیت آن در دسترس است که با نوشتن مقدار یک در این رجیستر پین مورد نظر را صفر می‌کند (به همین سادگی)
این رجیستر برای صفر کردن پین هایی استفاده میشه که  از طریق ODR یک شدن (البته در هر صورت برای صفر کردن استفاده میشه اما بیشترین کاربردش برای clear کردن پینی است که از طریق ODR یک شده است)

اما رجیستری که هم خودش می‌تونه پینی رو یک کنه و هم صفر کنه!

رجیستر BSRR:

رجیستر BSRR

این رجیستر 32بیتی است که 16 بیت کم ارزش آن برای یک کردن پین‌ها استفاده می‌شود و 16 بیت پر ارزش آن برای صفر کردن پین‌ها مورد استفاده قرار می‌گیرد.

کد بالا اول پین شماره صفر از پورت A را یک می‌کند و بعد از صرف زمانی خاص صفر می‌کند.

نکته مهم و پایانی که اگر این نکته را در کدنویسی خود رعایت نکنید قطعا جوابی حاصل نخواهد شد.

بلوک STM32-Cortex-m3

طبق عکس بالا که طراحی هسته‌های ARM سری Cortex-m3 شرکت ST را نشان می‌دهد، هر کدام از پریفرال‌ها (امکانات) این میکروکنترلر از طریق باس (رابط) هایی با هسته‌ی مرکزی در ارتباط هستند. حال اگر بخواهیم مثلا پریفرال‌های مانند USART ,i2C ,TIMER ,GPIO و … را راه‌اندازی کنیم و استفاده داشته باشیم باید باس متصل به آن پریفرال را فعال کنیم تا (به قول معروف اول خون به اعضاء برسه و بعد استفاده کنیم) بتوانیم استفاده کنیم.
خب برای فعال سازی کلاک GPIOها اول به عکس بالا نگاه می‌کنیم تا به کدام یک از باس ها متصل هستند، اگر خوب نگاه کنیم می‌بینیم GPIOها به باس APB2 متصل هستند.

رجیستر APB2ENR:
این رجیستر عمل فراهم‌سازی کلاک رو برای پریفرال‌های متصل به خود فراهم می‌سازد.

رجیستر APB2ENR

این رجیستر هم 32 بیتی است که بعضی قسمت های آن در دسترس ما است که می‌توانیم با یک کردن این قسمت‌ها کلاک را برای پریفرال مورد استفاده‌مان فراهم سازیم.

این کد یعنی بیت شماره دو که برای پورت A است را یک کن تا کلاکش مهیا شود.

 

کد نهایی:

Code

با توضیحات بالا فکر می‌کنم همه‌ی شما قطعا می‌تونید اولین پروژه کاملا رجیستری خودتون رو پیاده‌سازی کنید و درکی درست از برنامه نویسی میکروکنترلر ARM کسب کنید.

در جلسه آینده ان شاالله باهم حالت ورودی IOها را برسی خواهیم کرد و بعد سراغ وقفه خارجی خواهیم رفت.


انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.  همکاری با سیسوگ

 

نوشته های مشابه

12 دیدگاه در “آموزش میکروکنترلر Stm32f10x به صورت کاملا رجیستری قسمت اول: GPIO-خروجی

  1. Avatar علیرضا گفت:

    خیلی ممنون .میشه درمورد محاسبه زمان دیلی هم یع توصیحی بدین ؟و کلاک میکرو رو روی جه مقداری تنظیم کرده بودین؟

    1. سلام مهندس کلاک میکرو به صورت دیفالت قرار داره و از 8مگ داخلی و ضرب در 9 از طریق PLLاستفاده میکنه که فعلا یکم زوده درمورش صحبت کردن
      خیالتون به صورت جدی و مجدانه پیگیرم تا بتونم تمام مطالب رو در بازه زمانی مناسب پوشش بدم و باهم یاد بگیریم

      درمورد delay هم خیلی سادست شما بیا 1 رو تقسیم بر فرکانس کلت بکن ( 72000000) که عدد بدست امده به نوعی سرعت (به نوعی) میکروتونه که اگه با یه محاسبه ساده میتونید مشخص کنید که چه مقداری ایجاد کنید

      به کد دیلی من با این نگاه یه توجه کنید و بقیه کد هارو درنظر نگیرید متوجه میشید ان شاالله

  2. Avatar َAmir گفت:

    سلام
    آموزش ها عالی … خدا قوت
    فقط کیفیت تصاویر محیط Keil کمی تار هست … اگر کمی واضح تر بشه عالیه .
    ممنونم.

    1. سلام امیر نازنین. سپاس از نظر مثبت و همچنین انتقاد شما. در قسمت‌های بعدی این مشکل رفع خواهد شد و تصاویر با وضوح بهتری آپلود خواهند شد.

    2. سلام مهندس جان بله حق با شماست کیفیت مانیتورم یکمی بالاست و عکس های که اسکرین گرفتم برای انتقال به سایت و آپلود کردن دچار مشکل شد
      ان شاالله در آموزش های بعدی تلاش میکنم این مشکل رو برطرف کنم
      ممنونم که پیگیر هرچه بهتر شدن کیفیت مطالب آموزشی هستید

  3. SJ SJ SJ گفت:

    تشکر فراوان
    int main(void
    main اینت برمی گردونه
    بیصبرانه منتظر ادامه ایم

    بیشتر ترجیح میدادم از یک ادیتور رایگان مثل VScode (یا EmBitz یا emIDE به روزتر بهتر) استفاده بشه و همچنین از کامپایلر GCC

    1. خواهش می‌کنیم دوست عزیز. بله خروجی هرتابعی در زبان C از جنسی است که در همان ابتدا قبل از اسم تابع تعریف شده است. به عنوان یک پیشنهاد، محصول جدید شرکت ST به نام STM32CubeIDE که یک IDE رایگان می‌باشد را نیز در نظر بگیرید. کامپایلر این IDE نیز GCC می‌باشد.

      برای اطلاعات بیشتر و همچنین دانلود این نرم‌افزار به دو آدرس زیر مراجعه کنید:

      https://sisoog.com/2019/05/%d8%b3%d9%88%d8%b1%d9%be%d8%b1%d8%a7%db%8c%d8%b2-%d8%b4%d8%b1%da%a9%d8%aa-st-%d9%86%d8%b1%d9%85%e2%80%8c%d8%a7%d9%81%d8%b2%d8%a7%d8%b1-stm32cubeide/

      https://sisoog.com/2019/08/%d8%af%d8%a7%d9%86%d9%84%d9%88%d8%af-%d9%86%d8%b1%d9%85-%d8%a7%d9%81%d8%b2%d8%a7%d8%b1-stm32cubeide/

    2. خوشحالم از اینکه خوشتون اومد
      مهندسIDEهای مجانی در جایگاه خود عالی هستند ولی قدرت کیل درجای خود کم نظیره
      صرفا این مطالب برای آموزش هستش
      بعد یادگیری اگر مایل باشید میتوانید به هر Ide دیگری که خودتون راحتید سویچ کنید

      درضمن شرکت ارم کیل رو خریده پس همچنان در رده بهترین ها میمونه حالا حالاها
      از نظر شرعی مراجعی که من از دفترشون پرسیدم گفتند مشکلی نداره چون برای غیر مسلمان هستند (صرفا جهت پیگیری شخصی )
      اگر خیلی مهمه براتون لطفا با مراجع دینی خودتون چک کنید

  4. مرتضی خوشحال مرتضی گفت:

    سلام.
    بسیار عالی و آموزنده بود.
    بی صبرانه منتظر آموزش بقیه قسمت ها هستیم.
    خیلی ممنون از زحماتتون.

    1. سلام مرتضی عزیز. سپاس از نظر مثبتتون و خوشحالیم که این آموزش برای شما مفید بوده است.

    2. سلام مهندس خوشحالم که خوشتون اومد

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *