সুচিপত্র:

সুতরাং, আপনি আপনার "নীল পিল" এ STM32duino বুটলোডার লোড করুন তাহলে এখন কি ?: 7 টি ধাপ
সুতরাং, আপনি আপনার "নীল পিল" এ STM32duino বুটলোডার লোড করুন তাহলে এখন কি ?: 7 টি ধাপ

ভিডিও: সুতরাং, আপনি আপনার "নীল পিল" এ STM32duino বুটলোডার লোড করুন তাহলে এখন কি ?: 7 টি ধাপ

ভিডিও: সুতরাং, আপনি আপনার
ভিডিও: ✨A Will Eternal EP 01 - 106 Full Version [MULTI SUB] 2024, জুলাই
Anonim
সুতরাং, আপনি আপনার মধ্যে STM32duino বুটলোডার লোড করুন
সুতরাং, আপনি আপনার মধ্যে STM32duino বুটলোডার লোড করুন
সুতরাং, আপনি আপনার মধ্যে STM32duino বুটলোডার লোড করুন
সুতরাং, আপনি আপনার মধ্যে STM32duino বুটলোডার লোড করুন

যদি আপনি ইতিমধ্যেই STR32duino বুটলোডার বা অন্য কোন অনুরূপ ডকুমেন্টেশন লোড করার ব্যাখ্যা দিয়ে আমার নির্দেশাবলী পড়ে থাকেন, তাহলে আপনি লোড কোডের উদাহরণ চেষ্টা করুন এবং…। কিছুই হতে পারে না।

সমস্যা হল, অনেক, যদি "জেনেরিক" STM32 এর সমস্ত উদাহরণ বাক্সের বাইরে কাজ করবে না। আপনার STM32 "ব্লু পিল" বোর্ডে কাজ করার জন্য এটি প্রয়োজনীয় ছোটখাটো পরিবর্তন হবে।

কী পরিবর্তন করতে হবে এবং কেন তা ব্যাখ্যা করতে আমি 4 টি কোড উদাহরণ নির্বাচন করব। কোডগুলি হল: "BlinkWithoutDelay", "Fading", "Dimmer" এবং "AnalogInSerial"।

মনে রাখবেন আমি কিছু কোড করিনি। আমি শুধু দ্বারা তৈরি কোড ছোট পরিবর্তন ইস্যু:

ডেভিড A

টম ইগো এবং দেরিতে ব্রায়ান নিউবোল্ড দ্বারা পরিবর্তিত

সুতরাং, আমি সৃষ্টির ক্রেডিট রেখে, আমি সংশোধিত কোডগুলিতেও লেখকের নাম রাখতে পছন্দ করি।

ধাপ 1: পিন এবং পিন….কেন কোড কাজ করছে না?

পিন এবং পিন….কেন কোড কাজ করছে না?
পিন এবং পিন….কেন কোড কাজ করছে না?

এসটিএম 32 "ব্লু পিল" পিন আউট দেখে নেওয়া যাক। নোট পিনগুলি PA1 বা PC2 হিসাবে চিহ্নিত করা হয়….এরকম কিছু।

উদাহরণস্বরূপ, যদি আপনি "BlinkWithoutDelay" কোডের উদাহরণটি দেখেন, তাহলে পিনকে "33" হিসাবে ঘোষণা করা হয় … কেন?

আমি সন্দেহ করি যে, কারণ জনাব মার্টি বলিভার এই কোডটি MAPLE বোর্ডের জন্য পোর্ট করেছেন।

আমি মনে করি কোডটি "ব্লু পিল" বোর্ডের সাথে সামঞ্জস্যপূর্ণ হওয়া তার উদ্দেশ্য ছিল না।

ম্যাপেল এবং ম্যাপেল মিনি বোর্ড পিনগুলি অরডুইনোর মতো সংখ্যাসূচক ঘোষিত, যদিও তারা 33, 24 এবং এর মতো কিছু সংখ্যা ব্যবহার করে।

আমি বললাম কোড কাজ করছে না? আমার ভুল. কোন ত্রুটি ছাড়াই কোড কম্পাইল করুন এবং "ব্লু পিল" এ সঠিকভাবে আপলোড করুন, সুতরাং, আমার মতামত এটি সত্যিই কাজ করছে, কিন্তু একটি GPIO আউটপুট ব্যবহার করে আমরা আশা করি না। এমনকি পাওয়া যাবে না।

তাই প্রত্যাশিতভাবে কাজ করার জন্য কোডে সামান্য পরিবর্তন প্রয়োজন।

ধাপ 2: আসুন কিছু পিন "সংজ্ঞায়িত করি"…।

চলুন
চলুন

এটি একটি ভাল কোড অভ্যাস সম্পদকে সহজ সনাক্তকরণ বা ভেরিয়েবল বা ধ্রুবক মানে। এটি আপনাকে কোডটি বুঝতে এবং সমস্যা সমাধান করতে সহজ করে দেবে।

আমি এই মত Arduino পিন ঘোষণা করেছি:

const int ledPin = 13;

…"

যদি আপনি আমাকে পছন্দ করেন, হয়তো আপনি নিজেকে জিজ্ঞাসা করছেন: "আমি কিভাবে PC13 এর মতো পিনগুলি ঘোষণা করতে পারি ???"

উত্তর হল: "#define" C স্টেটমেন্ট ব্যবহার করুন।

সুতরাং, পিনআউট ড্র অনুসারে, PC13 হল "BluePill" এ LED বোর্ডে থাকা পিন। এটি ব্যবহার করার জন্য, আমি লাইব্রেরির সংজ্ঞা (#অন্তর্ভুক্ত …) এর পরে এবং অন্য কিছু আগে ঘোষণা করব:

#লেডপিন PC13 নির্ধারণ করুন

…"

মনে রাখবেন কোন ";" নেই লাইন সমাপ্তি, NOR "=" নিয়োগ।

উভয় কোড তুলনা করুন। একটি হল IDE থেকে লোড করা মূল উদাহরণ। দ্বিতীয়টি হল "ব্লুপিল" এর সাথে কাজ করার জন্য আমি কিছু সামঞ্জস্য করেছি।

আমি দৃ strongly়ভাবে সুপারিশ করি যে আপনি কোডে ব্যবহার করতে চান এমন সমস্ত পিন ঘোষণা করুন। এমনকি যারা ADC ইনপুট হিসাবে ব্যবহার করতে চায় (এটি সম্পর্কে আরও পরে)।

এটি আপনার জীবনকে সহজ করে তুলবে।

ধাপ 3: পিনমোড () … আপনি কিভাবে আপনার পিন ব্যবহার করবেন …

চালিয়ে যাওয়ার আগে, পিনমোড () ফাংশনটি বুঝতে দিন।

Arduino মত, STM32 পিনের একাধিক ফাংশন আছে। এক বা অন্য নির্বাচন করার সহজ উপায় হল পিনমোড () স্টেটমেন্ট ব্যবহার করা।

আরডুইনোতে কেবল 3 টি মোড পাওয়া যায়, ইনপুট, আউটপুট, বা ইনপুটপুলপ।

STM32, অন্যদিকে পিনমোড () এর অনেক স্বাদ আছে। তারা হল:

আউটপুট -বেসিক ডিজিটাল আউটপুট: যখন পিন উচ্চ হয়, ভোল্টেজ +3.3v (Vcc) এ রাখা হয় এবং যখন এটি কম হয়, তখন এটি মাটিতে টেনে আনা হয়।

OUTPUT_OPEN_DRAIN -খোলা ড্রেন মোডে, পিন স্থলতে বর্তমান প্রবাহ গ্রহণ করে "নিম্ন" এবং বর্ধিত প্রতিবন্ধকতা প্রদান করে "উচ্চ" নির্দেশ করে।

INPUT_ANALOG- এটি একটি বিশেষ মোড যখন পিনটি এনালগ (ডিজিটাল নয়) পড়ার জন্য ব্যবহার করা হবে। পিন এ ভোল্টেজ এডিসি রূপান্তর করতে সক্ষম করে।

INPUT_PULLUP -এই মোডে পিনের অবস্থা INPUT- এর মতো একই ভাবে রিপোর্ট করা হয়, কিন্তু পিন ভোল্টেজটি আলতো করে +3.3v এর দিকে "টেনে আনা" হয়।

INPUT_PULLDOWN -এই মোডে পিনের অবস্থা INPUT- এর মতো একইভাবে রিপোর্ট করা হয়, কিন্তু পিনের ভোল্টেজটি 0v এর দিকে আলতো করে "টেনে" নামানো হয়।

INPUT_FLOATING -INPUT এর প্রতিশব্দ।

PWM -এটি একটি বিশেষ মোড যখন পিন PWM আউটপুট (ডিজিটাল আউটপুট একটি বিশেষ ক্ষেত্রে) জন্য ব্যবহার করা হবে।

PWM_OPEN_DRAIN- PWM এর মতো, LOW এবং HIGH এর বিকল্প চক্রের পরিবর্তে, পিনের ভোল্টেজটি LOW এবং ভাসমান (সংযোগ বিচ্ছিন্ন) এর বিকল্প চক্র নিয়ে গঠিত।

(দ্রষ্টব্য: https://docs.leaflabs.com/static.leaflabs.com/pub/leaflabs/maple-docs/latest/lang/api/pinmode.html#lang-pinmode থেকে সংগৃহীত)

আমি শুধু এই বন্ধনীটি খুলছি কারণ যখন আপনি আপনার নিজের কোড তৈরি শুরু করবেন, আপনার প্রয়োজনের জন্য সঠিক pinMode () ব্যবহার করতে সতর্ক থাকুন।

ধাপ 4: AnalogWrite () বনাম PwmWrite ()… 2 স্বাদে এনালগ আউটপুট

AnalogWrite () বনাম PwmWrite ()… 2 স্বাদে এনালগ আউটপুট
AnalogWrite () বনাম PwmWrite ()… 2 স্বাদে এনালগ আউটপুট
AnalogWrite () বনাম PwmWrite ()… 2 স্বাদে এনালগ আউটপুট
AnalogWrite () বনাম PwmWrite ()… 2 স্বাদে এনালগ আউটপুট

"ব্লু পিল" জিপিআইও পিন ব্যবহারের আগে এটির আচরণ ঘোষণা করা প্রয়োজন, যেমন, এটি কীভাবে কাজ করবে। পিনমোড () ফাংশন ঠিক সেটাই করে।

সুতরাং, এখন ফোকাস করা যাক কিভাবে একটি এনালগ আউটপুট সঠিক সেট। এটিকে আউটপুট মোড বা পিডব্লিউএম মোড হিসাবে ঘোষণা করা যেতে পারে।

একইভাবে, এনালগ মানগুলি GPIO- এর জন্য 2 উপায়ে বৈশিষ্ট্যযুক্ত হতে পারে: analogWrite () বা pwmWrite (), কিন্তু, analogWrite () শুধুমাত্র pinMode () = OUTPUT হলে কাজ করবে। অন্যদিকে, pwmWrite () শুধুমাত্র pinMode () = PWM হলে কাজ করবে।

উদাহরণস্বরূপ PA0 নেওয়া যাক: এটি একটি এনালগ/pwm আউটপুট প্রার্থী।

analogWrite (): এটি এইভাবে ঘোষণা করে:

….

#LEDPin PA0 নির্ধারণ করুন

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <number>);

……"

যেখানে সংখ্যাটি 0 থেকে 255 এর মধ্যে হতে হবে, যেমন Arduino। প্রকৃতপক্ষে, এটি আরডুইনো এর পিছনে সামঞ্জস্যপূর্ণ।

pwmWrite (): এইভাবে ঘোষণা করুন:

#LEDPin PA0 নির্ধারণ করুন

পিনমোড (ledPin, PWM);

pwmWrite (ledPin, <number।>);

…."

যেখানে সংখ্যা 0 ~ 65535 এর মধ্যে হতে হবে, আরডুইনো থেকে অনেক বেশি রেজোলিউশন।

ছবিতে 2 টি কোডের মধ্যে তুলনা করা সম্ভব। আপনি মূল কোডটিও দেখতে পারেন।

ধাপ 5: STM32 সিরিয়াল যোগাযোগ

STM32 সিরিয়াল যোগাযোগ
STM32 সিরিয়াল যোগাযোগ

আসুন দেখি কিভাবে START32 এ USART ইন্টারফেস সাজানো হয়। হ্যাঁ, বহুবচনে ইন্টারফেস…..

"ব্লু পিল" এর 3 টি USART এর (RX/ TX 1 ~ 3) আছে, এবং, যদি আপনি বুটলোডার ব্যবহার করেন তাহলে আপনি ইউএসবি ব্যবহার করতে পারবেন, এটি তখন কোনটির সাথে সংযুক্ত নয়।

আপনি ইউএসবি ব্যবহার করছেন বা করছেন না তার উপর নির্ভর করে, আপনাকে আপনার কোডে এক বা অন্য উপায়ে সিরিয়াল পোর্ট ঘোষণা করতে হবে।

কেস 1: ইউএসবি ব্যবহার করে:

এইভাবে, স্কেচগুলি সরাসরি ইউএসবি এর মাধ্যমে ডাউনলোড করা হয়। BOOT0 জাম্পারকে 1 অবস্থানে এবং 0 এ ফিরে যাওয়ার দরকার নেই।

এই ক্ষেত্রে, আপনি যখনই কোন সূচক ছাড়াই "সিরিয়াল" ঘোষণা করবেন, তার মানে ইউএসবি এর মাধ্যমে যোগাযোগ।

সুতরাং, সিরিয়াল 1, মানে TX/ RX 1 (পিন PA9 এবং PA10); সিরিয়াল 2, মানে TX/ RX 2 (পিন PA2 এবং PA3) এবং সিরিয়াল 3 মানে TX/ RX 3 (Pins PA10 এবং PA11)।

এই ভাবেই আমরা কাজ করছি। আমি কোডিং এর এই পদ্ধতিতে উদাহরণে পরিবর্তন উপস্থাপন করব।

আরেকটি বিষয়: "সিরিয়াল ইউএসবি" আরম্ভ করার প্রয়োজন নেই। অন্য কথায়, "… Serial.begin (15200);" প্রয়োজন হয় না.

এটা সম্ভব যে কোন সিরিয়াল ফাংশন (Serial.read (), Serial.write (), ইত্যাদি) কোন প্রারম্ভিকতা ছাড়াই।

যদি কোন কারণে এটি কোডে উপস্থিত থাকে, কম্পাইলার এটি উপেক্ষা করবে।

কেস 2: টিটিএল সিরিয়া ইউএসবি অ্যাডাপ্টারে ব্যবহার করা:

এইভাবে, বুটলোডার স্থানীয় STM32 ইউএসবি যোগাযোগ সমর্থন করে না, তাই স্কেচ আপলোড করার জন্য আপনার TX/ RX 1 (পিন PA9 এবং PA10) এর সাথে সংযুক্ত একটি USB থেকে সিরিয়াল অ্যাডাপ্টারের প্রয়োজন।

এই ক্ষেত্রে, যে কোন সময় "সিরিয়াল" কোন সূচক ছাড়া কোড, মানে TX/ RX1 (কোড আপলোড করতে ব্যবহৃত পোর্ট)। সুতরাং, সিরিয়াল 1 টিএক্স/ আরএক্স 2 (পিন পিএ 2 এবং পিএ 3) বোঝায় এবং সিরিয়াল 2 টিএক্স/ আরএক্স 3 (পিন পিএ 10 এবং পিএ 11) বোঝায়। কোন সিরিয়াল 3 উপলব্ধ নেই

ধাপ 6: মাইক্রোকন্ট্রোলারের কাছে একটি মান পাস করা

মাইক্রোকন্ট্রোলারের কাছে একটি মান পাস করা
মাইক্রোকন্ট্রোলারের কাছে একটি মান পাস করা

ডিমারের উদাহরণ হল মাইক্রোকন্ট্রোলারের কাছে একটি মান কিভাবে পাস করা যায় তা দেখানোর সহজ উপায়।

এটি LED উজ্জ্বলতা নিয়ন্ত্রণ করতে 0 থেকে 255 পর্যন্ত একটি মান পাস করার অনুমান করে।

এটি ব্লু পিলের কারণে প্রত্যাশিত হিসাবে কাজ করবে না:

  1. PwmWrite () ফাংশন ব্যবহার করার জন্য, pinMode () PWM মোড হিসেবে ঘোষণা করা আবশ্যক।
  2. আপনি কখনই পুরো 3 ডিজিটের নম্বর পাবেন না। Serial.read () ফাংশন শুধু বাফার কন্টেন্ট ক্যাপচার করে, যা একটি "BYTE"। যদি আপনি "100" টাইপ করেন এবং "এন্টার" টিপুন, শুধুমাত্র শেষ "0" বাফার থেকে ক্যাপচার হবে। এবং এর মান হবে "48" (দশমিক ASCII মান "0")। মান "100" ইস্যু করার ইচ্ছা থাকলে, "d" টাইপ করা প্রয়োজন। সুতরাং, এটা বলা ঠিক যে এটি একটি ASCII প্রতীক দশমিক মানকে LED উজ্জ্বলতায় রূপান্তরিত করবে, ঠিক আছে?….আচ্ছা, এক ধরণের…
  3. সমস্যা, Serial.read () ফাংশন থেকে সরাসরি মানচিত্রের মান একটি ট্রিক অ্যাকশন। এটা প্রায় নিশ্চিত অপ্রত্যাশিত মান পেতে। আরও ভাল পদ্ধতি হল একটি অস্থায়ী পরিবর্তনশীল স্টোরেজ বাফার সামগ্রী এবং এটি ম্যাপ করুন।

যেমন আমি আইটেম 2 -এ আগে ব্যাখ্যা করেছি, আমি যে কোডগুলি পরিবর্তন করেছি তা একটি ASCII প্রতীক প্রবেশ করার অনুমতি দেবে এবং এটি তার ASCII দশমিক মানের ভিত্তিতে LED উজ্জ্বলতা নিয়ন্ত্রণ করবে … উদাহরণস্বরূপ, "স্পেস" মান 32 (প্রকৃতপক্ষে সর্বনিম্ন মুদ্রণযোগ্য অক্ষর যা আপনি প্রবেশ করতে পারেন) এবং "}" সর্বোচ্চ সম্ভব (মান 126)। অন্যান্য অক্ষরগুলি মুদ্রণযোগ্য নয়, তাই টার্মিনাল বুঝতে পারবে না অথবা তারা সম্ভাব্য চরিত্রের একটি যৌগ (যেমন "~" আমার কীবোর্ডের একটি মৃত কী এবং সঠিকভাবে কাজ করবে না)। এর মানে হল, এই যৌগিক চরিত্রটি, যখন টার্মিনালে প্রবেশ করবে, তখন চরিত্রটি নিজেই এবং অন্য কিছু পাঠাবে। সাধারণত একটি মুদ্রণযোগ্য নয়। এবং এই শেষ একটি কোড ক্যাপচার হবে। এছাড়াও, আপনার টার্মিনাল মনে রাখবেন, এই ক্ষেত্রে, "ক্যারেজ রিটার্ন" বা "লাইন ফিড" না পাঠানো উচিত। কোডটি সঠিকভাবে কাজ করার জন্য আপনাকে অবশ্যই এই দিকে মনোযোগ দিতে হবে।

যদি আপনি পড়ে যান তবে এটি কিছুটা বিভ্রান্তিকর, এটি সবচেয়ে খারাপ হয়ে যায় …..

ধাপ 7: এবং যদি আমি তিন অঙ্ক টাইপ করতে চাই …. অথবা আরও বেশি ??

এবং যদি আমি তিন অঙ্ক টাইপ করতে চাই…। অথবা আরও বেশি ??
এবং যদি আমি তিন অঙ্ক টাইপ করতে চাই…। অথবা আরও বেশি ??

একটি সিরিয়াল যোগাযোগ থেকে একাধিক চরিত্র গ্রহণ করা একটি সহজ কাজ নয়।

সিরিয়াল বাফার হল FIFO বাইটের গাদা। যেকোনো সময় Serial.read () ফাংশন কল করছে, পাঠানো প্রথম চরটি গাদা থেকে সরিয়ে অন্য কোথাও সংরক্ষণ করা হয়। সাধারণত কোডে একটি ভ্যারিয়েবল। দ্রষ্টব্য, হার্ডওয়্যারের উপর নির্ভর করে, সাধারণত লগ বাফার কীভাবে তথ্য রাখতে পারে তার জন্য একটি সময়সীমা থাকে।

যদি আপনি সিরিয়ালের মাধ্যমে একাধিক অঙ্কে প্রবেশ করতে চান, তাহলে আপনাকে অবশ্যই UART বাফারে প্রবেশ করার সাথে সাথে অক্ষর দ্বারা একটি স্ট্রিং অক্ষর "রচনা" করতে হবে।

এর মানে হল সাইকেল চালানো প্রতিটি বাফার চর পড়ুন, একটি টেম্প ভেরিয়েবলে সংরক্ষণ করুন, এটি একটি স্ট্রিং অ্যারের প্রথম অবস্থানে লোড করুন, পরবর্তী অবস্থানে যান এবং শুরু করুন, যতক্ষণ না… ভাল, প্রয়োগ নির্ভর করে। চক্র শেষ করার 2 টি উপায় রয়েছে:

  1. কিছু "শেষ চিহ্ন" অক্ষর ব্যবহার করে, যেমন "ক্যারেজ রিটার্ন" বা "লাইন ফিড"। যত তাড়াতাড়ি "শেষ মার্ক" চর পাওয়া যায়, লুপ শেষ হয়।
  2. বিকল্পভাবে, স্ট্রিং চেইনে অক্ষরের সংখ্যা সীমিত হতে পারে, তাই করুন, ইন্টারেক্টিভ চক্রের সংখ্যা। যখন এটি সীমাতে পৌঁছে যায়, তখন বলা যাক, 4, নিজে থেকে রুটিন সমাপ্তি অর্জন করুন।

আসুন একটি সহজ উদাহরণে দেখি কিভাবে এটি করা যায়:

  • একটি "শেষ" অক্ষর সেট করুন, যেমন '\ n' (এর অর্থ হল লাইন ফিড ASCII চর)।
  • এর মধ্যে লুপিং Serial.available () সত্য
  • Serial.read () সংরক্ষণ করার ফলে একটি অস্থায়ী চর পরিবর্তনশীল হয়। মনে রাখবেন: যত তাড়াতাড়ি Serial.read () আসলে বাফার "পড়বে", এটি পরিষ্কার এবং পরবর্তী অক্ষর এতে লোড হয়।
  • এই অক্ষর দিয়ে একটি স্ট্রিং ভেরিয়েবল বৃদ্ধি করুন
  • যদি শেষ চরটি "শেষ" হয় তবে লুপ থেকে প্রস্থান করুন।

সাধারণত, সিরিয়াল ক্যারেক্টার অ্যারে পেতে রুটিন ছবির মত দেখায়।

এটি জনাব ডেভিড এ মেলিস মূল কোডের একটি ব্যাপক অভিযোজন ভিত্তিক ছিল।

এটি ব্যবহার করতে এবং পরীক্ষা করতে মুক্ত হন। মনে রাখবেন: মান 3 অঙ্কের বিন্যাসে প্রবেশ করতে হবে।

এটা আপাতত আমি অতিরিক্ত সিরিয়াল যোগাযোগের বিবরণে নিজেকে প্রসারিত করব না। এটি এখানে আবরণ করা খুব জটিল এবং এটি এর নিজস্ব ইন্ট্রাকটেবলস প্রাপ্য।

আমি আশা করি এটি আপনাকে নীল পিলের উদাহরণ ব্যবহার করতে সাহায্য করবে এবং এই ছোট বোর্ডের জন্য কতটা সঠিক কোড তা আপনাকে কিছু জ্ঞান দেবে।

অন্যান্য নির্দেশের মধ্যে আপনার চারপাশে দেখা।

প্রস্তাবিত: