برد STM مدارهای الکترونیک

راه اندازی برد STM32 با استفاده از نرم افزار KEIL و توابع HAL

programming-stm32-keil-and-hal-digispark-
نوشته شده توسط علی زاهدی

پیش از این آموزش راه اندازی برد STM32 را با نرم افزار اردوینو را در پست آموزش راه اندازی و پروگرام برد STM32 در کامپایلر آردوینو IDE ، توضیح داده‌ایم. در این پست قصد داریم تا نحوه ساخت پروژه جدید و پروگرام کردن برد STM32 به شما آموزش دهیم. در ادامه با مرجع تخصصی بردهای امبدد به زبان فارسی، دیجی اسپارک همراه باشید.

 

در سال ۱۹۸۳ شرکت Acton تصمیم به ساخت میکروکنترلر های ۱۶ بیتی گرفت و این شروعی برای پردازنده های ARM بود، ابتدا کلمه ARM مخفف Acron RISC Machine بود تا سال ۱۹۹۰ که شرکت اپل نیز به ARM پیوست و کلمه ARM به مخفف Advanced RISC Machine تغییر کرد و شرکت ARM Holdings تاسیس شد. جالب است بدانید شرکت ARM Holdings هیچ تراشه ای تولید نمیکند و تمام درآمد این شرکت از فروش امتیاز ساخت تراشه های ARM به شرکت های دیگر کسب می شود.در سال ۲۰۱۱ مشتریان ARM توانستند ۷٫۹ میلیارد ابزار مبتنی بر این معماری را وارد بازار کنند. یکی از معروف ترین پردازنده های مبتنی بر معماری ARM نسل ARM7 می باشد، که اکثر تولید کنندگان برای پیاده سازی میکروکنترلر های خود از این نسل استفاده می کنند، همچنین هسته ی Cortex-M3 جایگزینی قدرتمند برای ARM7 می باشد. از شرکت های رایج سازنده میکروکنترلر های مبتنی بر معماری ARM میتوان به ST، ATMEL و NXP اشاره کرد.

 

معرفی برد STM32 با تراشه ARM

بردهای STM نوعی از بردهای امبدد بر پایه تراشه‌های ARM Cortex می‌باشند. ظاهر کلی برد STM32 بسیار شبیه به آردوینو نانو Nano می‌باشد. البته این برد هم مانند آردوینو اوپن سورس میباشد. برد STM32 مورد استفاده در این آموزش از نوع STM32F103C8T6 انتخاب شده است. برد دارای دو اسیلاتور میباشد. یک کریستال ۸MHz و دیگری کریستال ۳۲KHz که توانایی راه اندازی ساعت RTC داخلی را دارای می‌باشد. تنها همین کریستال کوچک امکان استفاده از برد STM32F103C8T6 به عنوان پردازنده بسیار کم مصرف را فراهم می‌کند. اگر شما کاربر گرامی علت این موضوع را نمی‌دانید، در قسمت نظرات سوال بپرسید. دیگر ویژگی‌های این برد عبارتست از، یک میکروکنترلر ۳۲ بیتی از خانواده آرم و گروه کورتکس m۳ می‌باشد. حداکثر کلاک این میکروکنترلر ۷۲ کیلو بایت را حفظ و حافظه فلش آن ۶۴ کیلوبایت می‌باشد. همچنین حافظه SRAM آن ۲۰ کیلو بایت و ولتاژ کاری ۳. ۳ ولت است.

 

راه اندازی برد STM32 با کیل - دیجی اسپارک

 


اتصالات برد STM32


ابتدا اتصالات برد STM32 را طبق تصویر به پروگرامر STLINK V2 متصل کنید، و پروگرامر را به سیستم متصل کنید.

اتصالات پروگرامر USB به ماژول STM32 - دیجی اسپارک

 


راه اندازی برد STM32


برای برنامه نویسی این میکروکنترلر ها نیاز است که ابتدا دو نرم افزار KEIL و STM32CubeMX را نصب کنید. لازم به ذکر است برای دانلود نرم STM32CubeMX نیاز است که از VPN استفاده نمایید، تا گزینه ی دانلود برای شما باز شود. همچنین درایور مورد نیاز برای پروگرامر STLINK V2 را از این لینک دانلود کنید. پس از نصب و دانلود پکیج های مورد نیاز وارد نرم افزار STM32CubeMX شده، سپس از منوی فایل گزینه New Project را انتخاب کنید. در پنجره ی باز شده باید میکروکنترلر مورد نطر خود را انتخاب کنید، میکروکنترلری که در این آموزش استفاده شده است مدل STM32F103C8 می باشد. پس از انتخاب میکروکنترلر مورد نطر گزینه Start Project را انتخاب کنید. در پنجره ی باز شده می توانید میکروکنترلر مورد نطر خود را به صورت گرافیکی مشاهده کنید. در این قسمت با کلیک بر روی پایه ای مورد نطر منو ای با گزینه های مختلف باز می شود که با انتخاب گزینه ی GPIO_Output پایه بعنوان خروجی معرفی می شود.

سپس از نوار سمت چپ بخش System Core گزینه RCC  را انتخاب کنید و در بخش Mode گزینه ی (High Speed Clock(HSC را بر روی Crystal/Ceramic Resonator تنظیم کنید. همچنین در بخش SYS گزینه Debug را بر روی Serial Wire تنظیم کنید. سپس بر روی میکروکنترلر بر روی پایه شماره ۲ کلیک کنید و گزینه GPIO_Output را انتخاب کنید. از نوار تنظیمات بالا بخش Project Manager در قسمت Project Name نامی برای پروژه انتخاب کنید. سپس در قسمت Project Location مسیر مورد نظر خود را برای پروژه انتخاب کنید. قسمت Toolchain / IDE را بر روی MDK-ARM V5 تنظیم کنید و گزینه ی GENERATE CODE را انتخاب کنید. در پنجره ی باز شده گزینه ی Open Project را انتخاب کنید. پس از باز شدن نرم افزار KEIL در نوار سمت چپ پوشه پروژه را باز کنید و وارد پوشه ی Application/User شده و فایل main را باز کنید. کد برنامه داخل این فایل موجود است، کد زیر را داخل حلقه (while(1 کپی کنید و سپس از منوی Project گزینه ی Build Target  را انتخاب کنید پس از اتمام کامپایل، از منوی Flash گزینه ی Download  را انتخاب کنید. اگر با پیغام no target connected مواجه شدید ابتدا کلید reset روی برد را نگه داشته و گزینه ی Download را بزنید و سپس کلید reset را رها کنید. پس از دانلود شدن برنامه روی ای سی، بار دیگر کلید reset را فشار دهید، مشاهده خواهید کرد که LED موجود روی برد STM شروع به چشمک زدن خواهد کرد.

 

تمامی توضیحات بالا را می توانید داخل ویدیو به صورت عملی مشاهده نمایید.

 

 

دستور HAL_GPIO_TogglePin باعث تغییر وضعیت خروجی مورد نظر می شود، سپس دستور HAL_Delay تاخیر به مدت زمان دلخواه شما ایجاد می کند.

HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
HAL_Delay(2000);

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

HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_Delay(2000);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
HAL_Delay(2000);

 


لوازم مورد نیاز


 

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 


پروژه و دریافت بن ارسال رایگان


برای دریافت بن خرید از دانشجو کیت، کاربران بایستی با استفاده از وسایل این آموزش، پروژه را اجرا کرده و یا حتی مدار جدیدی تعریف کنید. سپس از اجرای کار فیلم گرفته و در شبکه‌های اجتماعی از جمله آپارات و اینستگرام، با هشتگ‌های دیجی_اسپارک   دانشجوکیت    digispark    daneshjookit منتشر کنند. سپس از طریق بخش نظرات در ادامه همین آموزش، جهت دریافت بن خرید ارسال رایگان به ارزش ۱۲۰۰۰ تومان از دانشجو کیت، لینک را زیر همین پست ارسال کنید.

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

درباره نویسنده

علی زاهدی

برنامه نویس و طراح سیستم های مبتنی بر میکروکنترلر

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

تبادل نظر و رفع عیب با ثبت دیدگاه

۳۶ دیدگاه

  • سلام
    من متوجه نشدم که توی این روش چرا از Keil استفاده کردید؟ مثلا از همون آردوینو نمیشد استفاده بشه؟

    • سلام،
      بله میشه از اردینو هم برای پروگرام کردن این برد استفاده کرد، اما داخل در نرم افزار KEIL دسترسی سطح بالاتری به برنامه نسبت به اردوینو موجود هست.

    • سلام
      برای پروگرام کردنstm32 باst-link
      به شکلی که برنامه های آردوینویی را روی stm32 ریخت و اجرا کرد دقیقا باید چیکار کرد. لطفا یه نمونه از برنامه با محیط آردوینو رو روی stm32 با توضیحاتش اجرا کنید.
      با تشکر
      بهروز شیریان کارشناسی شبکه و کامپیوتر وعلاقه مند به الکترونیک

    • با سلام
      نرم افزار keil مخصوص میکرو های ARM است و کد پروگرام شده توسط نرم افزار keil بر روی میکروکنترلر های ARM بسیار مناسب تر از کد پروگرام شده توسط آردوینو با استفاده از بوت لودر است.

  • با سلام و تشکر از مطلب خوبتان

    برای بنده این سوال همیشه در ذهنم بوده که : برای ساختن یک ساعت چشمک زن که هر چشمک آن برای یک ثانیه باشد ، آیا باید جمع تاخیر میکروثانیه چشمک زدن و خاموش شدن باید برابر با یک ثانیه باشد ؟ یا بین هر چشمک زدن ، یک ثانیه تاخیر لازم است تا دقیق باشد؟

    • سلام، از توجه شما سپاس گزارم.
      مدت زمان یک ثانیه برای روشن بودن led زیاد است، و بهتر است که ۲۰۰ میلی ثانیه led روشن و ۸۰۰ میلی ثانیه خاموش باشد تا جمع هر دو یک ثانیه شود و led در هر ثانیه یک بار چشمک بزند.

      • با تشکر از پاسخ شما

        سوال دیگر بنده این است که :
        آیا با یادگیری برنامه نویسی برای یک مدل خاص مانند LPC1788 ,‌ می توان برای دیگر بوردهای مبتنی بر stm32 مانند همین بورد STM32F103T8C6 نیز اشراف کامل پیداکرد ؟

        در نهایت , چه مقدار تفاوت کلی و جزیی میان آنها وجود دارد؟

        • بستگی داره شما در چه سطحی آموزش ببینید. درکل ساختار برنامه نویسی کلیه این میکروکنترلر ها مشابه است و شما حتی اگر AVR هم یادگرفته باشید با چند روز مطالعه میتوانید روی هر میکروکنترلر دیگری که با زبان C کامپایل می شود، برنامه نویسی کنید.

  • سلام
    من بعد از کلیک دکمه generate code در stm32cubemx با پیام :
    the code is successfully generated under c:/ test but MDK-ARMV5.27 project generation have a problem و متاسفانه کد لازم برای استفاده در نرم افزار keil ایجاد نمیشه.
    ممنون میشم اگر کسی با این مشکل مواجه شده راهنمایی کنه، در ضمن من مسیر ذخیره سازی رو چند بار عوض کردم اما نتیجه نداد.

    • سلام با تشکر از توجه شما
      اگر مراحلی که در این آموزش گفته شده را کاملا درست طی کرده اید ممکن است در مراحل نصب نرم افزار مشکلی بوده باشد.

  • باسلام. لطفاً بیان کنید چرا ” تنها همین کریستال کوچک امکان استفاده از برد STM32F103C8T6 به عنوان پردازنده بسیار کم مصرف را فراهم می‌کند”.

  • با سلام و خسته نباشید خدمت شما اقای زاهدی
    من از طرفدار ها و دنبال کننده های دیجی اسپارک هستم. یک پیشنهادی داشتم اونم اینه که نرم افزار stm32 cube ide تازه معرفی شده و تمامی امکانات را در خودش جای داده . بهتر نیست نرم افزار های قدیمی و واسط را کنار بگإاریم؟؟!!!

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

  • سلام دوست من ممنون از توضیحات خوبتون
    حالا فرض کنید ما مدار رو خودمون باید بکشیم و برنامه ریزی کنیم و نیازی به برد توسعه نیست ، حال سیم کشی به چه صورت خواهد بود.

    • با سلام از توجه شما سپاسگزارم
      برای این کار بهتر است شماتیک برد BluePill را دانلود کنید و طبق آن PCB خود را طراحی کنید. بزودی آموزش در این باره منتشر خواهیم کرد.

  • سلام
    بنده دنبال آموزش اجرای چند لوپ به طور همزمان هستم لطفا آموزش این اجرای چند لوپ رو هم داخل Keil قرار بدین ممنون

  • سلام وقتتون بخیر.
    من تمام مراحل بالارو انجام دادم وبا پیغام no target connected مواجه شد وکاری که گفته شده رو انجام دادم ولی بازهم همین پیام رو میاره.اگه میشه راهنمایی کنید

    • با سلام
      از کدام پروگرامر استفاده می‌کنید؟
      اتصالات میکروکنترلر به پروگرامر را بررسی کنید.

  • با سلام و تشکر از زحمات شما
    من هنگامی که میخواهم کد رو کامپایل کنم میزنه target not build
    و اینکه توابع هال به طور پیش فرض روی کیل هست یا باید نصب کنیم
    طفا یه دوره جامع برای این موضوعات یا اموزش stm32ترتیب بدید

    • با سلام
      در صورتی که اتصالات پروگرامر به میکورکنترلر را به درستی انجام داده اید. هنگام دانلود کد روی میکروکنترلر کلید reset را چند ثانیه نگهدارید و بعد رها کنید.
      توابع HAL توسط نرم افزار STM32CubeMX به پروژه اضافه می‌شوند.

  • سلام وقت بخیر ممنون از سایت خوبتون
    من وقتی گزینه ی دانلود رو میزنم خطای:
    not a genuine ST device, abort connection میاد ، چطوری برطرف کنم این مشکل رو؟

    • با سلام
      برای رفع این مشکل از منو Project وارد بخش Option for Target شده و در بخش Debug روی گزینه Setting در قسمت گوشه بالا سمت راست کلیک کنید. در صفحه جدید گزینه Connect را بر روی pre-reset تنظیم کنید.

  • سلام خدمت شما
    من یک مشکلی که برام پیش اومده این هست که پروگرامرم که st link v2 هست رو کامپیوتر نمی خونه، keil رو نصب کردم،
    Stm32cube mx رو نصب کردم، درایور پروگرامر رو نصب کردم، st link utility هم نصب کردم ولی باز هم کامپیوتر پروگرامر
    رو نشناخت . چند بار درایور پروگرامر رو اپدیت کردم و پاک کردم باز هم نشد .
    لطفا بگین من چکار کنم؟
    ممنون با تشکر

    • با سلام
      در صورتی که نرم افزار Utility قادر به شناسایی پروگرامر نیست بایستی بررسی کنید آیا پروگرامر شما سالم است یا خیر!

  • سلام من به تازگی keil رو نصب کردم و یه مشکلی دارم ممنون میشم کمک کنید وقتی در مود دیباگ هستم تب peripherals تقریبا خالیه و جز دو تا گزینه چیزی توش نیست و گزینه system viewer هم جلوش خالیه نرم افزار آپدیت هم کردم و حتی یک سری دوباره نص کردم و مشکل حل نشد میخواستم بدونم میتونید کمکم کنید؟؟؟؟

    • با سلام
      ممکن است پکیج مربوط به میکروکنترلر مورد استفاده شما به درستی دانلود نشده باشد. از بخش پکیج های نرم افزار KEIL، پکیج مربوط به میکروکنترلر خود را به درستی دانلود کنید.

  • من میخوام یه برنامه برای شارژر خودرو بنویسم
    برنامه از این قراره
    طبق حالت هایی که خودرو کانکت میشه یه سری مقاومت از خودش نشون میده که میخوام با پتانسیومتر برای ورودی انالوگ شبیه سازیش کنم
    و حالت a میخوام یک ۱۲ ولت ثابت در خروجی داشته باشم که با pem ۱۰۰ درصد میخوام راه اندازیش کنم و این شرطش اینه که از ۱۱ بزرگتر بود فعال شه
    و اگه عیر از این باشه pem۲۵ درصد شه
    حالت بعدشم میخوام حالت c رو فقط بنویسم که اگه ولتاژ از ۸ بزرگتر و از ۹ کوچکتر بود یه خروجی دیجیتال برا کنتاکتور فعال شه و یک led هم روشن شه
    میخوام این برنامه رو برای stm32f103c8t6و با توابع hal بنویسم
    اینم برناممه ولی جواب نمیگیرم
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
    uint16_t cp_up = 0;
    uint16_t cp_un = 0;
    uint16_t voltage = 0;
    uint16_t voltagen = 0;
    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1)
    {
    /* USER CODE END WHILE */
    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
    uint16_t cp = HAL_ADC_GetValue(&hadc1);
    HAL_ADC_Stop(&hadc1);
    uint16_t pwm25 = 4095 * 0.25;
    // pwm25%
    if (cp > pwm25)
    {
    // pwm 25%
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
    }
    else
    {
    // pwm 0%
    HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
    }
    if (cp > (cp / 2))
    {
    HAL_Delay(10); // 10 microseconds
    cp_up = cp;
    }
    else
    {
    HAL_Delay(50); // 50 microseconds
    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
    cp_un = HAL_ADC_GetValue(&hadc1);
    HAL_ADC_Stop(&hadc1);
    }
    voltage = (cp_up * 24) / 4096;
    voltagen = (cp_un * 24) / 4096;
    // Check if voltage is between 17 and 19
    if (voltage >= 17 && voltage <= 19)
    {
    // Enable GPIO 13
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
    }
    else if(voltage 1)
    {
    // Disable GPIO 13
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
    }
    }