Telegram Group Search
این کانال مرتبط با سایت آرملینکس (armlinx.com) ایجاد شده است، و فیلم‌های آموزشی و سورس کدها در اینجا آپلود می‌شود.

🆔 @armlinx
Media is too big
VIEW IN TELEGRAM
🆔 @armlinx

آموزش STM32 با توابع LL قسمت اول: پردازنده‌های ARM

✍️ نویسنده: کامین جلیلی

🧐 مقاله را به صورت کامل در سایت آرملینکس بخوانید👇👇👇

🌎 http://bit.ly/STM32_LL_1
Media is too big
VIEW IN TELEGRAM
🆔 @armlinx

آموزش STM32 با توابع LL قسمت دوم: روش‌های پیکره‌بندی و انواع توابع


✍️ نویسنده: کامین جلیلی

🧐 مقاله را به صورت کامل در سایت آرملینکس بخوانید👇👇👇

🌎 http://bit.ly/STM32_LL_2
با کدام توابع، میکروکنترلرهای STM32 را پیکره‌بندی کنیم؟

❇️ به صورت کلی برای پیکره‌بندی میکروکنترلرهای STM32، چهار روش زیر وجود دارد:

استفاده مستقیم از Register
توابع (LL(Low Layer
توابع (HAL(Hardware Abstraction Layer
توابع (SPL(Standard peripheral libraries

🔹 استفاده مستقیم از Register
در این نوع پیکره‌بندی هیچ تابعی وجود ندارد و ما فقط از همان ساختارها و اسامی‌ای که شرکت سازنده در اختیارمان قرار داده است استفاده می‌کنیم و در اصل تنها در رجیسترها مقادیر 0 یا 1 منطقی را قرار می‌دهیم.
به عنوان یک مثال ساده، در این روش اگر قرار باشد در یک رجیستر 32 بیتی مقداری را بنویسیم از یک ماکرو استفاده می‌کنیم و فقط یک عبارت مانند عبارت “LL_GPIO_PIN_1” را در رجیستر قرار می‌دهیم.

🔹 توابع (LL(Low Layer
در این روش دیگر به صورت مستقیم با رجیسترها کار نخواهیم کرد و فقط از توابعی به نام توابع LL استفاده خواهیم کرد که خود این توابع با توجه به آرگومان‌های ورودی‌شان، رجیسترها را مقداردهی می‌کنند. با فراخوانی هر کدام از این توابع عملا بخشی از یک واحد جانبی راه‌اندازی می‌شود.
برای اینکه یک واحد جانبی به طور کامل راه‌اندازی شود باید با یک توالی خاص از چندین توابع LL استفاده کنیم.

🔹 توابع (HAL(Hardware Abstraction Layer
در این نوع توابع که در بالاترین سطح ممکن است، با سطح رجیستر خیلی فاصله داریم و عملا به ندرت از رجیسترها استفاده می‌کنیم، اگرچه دسترسی به رجیسترها در این سطح بدون هیچ مشکلی ممکن است و با استفاده از ماکروهایی می‌توانیم به رجیسترها دسترسی داشته باشیم.
وقتی که از یک تابع HAL استفاده می‌کنیم علاوه بر اینکه خودش رجیسترهای یک بخش را تنظیم می‌کند، در اکثر موارد بسیاری از کارهایی که در توابع LL باید خود کاربر انجام می‌داد را نیز انجام می‌دهد.

🔹توابع (SPL(Standard peripheral libraries
توابع SPL در سطح میانی قرار دارند و می‌توان گفت سطحی بین LL و HAL را دارا هستند. البته این توابع دیگر به‌روزرسانی نمی‌شوند و بهتر است که شما هم از این توابع استفاده نکنید.

❇️ در این پست با انواع توابع و روش‌های مختلف برای پیکره‌بندی میکروکنترلرهای STM32 آشنا شدید. در پست بعد این توابع را با هم مقایسه می‌کنیم، از مزایا و معایب هر کدام از این توابع خواهیم گفت و در نهایت با ذکر دلایل منطقی، بهترین روش برای یادگیری میکروکنترلرهای STM32 در ابتدای مسیر را معرفی خواهیم کرد.

🆔 @armlinx
❗️ بهترین روش، برای برنامه‌نویسی میکروکنترلرهای STM32!

❇️ نه
تنها در برنامه‌نویسی میکروکنترلرهای STM32، بلکه در هر جای دیگری، بهترین روش وجود ندارد.

❇️ در واقع آن چیزی که بهترین روش و بهترین ابزار را تعیین می‌کند، هدف از آن کار است، یعنی چه؟

یعنی اینکه ما ابتدا هدف از آن کاری که می‌خواهیم انجام بدهیم را تعیین، و در راستای آن هدف، ابزارها را انتخاب می‌کنیم.

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

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

🔹 اجازه بدهید ابتدا یک مثال خیلی ساده و ملموس از تجربه‌ای که خودم با توابع مختلف داشتم را بیان بکنم، تا تفاوت بین توابع و روش‌های مختلف را بهتر متوجه بشوید.

🔹 فرض کنید می‌خواهیم رشته‌ی “Armlinx” را بر روی پورت سریال بفرستیم.

🔹 در توابع LL پس از اینکه تنظیمات اولیه پورت سریال را انجام دادیم و همچنین آن را فعال کردیم ابتدا باید کارکتر ‘A’ از این رشته را بر روی پورت سریال قرار بدهیم و منتظر بمانیم که آیا ارسال به اتمام رسیده است یا خیر، و اگر ارسال انجام شد کارکتر ‘r’ و سپس تکرار همین روند تا آخرین کارکتر.

🔹 اما وقتی با توابع HAL کار می‌کنیم پس از اینکه تنظیمات اولیه را انجام دادیم و پورت را فعال کردیم، تمام رشته‌ی “Armlinx” را در ورودی تابع مربوطه قرار می‌دهیم و خود تابع تمامی کارهایی که در توابع LL لازم بود خودمان انجام بدهیم را با زمان‌بندی مناسب برای ما انجام می‌دهد.

🔹 جالب است بدانید که توابع HAL به قدری همه چیز را آماده کرده‌اند که اگر به خوبی آن‌ها را بررسی کنید، می‌بینید که در بعضی موارد اگر شما سهوا یا از روی ندانستن اشتباهی انجام داده باشید، آن اشتباه را اگر ممکن باشد و تشخیص بدهد، برایتان تصحیح می‌کند.

🔹 همانطور که در این مثال دیدید توابع HAL تنها با یک تابع کنترل کار را به دست گرفته و تمامی کارها را خودشان انجام می‌دهد. با یک دید منطقی متوجه می‌شویم که این کار با هدف آموزشی ما مغایرت دارد و استفاده از توابع HAL ما را از شناخت مفاهیم عمیقی که باید از میکروکنترلر بدست بیاوریم دور می‌کند.

🔹 اما بر خلاف توابع HAL، در کار با توابع LL، چون باید خودمان مراحل را با یک ترتیب خاص انجام دهیم و کنترل کار را به دست بگیریم، به همین جهت دید خوبی نسبت به لایه‌های سخت‌افزرای میکروکنترلر به ما می‌دهند و همان مفاهیم عمیقی که مد نظر ما بودند را به خوبی به دست خواهیم آورد.

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

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

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

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

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

🔹حال که توابع مختلف را بررسی کردیم و از مزایا و معایب‌شان گفتیم وقت آن است که بهترین روش را برای کار خودمان انتخاب و در ادامه با این نوع توابع برنامه‌نویسی بکنیم.

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

❇️ پس تا اینجا به خوبی متوجه شدید که برای اهداف آموزشی چرا در ابتدا باید از توابع LL استفاده بکنیم. در پست‌های بعدی بیشتر در رابطه با جزئیات توابع LL صحبت خواهیم کرد و از دلایل مهمی که باعث می‌شوند این توابع سرعت بالایی داشته باشند خواهیم گفت تا شما به اهمیت ویژه‌ای که این توابع دارند پی ببرید.

🆔 @armlinx
🔰 سیزده قسمت از مجموعه‌ی "آموزش STM32 با توابع LL" در سایت آرملینکس منتشر شد.

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

اما ما در این مدت بیکار نبودیم و علاوه بر دو قسمتی که همراه با ویدئو در کانال منتشر شد، یازده قسمت دیگر از این مجموعه آموزشی را تدوین و در سایت منتشر کردیم.

همچنین در ایام نوروز، هشت ویدئوی دیگر ضبط شد که متاسفانه این ویدئوها قبل از اینکه ویرایش بشوند، با مشکلاتی که برای ویندوز به وجود آمد دیگر قابل اجرا نبودند.

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

❇️ برای هر قسمت از این مقالات چندین روز زمان و زحمات زیادی صرف شده است، با معرفی این مقالات به دوستان الکترونیکی خود، ما را در ادامه‌ی این مسیر حمایت خواهید کرد.

❇️ پس با حمایت‌های شما در چند قسمت دیگر این مجموعه را تا حد قابل قبولی به پایان می‌رسانیم و یک مجموعه جدید برای FPGA را شروع خواهیم کرد.

🔰 در ادامه لینک مربوط به سیزده قسمت از این مجموعه آموزشی برای مطالعه قرار داده شده است. برای دسترسی به مقالات، بر روی لینک زیر کلیک کنید:

🌎 آموزش STM32 با توابع LL

🆔 @armlinx
از قسمت پنجم به بعدِ مجموعه‌ی "آموزش STM32 با توابع LL" شروع به راه‌اندازی واحدهای جانبی میکروکنترلر کردیم و کدهای مربوطه به صورت تکست در مقالات سایت آورده شده است. اما بنا به درخواست دوستان، در ادامه فایل‌ها و مستندات پروژه را نیز به صورت کامل برای دانلود قرار می‌دهیم.

🆔 @armlinx
LL_VS_HAL_Output.rar
689.9 KB
🆔 @armlinx

کدهای مربوط به قسمت پنجم

🧐 مقاله را به صورت کامل در سایت آرملینکس بخوانید 👇👇👇

🌎 آموزش STM32 با توابع LL قسمت پنجم: GPIO-Output
GPIO-Input.rar
295.5 KB
🆔 @armlinx

کدهای مربوط به قسمت ششم

🧐 مقاله را به صورت کامل در سایت آرملینکس بخوانید 👇👇👇

🌎 آموزش STM32 با توابع LL قسمت ششم: GPIO-Input
External_Interrupt.rar
289.8 KB
🆔 @armlinx

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

🧐 مقاله را به صورت کامل در سایت آرملینکس بخوانید 👇👇👇

🌎 آموزش STM32 با توابع LL قسمت هفتم: Interrupt
UART-Transmit.rar
5.1 MB
🆔 @armlinx

کدهای مربوط به قسمت هشتم

🧐 مقاله را به صورت کامل در سایت آرملینکس بخوانید 👇👇👇

🌎 آموزش STM32 با توابع LL قسمت هشتم: UART-Transmit
UART-Receive_IT.rar
308.3 KB
🆔 @armlinx

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

🧐 مقاله را به صورت کامل در سایت آرملینکس بخوانید 👇👇👇

🌎 آموزش STM32 با توابع LL قسمت نهم: UART-Receive
ADC.rar
8.1 MB
🆔 @armlinx

کدهای مربوط به قسمت دهم

🧐 مقاله را به صورت کامل در سایت آرملینکس بخوانید 👇👇👇

🌎 آموزش STM32 با توابع LL قسمت دهم: مبدل آنالوگ به دیجیتال (ADC)
DAC.rar
728.8 KB
🆔 @armlinx

کدهای مربوط به قسمت یازدهم

🧐 مقاله را به صورت کامل در سایت آرملینکس بخوانید 👇👇👇

🌎 آموزش STM32 با توابع LL قسمت یازدهم: مبدل دیجیتال به آنالوگ (DAC)
TIM_TimeBase.rar
8.1 MB
🆔 @armlinx

کدهای مربوط به قسمت دوازدهم

🧐 مقاله را به صورت کامل در سایت آرملینکس بخوانید 👇👇👇

🌎 آموزش STM32 با توابع LL قسمت دوازدهم: Timer-TimeBase
TIM_InputCapture.rar
382.7 KB
🆔 @armlinx

کدهای مربوط به قسمت سیزدهم

🧐 مقاله را به صورت کامل در سایت آرملینکس بخوانید 👇👇👇

🌎 آموزش STM32 با توابع LL قسمت سیزدهم: Timer-Input capture
تصور شما از نحوه‌ی اجرای توابع در زبان‌های برنامه‌نویسی چیست؟

توجه داشته باشید که در این پست آموزشی قصد نداریم به بررسی توابع LL یا توابع HAL، که در پست‌های قبلی بررسی کردیم بپردازیم، بلکه می‌خواهیم نحوه‌ی اجرای توابعی که توسط خود کاربر تعریف می‌شوند را در یک زبان برنامه‌نویسی، مثل زبان C بررسی کنیم.

ابتدا بیایید با نحوه‌ی تعریف و اجرای یک تابع در زبان C آشنا بشویم. فرض کنید ما می‌خواهیم در جاهای مختلفی از برنامه، یک سری عملیات مشخص را بر روی چندین متغیر اعمال کنیم. در این مواقع بهتر است یک تابع که آن عملیات مشخص را انجام می‌دهد، تعریف کنیم و هر جا نیاز به اجرای این عملیات مشخص داشتیم، تنها کافی است تا تابع تعریف شده را فراخوانی کنیم.

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

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

البته روش دوم جز ملزومات و استانداردهای یک زبان برنامه‌نویسی نیست و جز امکانات کامپایلر محسوب می‌شود. از همین جهت هم برای شناخت آن باید به امکانات و ویژگی‌های کامپایلرها مراجعه کرد نه زبان برنامه‌نویسی.

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

به روش اول توابع نرمال (Normal) و به روش دوم توابع اینلاین (Inline) می‌گویند. احتمالا حدس زدید که توابع Inline سرعت بیشتری دارند چون عمل پرش اتفاق نمی‌افتد، اما حجم برنامه در این توابع بیشتر است چون با هر بار فراخوانی دقیقا کل کد تابع در محل فراخوانی کپی می‌شود.

🔹 جالب است بدانید که توابع LL به روش Inline پیاده‌سازی شده‌اند که یکی از دلایل سرعت بالای این توابع است. در رابطه با پیاده‌سازی Inline توابع LL، در قسمت پنجم از مجموعه‌ی "آموزش STM32 با توابع LL" در سایت آرملینکس توضیحات بیشتری داده شده است که می‌توانید به سایت مراجعه کنید.

🔹 برای درک بهتر نحوه‌ی اجرای این دو نوع توابع، می‌توانید به تصویری که در پیوست همین پست در ادامه آورده شده است دقت کنید.

🔹 در پست بعدی در رابطه با مزایا و معایب هر کدام از این توابع، اینکه چه موقع از هر کدام از این توابع استفاده کنیم و نحوه‌ی تعریف این توابع در کامپایلرهای مختلف صحبت خواهیم کرد.

🆔 @armlinx
🆚 Inline function VS Normal function

🆔 @armlinx
🔰 مقایسه توابع نرمال (Normal)‌ با توابع اینلاین (Inline)

در پست قبلی، در رابطه با نحوه‌ی عملکرد توابع نرمال (Normal)، و توابع اینلاین (Inline) صحبت کردیم.

❇️ در این پست، در رابطه با مزایا و معایب هر کدام از این توابع، و نحوه‌ی تعریف توابع Inline در کامپایلرهای مختلف صحبت خواهیم کرد.

🔵 مقایسه توابع Inline و توابع Normal:
در ادامه ویژگی‌های هر کدام از این توابع را بیان خواهیم کرد، و در نهایت با توجه به ویژگی‌های بیان شده، خواهیم گفت که در چه شرایطی، از چه توابعی، استفاده کنید.

✳️ به صورت کلی، ویژگی‌های زیر در اغلب اوقات برقرار است:

🔵 ویژگی‌های توابع Inline:
◀️ سرعت بیشتر
◀️ حجم کد بیشتر

🔵 ویژگی‌های توابع Normal:
◀️ سرعت کمتر
◀️ حجم کد کمتر

🔵 نتیجه‌گیری:
با توجه به ویژگی‌های ذکر شده، اگر به سرعت بالایی نیاز دارید، توابع Inline می‌توانند انتخاب مناسبی باشند، اما در عین حال باید مواظب باشید که حجم کد توابع زیاد نباشند تا حجم نهایی کد برنامه بالا نرود.

✳️ همچنین اگر به سرعت بالایی نیاز ندارید، اما با محدودیت حجم حافظه روبه‌رو هستید، بهتر است که از توابع Normal استفاده کنید.

🔵 تعریف توابع Inline در کامپایلرهای مختلف:
همانطور که از پست قبل می‌دانید، توابع Inline، جز ملزومات و استانداردهای یک زبان برنامه‌نویسی نیست، بلکه جز امکانات کامپایلر محسوب می‌شود، به همین دلیل نحوه‌ی تعریف این توابع در IDEها و کامپایلرهای مختلف، یکسان نیست.

با توجه به فایل cmsis_iccarm.h و فایل cmsis_armcc.h، نحوه‌ی تعریف توابع Inline در IAR و Keil، به صورت زیر است.

🔵 نحوه‌ی تعریف توابع Inline، در IAR:
برای تعریف توابع Inline در IAR، باید از کلمه کلیدی "inline" در تعریف و پیش‌تعریف توابع استفاده کنید.

🔵 نحوه‌ی تعریف توابع Inline، در Keil:
برای تعریف توابع Inline در Keil، از کلمه کلیدی "inline__" در تعریف و پیش‌تعریف توابع استفاده کنید.

در مقالات سایت، ما به وفور از توابع Inline استفاده کردیم، برای مطالعه‌ی مجموعه مقالات "آموزش STM32 " بر روی لینک زیر کلیک کنید:

🌎 آموزش STM32

🆔 @armlinx
🔰 چرا الکترونیک دیجیتال وجود ندارد؟

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

چرا به اشتباه بودن سوال فکر می‌کنیم؟ چون که تا به امروز، الکترونیک دیجیتال را به عنوان بخشی مهم و مجزا، در دنیای الکترونیک می‌شناختیم که وجود خارجی داشته و در عمل کاربردهای زیادی نیز دارد.

اما در این مقاله، که دوست و استاد عزیزی برای ما ارسال کردند، به خوبی توضیح می‌دهند که چرا باور عامه‌ای که تاکنون در مورد الکترونیک دیجیتال وجود داشته، اشتباه است.

🔵 در این مقاله ابتدا به مبحث منطق، و مشخصا منطق گزاره‌ها، و همچنین ریاضیات و جبر بول گذری کوتاه داریم، سپس با ورود به دنیای الکترونیک، مفصلا شرح خواهیم داد که چرا الکترونیک دیجیتال وجود ندارد؟

برای خواندن مقاله، بر روی لینک زیر کلیک کنید، همچنین خوشحال خواهیم شد اگر نظری متفاوت از نظر ما، یا هر نظر دیگری دارید، آن را با ما به اشتراک بگذارید.

🌎 چرا الکترونیک دیجیتال وجود ندارد؟

🆔 @armlinx
2025/03/23 05:13:15
Back to Top
HTML Embed Code: