• Stm32 صفحه اشکال زدایی را انتخاب کنید. STM32F3DISCOVERY: قطب نما روی برد توسعه از STMicroelectronics. تشکیل تصویر بر روی LCD

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

    آموزش من از زمانی شروع شد که دو سال پیش به مبحث میکروکنترلرها علاقه مند شدم و مهندس که در مورد آنها پرسیدم یک برد 300x200mm به من داد و گفت که شامل یک کنترلر STM32F217ZGT6 است و این برد همه چیز لازم برای آموزش را دارد. "به طور کلی، وقتی به آن مسلط شوید، همه چیز دیگر مانند زباله به نظر می رسد" (اما او نگفت که برای چشمک زدن LED باید SPI را پیکربندی کنید، که من در آن زمان حتی در مورد آن نشنیده بودم). پس از سه ماه نه چندان شدید تلاش بی‌ثمر، آگاهی از ضعف مهارت‌های برنامه‌نویسی و تعداد زیادی مقاله خوانده شده، همچنان باید برای STM32VLDISCOVERY تلاش می‌کردم و با کپی کردن برنامه‌ها و آزمایش با آن‌ها، بالاخره همه چیز شروع شد، اما همچنان به کندی. .

    در یک سال و نیم موفق شدم به عنوان یک توسعه دهنده کار کنم، به دنبال جای خالی در جایی که آنها با STM32 کار می کردند (از آنجایی که فکر می کنم اینها اکنون امیدوارکننده ترین میکروکنترلرهای کلاس خود هستند)، تجربه کسب کردم و وقتی نوبت به گرفتن دیپلم رسید، یاد پینه های دردناکم افتادم. ایده تم بلافاصله به وجود آمد: "هیئت ارزیابی برای STM32 و یک دوره آموزشی (کامل) (برای کوچکترها) برای آن."

    دقیقاً به همین دلیل بود که خواستم یک دوره کامل و کامل بنویسم تا به اصطلاح دیگران عذاب نکشند و خودم آن را بفهمم. بنابراین، وقتی به مؤسسه آمدم و فهمیدم که برای تسلط و درک سریع، به انگیزه ای (یا بهتر است بگوییم، یک ضربه خوب) نیاز دارم، شروع به لگد زدن به سینه خود با پاشنه پا کردم (قبر خودم را کندم) که من نه تنها یک دوره آموزشی می نویسم (در دانشگاه ما مجبور شدم کتابچه راهنمای روش شناختی او را صدا کنم)، بلکه یک طرح کاری نیز ارائه خواهم کرد. موضوع پذیرفته شد، تکلیف نوشته شد (قبر حفر کرد، سنگ قبر سفارش داد)، تنها چیزی که باقی مانده بود نوشتن و طراحی همه چیز بود (در قبر دراز بکشید، حفر کنید و سنگ قبر بگذارید).

    زندگی نشان داد که من کمتر از شش ماه وقت داشتم، اما هنوز تمام زمان اختصاص داده شده برای دیپلم تقریباً به پایان رسیده است، دفاع خیلی زود است، اما با کمال تعجب همه چیز نه تنها آماده است، بلکه تقریباً 100٪ آزمایش شده است (روی افراد زنده). در از جمله).

    خروجی به صورت زیر بود:

    1. خود دوره (راهنمای روش شناختی به روش علمی)

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

    2. برد اشکال زدایی روی کنترلر STM32F103RET6

    اینجا همه چیز کمی بهتر از نکته اول است، برد طراحی شده، سفارش داده شده است (به دلیل شرایط مجبور شدم فوری سفارش بدهم) در Rezonit، قطعات سفارش داده شده، با دست لحیم شده اند (راستش را بخواهید، هیچ ویدیویی این موضوع را منتقل نمی کند. احساس اولین لحیم کاری LQFP64) و آزمایش شد (بیشتر آن بلافاصله کار کرد). اما این یک ماکت است و، البته، بدون پوشش نبود: سیم کشی، آداپتورها و سایر "عصاهای زیر بغل"، اما، متأسفانه، من زمان لازم برای سفارش نسخه دوم را نخواهم داشت، و احتمالاً نمی خواهم ، برای دفاع از دیپلم، مطمئنم همین کافی است. بنابراین در زیر با جزئیات بیشتری در مورد این برد توسعه صحبت خواهم کرد.

    وقتی اولین کارم را به عنوان توسعه‌دهنده الکترونیک شروع کردم، با نظر جالبی برخورد کردم و همانطور که پیداست کاملاً رایج است. این نظر چیزی شبیه به این بود: "اینجا من یک برنامه نویس و میکروکنترلر برنامه هستم، من طراحی مدار را نمی دانم و نمی خواهم بدانم، اتفاقاً من نیز نمی دانم چگونه لحیم کاری کنم." پس از صحبت با گروهی از برنامه نویسان خارج از شرکت، متوجه شدم که فرد کار من از نظر او تنها نیست و اگرچه من از آن حمایت نمی کنم، اما ارزش درک و احترام به نظرات دیگران را دارد، به خصوص که مناسب است. کاملاً به مفهوم آن زمان "همه در هیئت مدیره" هیئت توسعه. . از این نظر ، برد کاملاً "چاق" بود و STM32SB (SB-StudyBoard) V1.0b نامگذاری شد. در زیر به آنچه در آن گنجانده شده است خواهیم پرداخت.

    1. میکروکنترلر
    با توجه به اینکه من با میکروکنترلر STM32F103RET6 کار کردم برای پروژه انتخاب شد.

    2. مدار برق و کنترل کننده سخت افزار USB
    این میکروکنترلر دارای یک USB داخلی است که تصمیم گرفته شد آن را به یک کانکتور جداگانه خروجی دهد.

    3. بلندگو
    تصمیم بر این شد که مدولاسیون PWM برای تسلط و یادگیری نحوه نوشتن ملودی ها معرفی شود.

    4. نشانگر دیجیتال و مقاومت شیفت
    برای تسلط همزمان نمایش پویا و رجیستر شیفت، تصمیم گرفته شد که آنها را ترکیب کنیم.

    5. ال ای دی
    ال ای دی، چه چیزی می تواند بهتر باشد؟ فقط ال ای دی های سه رنگ که بر روی آن ها می توانید بر تغییرات صاف رنگ مسلط شوید.

    6. نمایشگر LCD
    صفحه نمایش LCD استاندارد با 2 خط 16 کاراکتری برای تسلط بر رابط موازی.

    7. صفحه کلید
    صفحه کلید ماتریس، شما باید این کار را بدانید و بتوانید انجام دهید.

    8. گسترش دهنده پورت I/O
    چیزی به نام پورت های ورودی/خروجی زیاد وجود ندارد، اما در اینجا می توانید بر I2C نیز مسلط شوید.

    9. دماسنج الکترونیکی
    سنسور دمای 1-Wire یک چیز مفید است و تجربه ارزشمند کار با آن می تواند مفید باشد.

    10. پتانسیومتر الکترونیکی
    با این چیز کوچک می توانید بر SPI کامل مسلط شوید و سعی کنید تغییرات ولتاژ را از طریق ADC اندازه گیری کنید.

    11. رله
    اگرچه در سطح چشمک زدن LED است، اما شنیدن یک کلیک آشنا خوب است، درست است؟

    12. ترانزیستورهای کلیدی
    همچنین در سطح چشمک زدن LED، اما ناگهان کسی اصل را درک نمی کند.

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

    14. مبدل WIFI-UART (esp8266)
    مبدل به عنوان یک اتصال دهنده در مدار گنجانده شده است؛ در اینجا نیز نشان داده شده است. ماژول esp8266 در حال حاضر کاملاً هیجان انگیز استفاده شده است.

    15. مبدل USB-UART
    USB همیشه جالب است، از تراشه CP2102 استفاده می کند.

    16. JTAG و SWD
    خوب، بدون این چیزها کجا بودیم؟

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

    البته سکسکه‌هایی هم وجود داشت، اما همانطور که یکی از دوستان مهندس می‌گوید، «مهارت یک مهندس در تعداد مسیرهای بریده شده در اولین تکرار برد اندازه‌گیری می‌شود.»

    در اینجا لیستی از "جنگ های" من است، چیزهایی که هنگام توسعه این برد متوجه نشدم، فراموش کردم یا حتی نمی دانستم:

    1. متوجه شدم که پین ​​های SWD به ترتیب عجیبی قرار گرفته اند و حداقل این مشکلی در عملکرد برد ندارد. من به نظر من نظر درستی شنیدم که آنها باید همانطور که در STM32VLDISCOVERY قرار دارند قرار گیرند تا از سوء تفاهم برای کاربر جدید جلوگیری شود.

    2. ارزش اتصال LED های تک رنگ مانند این برد را ندارد، زیرا برای چشمک زدن آنها باید JTAG را مجدداً نقشه برداری کنید، اما نتیجه برای من یک اثر غیرمنتظره بود که نشان دهنده روند بارگیری سیستم عامل است.

    3. من لوگوی خودم را برای این برد توسعه دادم که می خواستم آن را به PCB منتقل کنم و روی برد قرار دهم اما فراموش کردم.

    4. برای صرفه جویی در فضا در ویرایش دوم برد، برخی از اجزای SMD که توسط کاربر استفاده نمی شود را در قسمت پایین برد قرار می دهم.

    5. متوجه شدم که برای سیم کشی راحت تر مدارها با رزوناتورهای کوارتز، جایگزینی آنها با SMD راحت است.

    6. فراموش کردم جایی را که JTAG و SWD هستند امضا کنم، آنها همچنین نحوه اتصال آنها را نشان نمی دهند، و اگر برای JTAG و کانکتور BH-20 آن همه چیز پیچیده نیست، پس با SWD وضعیت تا حدودی خطرناک تر است.

    7. هنگام توسعه ردپای صفحه نمایش LCD، یک حادثه رخ داد و سوراخ ها برای پیچ و مهره های M3 بسیار کوچک بودند.

    8. مبدل CP2102 پین های RX و TX خود را معکوس کرده است. از آنجایی که من به این واقعیت عادت کرده ام که مستندات نمونه ای از اتصال نسبت به میکروکنترلر و نه یک دستگاه خارجی را نشان می دهد، مجبور شدم 2 مسیر را برش دهم.

    9. در این برد فاصله بین شانه های پین بر حسب اینچ استاندارد نشده است؛ بنابراین برای اتصال به تخته نان بدون لحیم با اتصال به آن مشکل ایجاد می شود.

    10. روکش با مقاومت های محدود کننده جریان در مدار نشانگر فعال سازی رله بیرون آمد؛ مقدار برای سوئیچ شدن رله خیلی زیاد بود.

    11. خوب، طبق معمول، "یک فکر خوب بعداً می آید." بنابراین، پس از دریافت برد، متوجه شدم که ارزش آن را دارد که اندازه آن را حداقل برای برخی موارد مناسب کنم - ظاهراً باید در ویرایش دوم اصلاح شود.

    12. در ابتدا یک نشانگر دیجیتال کوچک گذاشته شد، زیرا منطقه زیادی را اشغال نمی کرد و در فروشگاه ها موجود بود، اما معلوم شد که در واقع در هنگام سفارش از 520 قطعه در همه جا موجود است، بنابراین مجبور شدیم یک آداپتور بسازیم. برای یک نشانگر دیجیتال استاندارد

    در نهایت یک مدل سه بعدی از این تخته را به شما نشان می دهم:

    و برای مقایسه عکس آن، چگونه "زنده" شد، از بالا مشاهده کنید:

    و یک نمای جانبی، به طوری که "عصا" بیشتری دیده شود:

    با عرض پوزش، اما من نمی خواهم کل پروژه را قبل از گذراندن دیپلم پست کنم، اما بعد از این کار یک سوال داشتم: آیا این پروژه ارزش توسعه دارد؟ من از ایده نوشتن یک سری مقاله اختصاص داده شده به آموزش شگفت زده شدم، جایی که چنین دوره کاملی در این تابلوی اشکال زدایی ارائه می شود، جایی که همه چیز با کلمات ساده نوشته شده و به راحتی توضیح داده می شود. من می خواهم از شما در نظرات بشنوم که در حال حاضر چقدر مفید و ضروری است.

    با تشکر از توجه شما!

    ST بردهای توسعه ارزان قیمت را برای آشنایی با میکروکنترلرهای آنها به شما می دهد. مطمئناً شما نیز با آنها شروع خواهید کرد - بنابراین من به تابلوهای اصلی Discovery نگاه خواهم کرد تا بتوانید مطابق میل خود انتخاب کنید.

    STM32VLDdiscovery

    اولین برد خانواده قبلاً به سادگی STM32Discovery نامیده می شد. با آن بود که ST گسترش خود را به بازار میکروکنترلرهای همه منظوره ارزان و قدرتمند آغاز کرد، این امر قیمت بسیار پایین آن را توضیح می دهد - قیمت های دامپینگ برای این برد به شکل بسیاری از طرفداران جدید سود ST را به ارمغان آورد.

    پر كردن

    • دیباگر - ST-Link، اتصال SWD به بیرون
    • پردازنده - STM32F100RBT6 (24 مگاهرتز، فلش 128 کیلوبایت، رم 48 کیلوبایت)
    • 2 دکمه - کاربر و تنظیم مجدد
    • 2 عدد ال ای دی
    • کوارتز ساعت قابل تعویض (!).
    • ساعت کوارتز
    • 62 پین روی نوار پین که 51 پایه آن ورودی/خروجی است
    • جامپر برای تعیین مصرف فعلی

    همانطور که می بینید، این یک برد بسیار قدرتمند است. همراه با قیمت پایین (و بسیاری، مانند من، آن را به صورت رایگان در سمینارها دریافت کردند)، یک حس واقعی ایجاد کرد.

    این برد با نمونه های زیادی از استفاده از تجهیزات جانبی مختلف و یک پروژه خوب "Master" که به طور پیش فرض فلش می شود ارائه می شود.

    دانلود نمونه برای STM32VLDiscovery.

    STM32F4Discovery

    برد بسیار قوی هم از نظر قدرت پردازنده و هم از نظر میزان تجهیزات جانبی. پردازنده کلاس STM32F4 دارای سرعت عملکرد بالا، بسیاری از تجهیزات جانبی مانند حافظه / نمایشگر / کنترلرهای دوربین و انواع رابط های USB، CAN و سایر رابط ها و همچنین ماژول های FPU و DSP کامل است. یک پردازنده فوق العاده، تعداد زیادی از دستگاه های من روی آن ساخته شده اند.

    پر كردن

    • پردازنده - STM32F407VGT6 (168 مگاهرتز، 1 مگابایت فلش، 192 کیلوبایت رم)
    • 2 دکمه - کاربر و تنظیم مجدد
    • 4 عدد ال ای دی
    • کریستال ساعت قابل تعویض
    • 100 پین در هر شانه که 80 پایه آن ورودی/خروجی است
    • بلوز اندازه گیری جریان
    • شتاب سنج MEMS LIS302DL
    • میکروفون دیجیتال MP45DT02
    • صوتی ADC CS43L22 با تقویت کننده کلاس D
    • کانکتور میکرو USB

    البته هزینه آن بیشتر است، اما امکانات بسیار بیشتری نیز دارد. برد عالی، راحت و قدرتمند. من عمدتاً از آن برای انجام آزمایش‌هایی با صدا، اتوبوس‌های CAN و USB و شتاب‌سنج استفاده کردم. وجود یک هسته DSP امکان پردازش دیجیتال سیگنال های صوتی و ناوبری را فراهم می کند. علاوه بر تجهیزات جانبی ذکر شده، تراشه همچنین دارای ماژول‌هایی برای محاسبه CRC (جمع‌های چک)، HASH (هش داده‌ها)، CRYPT (رمزنگاری) و RNG (مولد اعداد تصادفی) است.

    فهرست نمونه های پیوست نیز گسترده است. تنها نقطه ضعف این است که میکرو USB خیلی راحت نیست.

    دانلود نمونه برای STM32F4Discovery.

    STM32F3Discovery

    بردی به همان اندازه خوب، اما با پردازنده‌ی جدیدتر سری STM32F3 و تمرکز واضح روی برنامه‌های ناوبری و Sensor Fusion. به نظر می رسد که بر اساس محبوبیت روزافزون کوادکوپترها ساخته شده است که به چنین مجموعه ای از سنسورهای موقعیت نیاز دارند. همچنین ظاهرا مهندسان درخواست های توسعه دهندگان را شنیده و USB را در قالب یک مینی یو اس بی معمولی ساخته اند.

    پر كردن

    • دیباگر - ST-Link/V2 با اتصال SWD توسعه یافته
    • پردازنده - STM32F303VCT6 (72 مگاهرتز، فلاش 256 کیلوبایت، رم 48 کیلوبایت)
    • 2 دکمه - کاربر و تنظیم مجدد
    • 8 عدد ال ای دی
    • 100 پین در هر شانه که 86 پین I/O هستند
    • بلوز اندازه گیری جریان
    • شتاب سنج / مغناطیس سنج MEMS LSM303DLHC
    • ژیروسکوپ MEMS L3GD20
    • کانکتور mini-USB

    به طور پیش فرض، یک نمونه نسبتا جالب نصب شده است - یک قطب نما مغناطیسی که جهت شمال را روی یک دایره LED نشان می دهد.

    به قابلیت های پردازنده، ارزش افزودن ضرب 1 چرخه و تقسیم آهن، ماژول هایی برای محاسبه CRC (جمع های چک)، HASH (هش داده ها)، CRYPT (رمز نگاری) و RNG (مولد اعداد تصادفی)، و همچنین قابلیت های آنالوگ پیشرفته - 4 را دارد. آپ امپ با تقویت ضریب متغیر، افزایش تعداد (4 قطعه) ADC 12 بیتی و 7 مقایسه کننده. این باعث می شود STM32F3 یک DSP واقعی با رابط آنالوگ عالی باشد.

    من همچنین چند دستگاه روی این برد ساختم.

    دانلود نمونه برای STM32F3Discovery.

    STM32F0Discovery

    آخرین برد توسعه بر اساس یک پردازنده جوان از سری STM32F0 است.

    پر كردن

    • دیباگر - ST-Link/V2 با اتصال SWD توسعه یافته
    • پردازنده - STM32F051R8T6 (48 مگاهرتز، فلش 64 کیلوبایت، رم 8 کیلوبایت)
    • 2 دکمه - کاربر و تنظیم مجدد
    • 2 عدد ال ای دی
    • 66 پین روی شانه که 55 پایه آن ورودی/خروجی است
    • بلوز اندازه گیری جریان

    این برد در درجه اول به دلیل هزینه کم و استفاده از پردازنده ای از خانواده پایین رده جالب توجه است. از این گذشته، حتی ضعیف‌ترین پردازنده ST/ARM هنوز چندین برابر قدرتمندتر از AVR و PIC معمولی است و حتی قیمت آن کمتر است. علاوه بر این، ماژول های CRC، مقایسه کننده های آنالوگ و یک کنترل کننده دکمه لمسی وجود دارد.

    دانلود نمونه برای STM32F0Discovery.

    بازدید پست: 118


    سالهاست که رادیو آماتورها از میکروکنترلرهای هشت بیتی خانواده PIC و AVR استفاده می کنند. آنها به دلیل قیمت پایین، مستندات دقیق، سهولت برنامه نویسی و سهولت نصب محبوب هستند. با این حال، اغلب مواردی وجود دارد که قدرت چنین میکروکنترلری برای حل کار کافی نیست. ساده ترین مثال فرکانس متر یا سیگنال مولد روی یک میکروکنترلر است که در آن حداکثر فرکانس اندازه گیری شده یا تولید شده مستقیماً به سرعت پردازش یا خروجی اطلاعات بستگی دارد.

    میکروکنترلرهای هشت بیتی علاوه بر سرعت، محدودیت های دیگری نیز دارند، به عنوان مثال، بسیاری از مدل های AVR تنها دارای یک پورت سریال سخت افزاری هستند که امکان دریافت اطلاعات از دستگاه خارجی و ارسال همزمان نتایج پردازش آن را به مصرف کننده نمی دهد. ناگفته نماند موارد "پیش پا افتاده" مانند نمایش اطلاعات در یک نشانگر گرافیکی که به منابع زیادی از سرعت و حافظه نیاز دارد. پس از تجزیه و تحلیل تعدادی از این محدودیت ها، نویسنده ایده جابجایی به میکروکنترلرهای خانواده STM32 را مطرح کرد.

    به عنوان مثال، دو میکروکنترلر از یک رده قیمتی را در نظر بگیرید - STM32F103C6 و ATmega328P.

    میز 1

    نوع میکروکنترلر

    اندازه پردازنده

    گام سرب، میلی متر

    فرکانس ساعت، مگاهرتز

    حجم حافظه FLASH. کیلوبایت

    مقدار رم، کیلوبایت

    شماره USART

    تعداد تایمر 16 بیتی

    تعداد خطوط ورودی/خروجی

    قیمت تقریبی، مالش.

    پارامترهای مقایسه ای آنها در جدول آورده شده است. 1. نتایج مقایسه حتی تا حدودی تعجب آور است. یک میکروکنترلر 32 بیتی نه تنها تقریباً از همه جهات قدرتمندتر از یک میکروکنترلر هشت بیتی است، بلکه ارزانتر نیز هست. البته لحیم کاری میکروکنترلر با گام پین 0.5 میلی متر در خانه چندان آسان نیست. خوشبختانه، در بیشتر موارد این مورد نیاز نیست - انواع مختلفی از بردهای توسعه با میکروکنترلرهای خانواده STM32 در بازار وجود دارد که برای کاربردهای مختلف کافی است. بیایید با جزئیات بیشتری به آنها نگاه کنیم.

    STM32F4-DISCOVERY

    این برد (نشان داده شده در شکل 1) شاید راحت ترین برد برای مبتدیانی باشد که میکروکنترلرهای STM را مطالعه می کنند. اولاً، مجموعه بزرگی از تجهیزات جانبی دارد. علاوه بر میکروکنترلر، برد شامل یک شتاب سنج میکروالکترومکانیکی، یک میکروفون، یک DAC صوتی، دو کانکتور USB، یک دکمه و چهار LED است.

    پین‌های میکروکنترلر برای نصب کانکتورهای پین در لبه‌های چپ و راست برد، روی پدهای تماسی قرار می‌گیرند که اتصال همه دستگاه‌های خارجی لازم را به آنها آسان می‌کند. میکروکنترلر STM32F407VGT6 نصب شده روی برد دارای پارامترهای بسیار خوبی است: 1 مگابایت حافظه FLASH، 192 کیلوبایت رم و فرکانس کلاک 168 مگاهرتز.

    در نهایت، برد مجهز به یک دیباگر ST-LINK/V2 داخلی است که می‌توان از آن برای اشکال‌زدایی برنامه‌ها نه تنها روی میکروکنترلر روی برد، بلکه در میکروکنترلرهای هم خانواده که روی بردهای دیگر قرار دارند، استفاده کرد. جابجایی به آنها با استفاده از یک بلوز قابل جابجایی و اتصال SWD انجام می شود.

    قیمت تخته حدود 800 روبل است که می توان آن را کاملاً قابل قبول در نظر گرفت.

    برد توسعه STM32F103RBT6

    گزینه جالب بعدی یک برد توسعه با میکروکنترلر STM32F103RBT6 است (شکل 2).

    این تا حدودی ضعیف تر از نصب شده روی برد قبلی است - فرکانس ساعت 72 مگاهرتز، 128 کیلوبایت حافظه FLASH و 20 کیلوبایت رم، اما دستگاه های جانبی بسیار جالب هستند. یک صفحه نمایش لمسی TFT با وضوح 320x240 پیکسل و مورب 2.8 اینچ یک پورت USB داخلی برای تبادل اطلاعات با کامپیوتر، یک اسلات برای کارت حافظه SD، یک ساعت کوارتز 32768 هرتز، یک محفظه برای یک باتری ساعت بلادرنگ و کانکتور ST-LINK برای اشکال زدایی برنامه ها.

    قیمت این برد نیز حدود 800 روبل است، اما لازم به ذکر است که دیباگر داخلی ندارد. برای دانلود برنامه‌ها، باید یک دیباگر ST-LINK جداگانه خریداری کنید یا به جای آن از برد STM32F4-DISCOVERY که در بالا توضیح داده شد استفاده کنید.

    مینی افرا

    شباهت خارجی این برد (شکل 3) با ماژول های معروف آردوینو قابل توجه است. و این تصادفی نیست.

    برد Maple Mini به عنوان جایگزینی برای آردوینو نانو طراحی شده است. زبان برنامه نویسی و محیط توسعه برای خانواده میکروکنترلرهای AVR نصب شده در آردوینو با خانواده STM سازگار شده است. برای اطلاعات دقیق در مورد زبان برنامه نویسی Maple IDE و محیط توسعه به http://leaflabs.com/docs/maple-q uickstart.html بروید.

    برد توسعه دارای یک میکروکنترلر STM32F103CBT6 با فرکانس 72 مگاهرتز، 128 کیلوبایت حافظه FLASH و 20 کیلوبایت رم است که بدون شک از هر ماژول آردوینو بیشتر است. و این که محیط توسعه تقریباً بدون تغییر باقی مانده است، مزیت بیشتری دارد.

    به طور جداگانه، ما متذکر می شویم که با وجود اندازه کوچک، Maple Mini لوازم جانبی بسیار متنوعی را ارائه می دهد: 34 خط ورودی/خروجی، دو کانال رابط SPI و دو کانال I2C، سه پورت سریال. این به آن اجازه می دهد تا با موفقیت در پیشرفت های مختلف آماتور استفاده شود. به لطف اندازه کوچک، Maple Mini را می توان مستقیماً در دستگاه در حال توسعه قرار داد.

    برد اصلی Maple Mini را می توان با قیمت 35 دلار در وب سایت توسعه دهندگان آن خریداری کرد. هزینه ارسال 5 دلار دیگر خواهد بود. یک کپی از برد ساخته شده در چین نیمی از آن قیمت خواهد داشت.

    نرم افزار

    چندین گزینه برای محیط های توسعه وجود دارد که می توان از آنها برای تهیه برنامه های میکروکنترلرهای خانواده STM32 استفاده کرد:

    Commercial IAR Embedded Workbench، AtollicTrueSTUDIO، Keil، و غیره. این محصولات با امکانات کامل بسیار گران هستند، با قیمت مجوز از 1000 یورو شروع می شود، اما نسخه های آزمایشی رایگان با محدودیت در حجم برنامه در حال توسعه نیز وجود دارد. پروژه های ساده آنها کاملاً کافی هستند.

    Eclipse رایگان با کامپایلر ARM-GCC قبل از استفاده نیاز به پیکربندی غیر ضروری کامپایلر دارد. تنها مزیت امروز توانایی کار نه تنها در ویندوز، بلکه در لینوکس است.

    رایگان CooCox IDE (CoIDE) بر اساس همان ویرایشگر Eclipse. برنامه ها را از طریق ST-LINK بارگیری و اشکال زدایی می کند. برخلاف گزینه قبلی، CoIDE نیازی به تنظیمات خاصی ندارد و بلافاصله پس از نصب کار می کند. این گزینه راحت ترین است و ارزش استفاده را دارد.

    بیایید از CooCox IDE برای ایجاد یک برنامه نمونه برای برد STM32F4-DISCOVERY استفاده کنیم که پلک زدن LED کلاسیک اولین برنامه را برای هر میکروکنترلر اجرا می کند. بر روی برد STM32F4-DIS-COVERY چهار عدد LED وجود دارد که به پایه های PD12-PD15 میکروکنترلر متصل می شوند. اجازه دهید آنها را به طور متناوب پلک بزنیم.

    مرحله 1. محیط توسعه CoIDE را راه اندازی کنید و یک پروژه ایجاد کنید. از لیست کشویی نشان داده شده در شکل. 4، میکروکنترلر STM32F407VG را انتخاب کنید.

    مرحله 2. همانطور که در شکل نشان داده شده است. 5، اجزایی را که در پروژه استفاده خواهند شد انتخاب کنید. موارد اصلی عبارتند از GPIO (ورودی-خروجی)، کتابخانه C (توابع اصلی زبان C) و M4 Core (عملکردهای هسته پردازنده). هنگامی که یک مؤلفه را فعال می کنید، CoIDE به طور خودکار فایل های لازم را در پوشه پروژه کپی می کند که بسیار راحت است.

    مرحله 3. وارد کردن متن برنامه. بسیار کوتاه است و در جدول آورده شده است. 2.

    همانطور که می بینید، همه چیز ساده و واضح است. کسانی که برنامه هایی برای میکروکنترلرهای AVR نوشته اند احتمالاً طرح های آشنا را خواهند دید - مقداردهی اولیه پورت ها که جهت (ورودی یا خروجی) را نشان می دهد، حلقه اصلی که در آن اقدامات لازم انجام می شود. به طور کلی، نحو برنامه به طور کامل با زبان C مطابقت دارد، که ادبیات بیش از حد کافی برای آن وجود دارد. همچنین مقالات زیادی در مورد برنامه نویسی STM32 در اینترنت وجود دارد. نمونه های زیادی همراه با برد توسعه عرضه می شوند و می توانند به عنوان نمونه نیز استفاده شوند.

    پس از وارد کردن متن برنامه با کلیک بر روی دکمه صفحه نمایش «دانلود برای فلش»، در میکروکنترلر دانلود می شود. LED های روی برد شروع به چشمک زدن می کنند. به طور جداگانه، شایان ذکر است قابلیت های اشکال زدایی - نقطه شکست را می توان در هر نقطه از برنامه تنظیم کرد، می توانید برنامه را مرحله به مرحله اجرا کنید و مقادیر متغیرها را مشاهده کنید.

    البته این مثال ایده آل نیست. به عنوان مثال، می توانید از وقفه های تایمر برای کنترل چشمک زدن LED ها استفاده کنید که حلقه اصلی برنامه را برای کارهای دیگر آزاد می کند. کسانی که مایلند می توانند به تنهایی به این موضوع پی ببرند.

    نتیجه

    به طور کلی پس از اولین آشنایی، میکروکنترلرهای خانواده STM32 تاثیر بسیار خوشایندی از خود به جای گذاشتند. معلوم شد همه چیز چندان پیچیده نیست و راحتی محیط توسعه، فرآیند اشکال زدایی و تعداد زیادی توابع استاندارد حتی تا حدودی انتقال از Ms DOS به Windows را یادآوری می کند - به نظر می رسد نکات کلی یکسان است، اما همه چیز بسیار راحت تر و کاربردی تر

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

    آیا ارزش تبدیل همه چیز به STM و معماری 32 بیتی را دارد؟ البته که نه. وظایفی وجود دارد که ATtiny برای آنها کاملاً کافی است. اما، به عنوان مثال، برای تجزیه و تحلیل طیف در یک گیرنده SDR خانگی یا دریافت و انتقال مقادیر زیادی از اطلاعات از طریق یک شبکه، استفاده فوری از یک میکروکنترلر قدرتمند بسیار موثرتر است تا با کمبود حافظه یا عملکرد مواجه نشوید. بهبود دستگاه

    اطلاعات کلی

    برد توسعه STM32L-Discovery دارای نمایشگر کریستال مایع (LCD) با شش کاراکتر 14 قسمتی، 4 دو نقطه (Colon)، 4 نقطه (DP)، 4 نوار (Bar) است. همه بخش ها در گروه های COM0، COM1، COM2، COM3 از 24 بخش ترکیب می شوند. هر گروه "سیم مشترک" جداگانه خود را دارد.


    میکروکنترلر STM32L152RBT6 روی برد دیباگ نصب شده است. میکروکنترلر دارای یک کنترلر LCD داخلی است که نشانگرهای LCD تک رنگ را کنترل می کند.
    کنترلر LCD:

    1. به شما امکان می دهد فرکانس به روز رسانی را پیکربندی کنید (نرخ فریم - فرکانس به روز رسانی اطلاعات روی LCD)
    2. پشتیبانی از حالت کنترل استاتیک و چندگانه
    3. از تنظیمات کنتراست نرم افزاری پشتیبانی می کند
    4. اجازه می دهد تا سطوح ولتاژ کنترل چندگانه (حداکثر چهار)
    5. از بافر مضاعف استفاده می کند که به داده های موجود در رجیسترهای LCD_RAM ​​اجازه می دهد در هر زمان در طول اجرای برنامه بدون نقض یکپارچگی اطلاعات نمایش داده شده به روز شوند.

    حافظه کنترل LCD ثبت می شود

    میکروکنترلر STM32L152RB دارای رجیسترهای LCD_RAM ​​ویژه ای است که اطلاعات ذخیره شده در آن مربوط به گروه بخش های COM0 - COM3 است. هر گروه مربوط به دو ثبات 32 بیتی است. این تعداد رجیستر به میکروکنترلر اجازه می دهد تا LCD را با تعداد سگمنت های بیشتری نسبت به قطعات نصب شده بر روی برد دیباگ کنترل کند.

    برای کنترل LCD با 176 سگمنت، از 4 گروه COM0 - COM3 هر کدام 44 قطعه استفاده می شود؛ برای کنترل LCD با 320 سگمنت، از 8 گروه COM0 - COM7 هر کدام 40 قطعه استفاده می شود.



    برد توسعه STM32L-Discovery از یک LCD با 96 بخش استفاده می کند که به 4 گروه COM0 - COM3 از 24 بخش تقسیم می شود.


    ال سی دی روی برد توسعه STM32L-Discovery به گونه ای متصل می شود که بیت های S40، S41 دومین LCD_RAM ​​در هر گروه و بیت های S0-S27 اولین رجیستر LCD_RAM ​​استفاده می شوند. برای کاهش تعداد رجیسترهای استفاده شده، اطلاعات بیت های S40-S43 با استفاده از تابع remapping روی بیت های آزاد S28-S31 نوشته می شود.

    بلوک تقسیم کننده فرکانس

    بلوک تقسیم کننده فرکانس (فرکانس مولد) به شما امکان می دهد به نرخ فریم های مختلف بر روی LCD در محدوده 32 کیلوهرتز تا 1 مگاهرتز دست یابید. موارد زیر را می توان به عنوان منبع سیگنال زمان بندی استفاده کرد:
    1. ژنراتور خارجی فرکانس پایین با فرکانس 32 کیلوهرتز (LSE. خارجی با سرعت پایین)
    2. ژنراتور داخلی با فرکانس پایین با فرکانس 37 کیلوهرتز (LSI. سرعت پایین داخلی)
    3. ژنراتور خارجی RF با تقسیم کننده های فرکانس 2،4،8 و 16 و حداکثر فرکانس 1 مگاهرتز. (HSE. خارجی با سرعت بالا)
    برای دستیابی به همگام سازی دقیق و کاهش افست ولتاژ DC در بخش های LCD، منبع ساعت باید پایدار باشد. سیگنال ساعت LCDCLK به کنترل کننده LCD ارسال می شود. فرکانس سیگنال ساعت بر اساس فاکتورهای تقسیمی که توسط بیت های PS، DIV رجیستر LCD_FCR (ثبت کنترل قاب) تنظیم می شود، تقسیم می شود. فرکانس حاصل در خروجی بلوک تقسیم کننده فرکانس با فرمول محاسبه می شود:

    F ck_div =F LCDCLK / (2 PS * (16+DIV))

    نرخ فریم با استفاده از فرمول محاسبه می شود:

    F Frame =f ck_div *وظیفه

    جایی که وظیفه چرخه وظیفه است - نسبت مدت زمان پالس به دوره آن. در طول یک فریم، اطلاعات از رجیسترهای LCD_RAM[x]، LCD_RAM ​​و غیره به صورت متوالی بر روی LCD نمایش داده می شود. برای یک LCD نصب شده بر روی یک برد توسعه، در یک فریم، کنترلر LCD باید اطلاعات 4 گروه از بخش های COM0 - COM3 را خروجی دهد، بنابراین، مدت زمان پالس کنترل برای یک گروه 1/4 مدت زمان فریم خواهد بود، یعنی. وظیفه = 1/4.

    کنترل LCD

    دو راه برای کنترل LCD وجود دارد - حالت کنترل استاتیک و حالت کنترل چندگانه. با نشانگر استاتیک، هر بخش از بیت نشانگر به خروجی میکروکنترلر متصل می شود. در رابطه با LCD، در برد رفع اشکال STM32LDiscovery، 6 * 14 = 84 پین میکروکنترلر مورد نیاز است (به استثنای دو نقطه، نقطه و راه راه). به دلیل استفاده از چنین تعداد پین، اتصال سایر لوازم جانبی غیرممکن خواهد شد. میکروکنترلر STM32L152RB دارای 64 پین است. در حالت کنترل چندگانه (حالت کنترل پویا)، بخش های یکسان ارقام نشانگر در گروه ها ترکیب می شوند. اطلاعات به دلیل روشن شدن متناوب بخش هایی از ارقام نشانگر، با فرکانس غیر قابل درک برای چشم انسان نمایش داده می شود.

    کنترل Multiplex به شما امکان می دهد تعداد زیادی از بخش ها را کنترل کنید. به جای کنترل جداگانه هر عنصر، می توان آنها را با ردیف ها و ستون ها (COM و SEG) آدرس داد، بنابراین مدار کنترل را ساده می کند، زیرا هر بخش به خط کنترل خود نیاز ندارد. برای روشن کردن بخش انتخاب شده، باید اختلاف پتانسیل COM و SEG روی آن اعمال شود. نمونه ای از عملکرد اولین رقم نشانگر (نشانگر "1:" را نشان می دهد):


    اولین رقم نشانگر در زمان t 0


    اولین رقم نشانگر در زمان t 1


    اولین رقم نشانگر در زمان t 2


    نمودار کلی اتصال قطعات به پین ​​های LCD


    نمودار اتصال پین های LCD به پورت های میکروکنترلر

    برای خطوط SEG از یک ولتاژ کنترل استفاده می شود که تعداد سطوح آن توسط ضریب بایاس تعیین می شود. LCD روی برد توسعه از حالت کنترل مالتی پلکس با وظیفه=1/4 و بایاس=1/3 استفاده می کند. مقادیر وظیفه و بایاس از طریق رجیستر LCD_CR (Control Register) در بیت‌های DUTY و BIAS تنظیم می‌شوند.

    تمرین

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

    برای کنترل LCD، پورت های میکروکنترلر باید بر اساس آن پیکربندی شوند:
    1. به سمت خروجی
    2. استفاده از عملکرد جایگزین AF 11
    3. دارای فرکانس های خروجی به پورت 400 کیلوهرتز
    4. از حالت عملکرد فشار کش استفاده کنید
    5. بدون مقاومت کششی
    هنگامی که پورت در حالت عملکرد متناوب کار می کند، بافر داده خروجی پورت توسط سیگنال هایی که از دستگاه جانبی می آیند کنترل می شود. فایل هدر stm32lxx.h کتابخانه CMSIS شامل توضیحاتی از تمام ثبات های جانبی و همچنین ساختار دسترسی به آنها می باشد.

    پین های LCD به پورت های GPIOA (PA1-PA3، PA8-PA10، PA15)، GPIOB (PB3-PB5، PB8-PB15)، GPIOC (PC0-PC3،PC6-PC11) میکروکنترلر متصل می شوند. برای اینکه LCD کار کند، باید یک سیگنال ساعت به پورت های انتخاب شده ارسال شود. درگاه‌های GPIO میکروکنترلر از گذرگاه AHB سیستم RCC (تنظیم مجدد و کنترل ساعت) - یک سیستم ساعت و تنظیم مجدد کلاک می‌شوند. سیگنال ساعت با تنظیم بیت های مربوطه در رجیستر RCC_AHBENR (ثبت فعال کننده ساعت محیطی AHB) تامین می شود.

    ثبت RCC_AHBENR (شکل 15 بیت اول را نشان می دهد)

    برای پورت های GPIOA، GPIOB، GPIOC، باید 1 تا 0، 1، 2 بیت از رجیستر را تنظیم کنید.

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

    RCC->AHBENR |=(RCC_AHBENR_GPIOAEN|RCC_AHBENR_GPIOBEN|RCC_AHBENR_GPIOCEN); یا RCC->AHBENR = 0x7; /* 0x7=111 */

    برای نشان دادن حالت های عملکرد پورت، از ثبات GPIOx_MODER (رجیستر حالت پورت GPIO) (x = A..H) استفاده می شود. همه بیت های ثبات در گروه های MODERy گروه بندی می شوند که y شماره پین ​​پورت مربوطه است. پورت ها باید برای حالت عملکرد جایگزین پیکربندی شوند، به عنوان مثال. در گروه مسئول پین، مقدار را روی 10 قرار دهید. برای پورت GPIOA، باید پین های 1-3،8-10،15 را پیکربندی کنید، یعنی 1 را روی 3،5،7،17،19 تنظیم کنید، 21،31 رقم.


    ثبت GPIOx_MODER (ثبت حالت پورت GPIO)

    GPIOA->MODER |= (GPIO_MODER_MODER1_1 | GPIO_MODER_MODER2_1 | GPIO_MODER_MODER3_1 | GPIO_MODER_MODER8_1 | GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1 | MODER10_1 | GPIO_5MODER_); یا GPIOA->MODER = 0x802A00A8; /* 0x802A00A8=1000 0000 0010 1010 0000 0000 1010 1000 */
    پورت های میکروکنترلر باید به حالت فشار کش تغییر داده شوند. برای انجام این کار، باید 1 را در رجیستر GPIOx_OTYPER (رجیستر نوع خروجی پورت GPIO) در بیت های مسئول پین ها تنظیم کنید.


    ثبت نام GPIOx_OTYPER (رجیستر نوع خروجی پورت GPIO)

    GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_1 | GPIO_OTYPER_OT_2 | GPIO_OTYPER_OT_3 | GPIO_OTYPER_OT_8 | GPIO_OTYPER_OT_9 | GPIO_OTYPER_OT_10 | GPIO_OTYPER_OT); یا GPIOA->OTYPER &= ~0x0000870E; /* 0x870E=1000 0111 0000 1110 */
    هر دو گزینه روی پین های انتخاب شده تاثیر می گذارند. (برای پورت GPIOA، پین‌های 1-3.8-10.15 پیکربندی شده‌اند). اگر نیاز دارید که تمام پین‌های پورت را به حالت push-pull تغییر دهید، می‌توانید مقدار زیر را در رجیستر بنویسید:
    GPIOA->OTYPER = 0x0;
    برای تعیین فرکانس خروجی اطلاعات به پورت، از رجیستر GPIOx_OSPEEDR (رجیستر سرعت خروجی پورت GPIO) استفاده می شود. همه بیت های ثبات در گروه های OSPEEDRy گروه بندی می شوند که y شماره پین ​​پورت مربوطه است. در این کار فرکانس باید روی 400 کیلوهرتز تنظیم شود. در گروه مسئول پین، مقدار را روی 00 قرار دهید.


    ثبت نام GPIOx_OSPEEDR (ثبت سرعت خروجی پورت GPIO)

    GPIOA->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR1 | GPIO_OSPEEDER_OSPEEDR2 | GPIO_OSPEEDER_OSPEEDR3 | GPIO_OSPEEDER_OSPEEDR8 | GPIO_OSPEEDER_OSPEEDR9 | GPIO_OSPEEDER_OSPEEDR9 | GPIO_OSPEEDER_OSPEEDR1 | GPIO_OSPEEDER_OSPEEDR1 یا GPIOA->OSPEEDR &= ~0xC03F00FC; /*0xC03F00FC=1100 0000 0011 1111 0000 0000 1111 1100 */
    اگر لازم است فرکانس خروجی را برای همه پین ​​ها روی پورت 400 کیلوهرتز تنظیم کنید، می توانید مقدار را در ثبات بنویسید:
    GPIOA->OSPEEDR = 0x0;
    برای غیرفعال کردن مقاومت های pull-up و pull-down برای پین های انتخاب شده، از ثبات GPIOx_PUPDR (رجیستر pullup/pull-down پورت GPIO) استفاده کنید. همه بیت های ثبات در گروه های PUDRy گروه بندی می شوند، جایی که y شماره پین ​​پورت مربوطه است. برای غیرفعال کردن مقاومت های pull-up در گروه مسئول پین، مقدار را روی 00 قرار دهید.


    ثبت GPIOx_PUPDR (ثبت بالا و پایین درگاه GPIO)

    GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR1 | GPIO_PUPDR_PUPDR2 | GPIO_PUPDR_PUPDR3 | GPIO_PUPDR_PUPDR8 | GPIO_PUPDR_PUPDR9 | GPIO_PUPDR_PUPDR10 | GPIO_PUPDR_PUPDR15 | GPIO_PUPDR10); یا GPIOA->PUPDR &= ~0xC03F00FC; /*0xC03F00FC=1100 0000 0011 1111 0000 0000 1111 1100 */
    اگر نیاز به غیرفعال کردن مقاومت های pull-up برای همه پین ​​ها دارید، می توانید مقدار را در ثبات بنویسید:
    GPIOA->PUPDR = 0x0;
    برای استفاده از یک تابع جایگزین برای پورت‌های میکروکنترلر، دو رجیستر GPIOx_AFRL (ثبت پایین تابع جایگزین GPIO)، مسئول پین‌های پایین (0 تا 7) و GPIOx_AFRH (رجیستر بالای عملکرد جایگزین GPIO) که مسئول پین‌های بالا (8 تا 15) هستند. )، استفاده می شود. همه بیت های ثبات در گروه های AFRLy و AFRHy گروه بندی می شوند که y شماره پین ​​پورت مربوطه است. پورت ها باید به گونه ای پیکربندی شوند که از عملکرد جایگزین AF11 استفاده کنند، برای این کار گروه مسئول پین باید روی 1011 تنظیم شود.


    ثبت نام GPIOx_AFRL (ثبت پایین تابع جایگزین GPIO)


    ثبت GPIOx_AFRH (ثبت بالا تابع جایگزین GPIO)

    برای انجام این کار، باید مقادیر زیر را در رجیسترها بنویسید:
    GPIOA->AFR = 0xBBB0; /* 0xBBB0 = 1011 1011 1011 0000*/ GPIOA->AFR = 0xB0000BBB؛ /* 0xB0000BBB=1011 0000 0000 0000 0000 1011 1011 1011*/

    AFR = 0xBBB0 - یک مقدار را در ثبات GPIOx_AFRL می نویسد.
    AFR = 0xB0000BBB - یک مقدار را در ثبات GPIOx_AFRH می نویسد.

    تنظیمات برای پین های مربوط به پورت های GPIOB و GPIOC به همین ترتیب انجام می شود.

    راه اندازی کنترلر LCD

    هنگام کار با یک کنترلر LCD، مانند سایر تجهیزات جانبی، باید یک سیگنال ساعت به آن ارائه شود. سیگنال ساعت نیز به سیستم مدیریت توان عرضه می شود. کنترلر و سیستم مدیریت توان از گذرگاه APB1 برای کلاک استفاده می کنند. برای فعال کردن کلاک در رجیستر RCC_APB1ENR (رجیستر فعال کننده ساعت جانبی APB1)، باید 1 در بیت های 9 و 28 را تنظیم کنید.


    ثبت RCC_APB1ENR (ساعت محیطی APB1 ثبت را فعال می کند)

    RCC->APB1ENR |= RCC_APB1ENR_PWREN|RCC_APB1ENR_LCDEN; یا RCC->APB1ENR |= 0x10000200; /* 0x10000200=1 0000 0000 0000 0000 0010 0000 0000 */
    برای کارکرد کنترلر LCD، باید منبع سیگنال های ساعت را مشخص کنید. منبع در رجیستر RCC_CSR مشخص شده است. به طور پیش فرض، نوشتن در این رجیستر غیرفعال است. حفاظت از نوشتن در رجیستر RCC_CSR در رجیستر کنترل توان PWR_CR حذف می شود. رجیستر RCC_CSR منابع ساعت کنترلر RTC و LCD را کنترل می کند
    نوشتن در رجیستر RCC_CSR با تنظیم بیت 8 رجیستر PWR_CR روی 1 فعال می شود.


    ثبت PWR_CR (رجیستر کنترل توان PWR)

    PWR->CR |= PWR_CR_DBP; یا PWR->CR |= 0x100; /* 0x100 =1 0000 0000 */
    برای تغییر منبع ساعت کنترلر LCD (و همچنین ساعت RTC)، ابتدا باید منبع ساعت را با تنظیم بیت RTCRST (تنظیم 1 به بیت 23) در ثبات RCC_CSR (ثبت کنترل/وضعیت) تنظیم مجدد کنید.


    ثبت RCC_CSR (ثبت کنترل/وضعیت)

    RCC->CSR |= RCC_CSR_RTCRST;
    یا با نوشتن یک مقدار در یک ثبات با استفاده از عملگر “|=”، زیرا ارزش توسط
    ثبات پیش فرض با 0x0 متفاوت است:
    RCC->CSR |= 0x800000; /* 0x800000 = 1000 0000 0000 0000 0000 0000 */
    برای انتخاب یک منبع ساعت جدید، باید بیت RTCRST را حذف کنید:
    RCC->CSR &= ~RCC_CSR_RTCRST; یا RCC->CSR &= ~0x800000;
    یک ژنراتور خارجی با فرکانس پایین به عنوان منبع سیگنال ساعت انتخاب می شود. برای روشن کردن ژنراتور در رجیستر RCC_CSR، باید بیت LSEON را تنظیم کنید (تنظیم 1 تا 8 بیت):
    RCC->CSR |= RCC_CSR_LSEON; یا RCC->CSR |= 0x100; /* 0x100 = 1 0000 0000 */
    پس از روشن کردن ژنراتور، مدتی طول می کشد تا آن را تثبیت کند. آمادگی ژنراتور با تنظیم سخت افزار بیت LSERDY در ثبات RCC_CSR بررسی می شود:
    while(!(RCC->CSR&RCC_CSR_LSERDY));
    انتخاب یک ژنراتور خارجی با فرکانس پایین به عنوان منبع ساعت با تنظیم رجیستر RCC_CSR روی 01 در گروه RTCSEL انجام می شود:
    RCC->CSR |= RCC_CSR_RTCSEL_LSE; یا RCC->CSR |= 0x10000; /* 0x10000 = 01 0000 0000 0000 0000 */
    باید حالت بایاس مورد نظر را در کنترلر LCD تنظیم کنید. برای انجام این کار، در رجیستر LCD_CR (رجیستر کنترل LCD) باید مقدار 10 را در گروه BIAS تنظیم کنید. قبل از نصب بیت ها، لازم است بیت ها را از "زباله" پاک کنید.


    ثبت LCD_CR (رجیستر کنترل LCD)

    بازنشانی بیت ها:
    LCD->CR &= ~LCD_CR_BIAS; یا LCD->CR &= ~0x60;
    انتخاب حالت تعصب=1/3 با استفاده از بیت ماسک:
    LCD->CR |= LCD_CR_BIAS_1; یا LCD->CR |= 0x40;
    حالت وظیفه = 1/4 را تنظیم کنید. برای انجام این کار، ابتدا همه بیت ها را بازنشانی می کنیم:
    LCD->CR &=~LCD_CR_DUTY; یا LCD->CR &= ~0x1C;
    مقدار 011 را روی گروه DUTY از رجیستر LCD_CR برای تنظیم کنید
    وظیفه حالت = 1/4:
    LCD->CR |= LCD_CR_DUTY_0|LCD_CR_DUTY_1; یا LCD->CR |= 0xС;
    ما تابع تخصیص مجدد پین را فعال می کنیم. برای انجام این کار، 1 تا 7 بیت از رجیستر LCD_CR را تنظیم کنید:
    LCD->CR |= LCD_CR_MUX_SEG; یا LCD->CR |= 0x80;
    ما مقادیر ضرایب تقسیم فرکانس سیگنال ساعت LCDCLK را تنظیم می کنیم. مقادیر ضرایب در رجیستر LCD_FCR (رجیستر کنترل قاب LCD) تنظیم می شود. ابتدا تمام بیت ها را نیز پاک می کنیم سپس موارد لازم را تنظیم می کنیم.


    ثبت LCD_FCR (رجیستر کنترل قاب LCD)

    LCD->FCR &= ~LCD_FCR_PS; LCD->FCR &= ~LCD_FCR_DIV; یا LCD->FCR &= ~0x3C00000; LCD->FCR &= ~0x3C0000;
    مقادیر ضرایب تقسیم فرکانس سیگنال ساعت برابر با ck_ps = LCDCLK/16، ck_div = ck_ps/17 تنظیم شده است. برای این کار 1 را به 24 و 18 رقم تنظیم کنید:
    LCD->FCR |= 0x1040000; /*0x1040000 = 1 0000 0100 0000 0000 0000 0000*/
    برای تنظیم سطح کنتراست مورد نظر، باید مقدار 010 را در گروه CC تنظیم کنید، همچنین ابتدا بیت ها را از مقادیر قدیمی پاک کنید:
    LCD->FCR &= ~LCD_FCR_CC; LCD->FCR |= LCD_FCR_CC_1; یا LCD->FCR &= ~0x1C00; LCD->FCR |= 0x800; /*0x800 = 1000 0000 0000*/
    پس از تنظیم تمام مقادیر، همگام سازی رجیستر LCD_FCR کمی طول می کشد. همگام سازی رجیستر با تنظیم بیت FCRSF در سخت افزار در رجیستر LCD_SR (ثبت وضعیت LCD) بررسی می شود.

    ثبت LCD_SR (ثبت وضعیت LCD)

    while(!(LCD->SR&LCD_SR_FCRSR));
    به عنوان منبع ولتاژ برای LCD، یک مبدل داخلی افزایش دهنده را انتخاب می کنیم تا ال سی دی V را تشکیل دهد. برای انجام این کار، اولین بیت رجیستر LCD_CR (رجیستر کنترل LCD) روی 0 تنظیم می شود:
    LCD->CR &= ~LCD_CR_VSEL; یا LCD->CR &= ~0x2;
    با تنظیم بیت رجیستر LCD_CR (رجیستر کنترل LCD) روی 0، عملکرد کنترل کننده LCD فعال می شود:
    LCD->CR |= LCD_CR_LCDEN; یا LCD->CR |= 0x1;
    پس از نصب مبدل افزایش دهنده داخلی به عنوان منبع ولتاژ، باید منتظر بمانید تا آماده شود. آمادگی با تنظیم سخت افزار بیت RDY در رجیستر LCD_SR (ثبت وضعیت LCD) بررسی می شود:
    while(!(LCD->SR&LCD_SR_RDY));
    پس از اجازه دادن به کنترلر LCD، باید منتظر بمانید تا آماده شود. آمادگی با تنظیم سخت افزار بیت ENS در رجیستر LCD_SR (ثبت وضعیت LCD) بررسی می شود:
    while(!(LCD->SR&LCD_SR_ENS));

    تشکیل تصویر بر روی LCD

    تمام بخش های نشانگر در گروه های COM0 - COM3 با 24 بخش (SEG0-SEG23) ترکیب می شوند. اطلاعات مربوط به بخش ها در رجیسترهای LCD_RAM ​​حافظه کنترل کننده LCD ذخیره می شود. چیدمان PCB به گونه ای است که اعداد بخش با اعداد رقمی رجیسترهای LCD_RAM ​​مطابقت ندارد.

    برای نمایش 1 در اولین رقم LCD، باید بخش های 1B، 1C را روشن کنید. بخش 1B متعلق به گروه COM0 و بخش 1C متعلق به گروه COM1 است. بنابراین، اطلاعات مربوط به آنها باید به ترتیب در رجیسترهای RAM (LCD_RAM0)، RAM (LCD_RAM2) نوشته شود. بخش 1B مسئول خروجی LCD LCDSEG22 است که اطلاعات مربوط به آن در بیت SEG40 رجیستر RAM (LCD_RAM1) ذخیره می شود. با استفاده از تابع نگاشت مجدد، قطعه LCDSEG22 به بیت SEG28 رجیستر RAM (LCD_RAM0) اختصاص داده می شود. بخش 1C مسئول خروجی LCD LCDSEG1 است که اطلاعات مربوط به آن در بیت SEG1 رجیستر RAM (LCD_RAM2) ذخیره می شود.

    LCD-> RAM = 0x10000000; /*0x10000000 = 1 0000 0000 0000 0000 0000 0000 0000 */ LCD->RAM = 0x2; /*0x2= 10 */
    قبل از نوشتن مقادیر در رجیسترهای حافظه، باید بررسی کنید که آیا انتقال داده قبلی به LCD انجام شده است یا خیر. برای انجام این کار، بیت UDR (درخواست نمایش به‌روزرسانی) رجیستر LCD_SR (ثبت‌کننده وضعیت LCD) بررسی می‌شود. کنترلر LCD دارای دو بافر خروجی است که اطلاعات وارد بافر اول و خروجی از بافر دوم به LCD می شود. بیت UDR در هنگام انتقال از بافر اول به بافر دوم تنظیم می شود و از ثبت کننده های LCD_RAM ​​در برابر نوشتن محافظت می کند:
    while(LCD->SR & LCD_SR_UDR);
    پس از نوشتن اطلاعات در رجیسترهای LCD_RAM، باید بیت UDR را در رجیستر LCD_SR (رجیستر وضعیت LCD) تنظیم کنید (تنظیم 1 تا 2 بیت):
    LCD->SR |= LCD_SR_UDR; یا LCD->SR |= 0x4; /*0x4 = 100 */