विषयसूची:

तो, आप अपने "ब्लू पिल" में STM32duino बूटलोडर लोड करते हैंतो अब क्या?: 7 कदम
तो, आप अपने "ब्लू पिल" में STM32duino बूटलोडर लोड करते हैंतो अब क्या?: 7 कदम

वीडियो: तो, आप अपने "ब्लू पिल" में STM32duino बूटलोडर लोड करते हैंतो अब क्या?: 7 कदम

वीडियो: तो, आप अपने
वीडियो: LDmicro PLC लैडर लॉजिक के साथ STM32 ब्लू पिल की प्रोग्रामिंग 2024, जुलाई
Anonim
तो, आप अपने में STM32duino बूटलोडर लोड करें
तो, आप अपने में STM32duino बूटलोडर लोड करें
तो, आप अपने में STM32duino बूटलोडर लोड करें
तो, आप अपने में STM32duino बूटलोडर लोड करें

यदि आप पहले से ही मेरे निर्देशों को पढ़ रहे हैं, जिसमें बताया गया है कि STM32duino बूटलोडर या किसी अन्य समान दस्तावेज को कैसे लोड किया जाता है, तो आप लोड कोड उदाहरण का प्रयास करते हैं और….हो सकता है कि कुछ भी न हो।

समस्या यह है कि, बहुत से, "जेनेरिक" STM32 के सभी उदाहरण बॉक्स से बाहर काम नहीं करेंगे। आपके STM32 "ब्लू पिल" बोर्ड में काम करने के लिए आवश्यक मामूली बदलाव होंगे।

क्या बदलने की जरूरत है और क्यों यह समझाने के लिए मैं 4 कोड उदाहरणों का चयन करूंगा। कोड हैं: "ब्लिंकविथआउटडेल", "फ्डिंग", "डिमर" और "एनालॉगइनसेरियल"।

नोट मैंने कुछ भी कोड नहीं किया। मैं बस द्वारा बनाए गए कोड में मामूली बदलाव जारी करता हूं:

डेविड ए मेलिस और टॉम इगोए, मार्टी बोलिवर द्वारा देर से संशोधित और स्कॉट फिट्जगेराल्ड द्वारा कुछ मामले

टॉम इगोए और देर से ब्रायन न्यूबॉल्ड द्वारा संशोधित

इसलिए, मैं क्रिएशन क्रेडिट को ध्यान में रखते हुए, मेरे द्वारा संशोधित किए गए कोड में भी लेखक के नाम रखना पसंद करता हूं।

चरण 1: पिन और पिन…. कोड काम क्यों नहीं कर रहा है?

पिन और पिन…. कोड काम क्यों नहीं कर रहा है?
पिन और पिन…. कोड काम क्यों नहीं कर रहा है?

आइए STM32 "ब्लू पिल" पिन आउट में एक नज़र डालते हैं। नोट पिन को PA1 या PC2 के रूप में पहचाना जाता है….कुछ ऐसा।

यदि आप एक नज़र डालते हैं, उदाहरण के लिए, "ब्लिंकविथआउटडेले" कोड उदाहरण, पिन को "33" के रूप में घोषित किया जाता है….क्यों?

मुझे संदेह है कि ऐसा इसलिए है क्योंकि मिस्टर मार्टी बोलिवर ने इस कोड को MAPLE बोर्ड के लिए पोर्ट किया था।

मुझे लगता है कि यह उनका इरादा नहीं था कि कोड "ब्लू पिल" बोर्डों के अनुकूल हो।

मेपल और मेपल मिनी बोर्ड पिन संख्यात्मक घोषित हैं, जैसे Arduino, हालांकि वे 33, 24 और कुछ इस तरह की संख्याओं का उपयोग करते हैं।

मैंने कहा कोड काम नहीं कर रहा था? मेरी गलती। बिना किसी त्रुटि के कोड संकलित करें और "ब्लू पिल" पर सही ढंग से अपलोड करें, इसलिए, मेरी राय है कि यह वास्तव में काम कर रहा है, लेकिन GPIO आउटपुट का उपयोग करके हम उम्मीद नहीं कर रहे हैं। शायद उपलब्ध भी न हो।

उम्मीद के मुताबिक काम करने के लिए कोड में बहुत कम बदलाव जरूरी हैं।

चरण 2: आइए कुछ पिनों को "परिभाषित" करें…।

के जाने
के जाने

यह एक अच्छा कोड अभ्यास है जो संसाधनों को आसान पहचान या अर्थ चर या स्थिरांक के रूप में घोषित करता है। यह आपको कोड को समझने और समस्या निवारण को आसान बनाने देगा।

मैंने Arduino पिन को इस तरह घोषित किया:

कॉन्स्ट इंट लेडपिन = 13;

…"

अगर आप मुझे पसंद करते हैं, तो शायद आप खुद से पूछ रहे हैं: "मैं PC13 जैसे नामों के साथ पिन कैसे घोषित कर सकता हूं?"

उत्तर है: "#define" C कथन का प्रयोग करें।

तो, पिनआउट ड्रा के अनुसार, पीसी13 वह पिन है जो हमारे पास "ब्लूपिल" में एलईडी बोर्ड पर है। इसका उपयोग करने के लिए, मैं इस तरह की घोषणा करूंगा, पुस्तकालयों की परिभाषा के बाद (#include…) और किसी और चीज से पहले:

# लेडपिन पीसी को परिभाषित करें13

…"

ध्यान दें कि कोई ";" नहीं है लाइन टर्मिनेशन, NOR "=" असाइनमेंट।

दोनों कोड की तुलना करें। एक आईडीई से लोड किया गया मूल उदाहरण है। दूसरा वह है जिसे मैंने "ब्लूपिल" के साथ काम करने के लिए कुछ समायोजित किया है।

मैं दृढ़ता से अनुशंसा करता हूं कि आप उन सभी पिनों को घोषित करें जिनका आप कोड में उपयोग करना चाहते हैं। यहां तक कि वे भी एडीसी इनपुट के रूप में उपयोग करने का इरादा रखते हैं (इसके बारे में बाद में)।

इससे आपका जीवन आसान हो जाएगा।

चरण 3: पिनमोड ()… आप अपने पिन का उपयोग कैसे करेंगे…

जारी रखने से पहले, पिनमोड () फ़ंक्शन को समझते हैं।

Arduino की तरह, STM32 पिन के भी कई कार्य हैं। एक या दूसरे को चुनने का सबसे आसान तरीका पिनमोड () स्टेटमेंट का उपयोग करना है।

Arduino में केवल 3 मोड उपलब्ध हैं, INPUT, OUTPUT, या INPUT_PULLUP।

दूसरी ओर, STM32 में पिनमोड () के कई फ्लेवर हैं। वे:

OUTPUT -बेसिक डिजिटल आउटपुट: जब पिन हाई होता है, तो वोल्टेज +3.3v (Vcc) पर होता है और जब यह LOW होता है, तो इसे नीचे की ओर खींचा जाता है।

OUTPUT_OPEN_DRAIN - ओपन ड्रेन मोड में, पिन जमीन पर करंट प्रवाह को स्वीकार करके "कम" और बढ़ी हुई प्रतिबाधा प्रदान करके "उच्च" इंगित करता है।

INPUT_ANALOG - यह एक विशेष मोड है जब पिन का उपयोग एनालॉग (डिजिटल नहीं) रीड के लिए किया जाएगा। पिन पर वोल्टेज पर किए जाने वाले एडीसी रूपांतरण को सक्षम करता है।

INPUT_PULLUP -इस मोड में पिन की स्थिति उसी तरह बताई जाती है जैसे INPUT के साथ, लेकिन पिन वोल्टेज को धीरे से +3.3v की ओर "खींचा" जाता है।

INPUT_PULLDOWN -इस मोड में पिन की स्थिति उसी तरह बताई जाती है जैसे INPUT के साथ, लेकिन पिन वोल्टेज को धीरे से 0v की ओर "खींचा" जाता है।

INPUT_FLOATING - INPUT का पर्यायवाची।

पीडब्लूएम - यह एक विशेष मोड है जब पीडब्लूएम आउटपुट (डिजिटल आउटपुट का एक विशेष मामला) के लिए पिन का उपयोग किया जाएगा।

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 से निकाला गया)

मैं सिर्फ इस कोष्ठक को खोलता हूं क्योंकि जब आप अपना कोड बनाना शुरू करते हैं, तो अपनी जरूरत के लिए सही पिनमोड () का उपयोग करने के लिए सावधान रहें।

चरण 4: AnalogWrite() बनाम PwmWrite()… 2 स्वादों में एनालॉग आउटपुट

AnalogWrite () बनाम PwmWrite ()… 2 स्वादों में एनालॉग आउटपुट
AnalogWrite () बनाम PwmWrite ()… 2 स्वादों में एनालॉग आउटपुट
AnalogWrite () बनाम PwmWrite ()… 2 स्वादों में एनालॉग आउटपुट
AnalogWrite () बनाम PwmWrite ()… 2 स्वादों में एनालॉग आउटपुट

"ब्लू पिल" GPIO पिन का उपयोग करने से पहले इसके व्यवहार की घोषणा करना आवश्यक है, अर्थात यह कैसे काम करेगा। ठीक यही पिनमोड() फ़ंक्शन करता है।

तो, अब ध्यान दें कि एनालॉग आउटपुट को कितना सही सेट करें। इसे या तो OUTPUT मोड या PWM मोड के रूप में घोषित किया जा सकता है।

उसी तरह, एनालॉग मान GPIO के लिए 2 तरीकों से विशेषता हो सकते हैं: एनालॉगवर्इट () या pwmWrite (), लेकिन, एनालॉगवर्इट () केवल तभी काम करेगा जब पिनमोड () = OUTPUT। दूसरी ओर, pwmWrite() तभी काम करेगा जब pinMode()=PWM.

आइए PA0 को लें, उदाहरण के लिए: यह एक एनालॉग/pwm आउटपुट उम्मीदवार है।

AnalogWrite (): यह इस तरह से घोषित करता है:

….

#define LEDPin PA0

पिनमोड (एलईडीपिन, आउटपुट);

एनालॉगवर्इट (एलईडीपिन, <संख्या>);

……"

जहां संख्या 0 और 255 के बीच होनी चाहिए, जैसे Arduino। दरअसल, यह Arduino के लिए बैकवर्ड कम्पेटिबल है।

pwmWrite (): इस तरह घोषित करें:

#define LEDPin PA0

पिनमोड (एलईडीपिन, पीडब्लूएम);

pwmWrite (ledPin, <संख्या।>);

…."

जहां संख्या 0 ~ 65535 के बीच होनी चाहिए, एक संकल्प Arduino की तुलना में बहुत अधिक है।

छवियों में 2 कोड के बीच तुलना करना संभव है। आप मूल कोड भी देख सकते हैं।

चरण 5: STM32 सीरियल संचार

STM32 सीरियल संचार
STM32 सीरियल संचार

आइए देखें कि STM32 में USART इंटरफेस की व्यवस्था कैसे की जाती है। हाँ, बहुवचन में इंटरफेस…..

"ब्लू पिल" में 3 USART (RX/TX 1~3) हैं, और, यदि आप बूटलोडर का उपयोग कर रहे हैं तो आपको USB का उपयोग करने की अनुमति मिलती है, यह तब से किसी से कनेक्ट नहीं है।

आप यूएसबी का उपयोग कर रहे हैं या नहीं, इस पर निर्भर करते हुए, आपको अपने कोड में सीरियल पोर्ट को एक या दूसरे तरीके से घोषित करने की आवश्यकता है।

केस 1: USB का उपयोग करना:

इस तरह, स्केच सीधे यूएसबी के माध्यम से डाउनलोड किए जाते हैं। BOOT0 जम्पर को 1 स्थिति और वापस 0 पर ले जाने की आवश्यकता नहीं है।

इस मामले में, जब भी आप बिना किसी अनुक्रमणिका के "सीरियल" घोषित करते हैं, तो इसका अर्थ है यूएसबी के माध्यम से संचार।

तो, Serial1, का अर्थ है TX/RX 1 (पिन PA9 और PA10); सीरियल 2 का अर्थ है TX/ RX 2 (पिन PA2 और PA3) और सीरियल 3 का अर्थ TX/ RX 3 (पिन PA10 और PA11) है।

इस तरह से हम काम कर रहे हैं। मैं इस तरह की कोडिंग के लिए उदाहरणों में बदलाव प्रस्तुत करूंगा।

एक और बात: "सीरियल यूएसबी" को इनिशियलाइज़ करने की आवश्यकता नहीं है। दूसरे शब्दों में, "… Serial.begin(15200);" यह आवश्यक नहीं है।

बिना किसी आरंभ के किसी भी सीरियल फ़ंक्शन (सीरियल.रीड (), सीरियल.राइट (), आदि) को कॉल करना संभव है।

अगर किसी कारण से यह कोड में मौजूद है, तो कंपाइलर इसे अनदेखा कर देगा।

केस 2: USB अडैप्टर के लिए TTL सेरिया का उपयोग करना:

इस तरह, बूटलोडर देशी STM32 USB संचार का समर्थन नहीं करता है, इसलिए स्केच अपलोड करने के लिए आपको TX/RX 1 (पिन PA9 और PA10) से जुड़े सीरियल एडेप्टर के लिए USB की आवश्यकता होती है।

इस मामले में, किसी भी समय "सीरियल" बिना किसी इंडेक्स के कोड होता है, जिसका अर्थ है TX/RX1 (कोड अपलोड करने के लिए इस्तेमाल किया जाने वाला पोर्ट)। तो आगे, सीरियल 1 TX/RX 2 (पिन PA2 और PA3) को संदर्भित करता है और Serial2 TX/ RX 3 (पिन PA10 और PA11) को संदर्भित करता है। कोई सीरियल 3 उपलब्ध नहीं है।

चरण 6: माइक्रोकंट्रोलर के लिए एक मान पास करना

माइक्रोकंट्रोलर को एक मान पास करना
माइक्रोकंट्रोलर को एक मान पास करना

डिमर उदाहरण यह दिखाने का सरल तरीका है कि माइक्रोकंट्रोलर को मान कैसे दिया जाता है।

यह एलईडी चमक को नियंत्रित करने के लिए 0 से 255 के मान को पारित करने का अनुमान लगाता है।

यह ब्लू पिल के कारण अपेक्षित रूप से काम नहीं करेगा:

  1. pwmWrite() फ़ंक्शन का उपयोग करने के लिए, पिनमोड() को PWM मोड के रूप में घोषित किया जाना चाहिए।
  2. आपको कभी भी पूर्ण 3 अंकों की संख्या नहीं मिलेगी। Serial.read() फ़ंक्शन केवल बफर सामग्री को कैप्चर करता है, जो एक "BYTE" है। यदि आप "100" टाइप करते हैं और "एंटर" दबाते हैं, तो केवल अंतिम "0" बफर से कैप्चर किया जाएगा। और इसका मान "48" ("0" के लिए दशमलव ASCII मान) होगा। यदि मूल्य "100" जारी करने का इरादा है, तो "डी" टाइप करना आवश्यक है। तो, यह कहना सही है कि यह एक ASCII प्रतीक दशमलव मान को एलईडी चमक में बदल देगा, है ना??…। ठीक है, एक प्रकार का…
  3. समस्या, Serial.read () फ़ंक्शन से सीधे मान मैप करना एक ट्रिक एक्शन है। यह लगभग निश्चित है कि अप्रत्याशित मूल्य प्राप्त करें। एक अस्थायी चर में भंडारण बफर सामग्री बेहतर तरीका है और इसे मैप करने से बेहतर है।

जैसा कि मैं आइटम 2 में पहले समझाता हूं, कोड मैं परिवर्तनों का परिचय देता हूं जो एएससीआईआई प्रतीक दर्ज करने की अनुमति देगा और यह एएससीआईआई दशमलव मान के आधार पर एलईडी चमक को नियंत्रित करेगा … उदाहरण के लिए, "स्पेस" मान 32 है (वास्तव में सबसे कम प्रिंट करने योग्य वर्ण है जिसे आप दर्ज कर सकते हैं) और "}" उच्चतम संभव है (मान 126)। अन्य चरित्र गैर प्रिंट करने योग्य हैं, इसलिए टर्मिनल समझ में नहीं आएगा या वे चरित्र का एक यौगिक संभव हैं (जैसे "~" मेरे कीबोर्ड में एक मृत कुंजी है और सही ढंग से काम नहीं करेगा)। इसका मतलब है, यह यौगिक चरित्र, जब टर्मिनल में प्रवेश करता है, तो चरित्र स्वयं और कुछ और भेजेगा। आमतौर पर एक गैर प्रिंट करने योग्य। और क्या यह आखिरी एक कोड कैप्चर करेगा। साथ ही, अपने टर्मिनल को ध्यान में रखें, इस मामले में, न तो "कैरिज रिटर्न" और न ही "लाइन फीड" भेजना चाहिए। कोड कार्य को सही ढंग से करने के लिए आपको इस पर ध्यान देना चाहिए।

यदि आप गिर गए तो यह थोड़ा भ्रमित करने वाला है, यह सबसे खराब हो जाता है…..

चरण 7: और अगर मैं तीन अंक टाइप करना चाहूंगा…। या और भी ??

और अगर मैं तीन अंक टाइप करना चाहूंगा…। या और भी ??
और अगर मैं तीन अंक टाइप करना चाहूंगा…। या और भी ??

एक धारावाहिक संचार से कई चरित्र प्राप्त करना कोई आसान काम नहीं है।

सीरियल बफर वर्णों का फीफो बाइट ढेर है। किसी भी समय Serial.read() फ़ंक्शन कॉल कर रहा है, पहले भेजे गए चार को ढेर से हटा दिया जाता है और कहीं और संग्रहीत किया जाता है। आमतौर पर कोड में एक चार चर। ध्यान दें, हार्डवेयर पर निर्भर करता है, आमतौर पर लॉग बफर जानकारी को कैसे रख सकता है, इसके लिए एक टाइमआउट होता है।

यदि आप धारावाहिक के माध्यम से एक से अधिक अंक दर्ज करने का इरादा रखते हैं, तो आपको चरित्र द्वारा एक स्ट्रिंग चरित्र "रचना" करना होगा, क्योंकि वे यूएआरटी बफर में आते हैं।

इसका मतलब है कि साइकिल चलाना प्रत्येक बफर चार को पढ़ता है, एक अस्थायी चर में स्टोर करता है, इसे एक स्ट्रिंग सरणी की पहली स्थिति में लोड करता है, अगली स्थिति में जाता है और तब तक शुरू होता है जब तक … ठीक है, एप्लिकेशन पर निर्भर करता है। चक्र समाप्त करने के 2 तरीके हैं:

  1. कुछ "अंत चिह्न" वर्ण का उपयोग करना, जैसे "कैरिज रिटर्न" या "लाइन फीड"। जैसे ही "एंड मार्क" चार मिल जाता है, लूप समाप्त हो जाता है।
  2. वैकल्पिक रूप से, स्ट्रिंग श्रृंखला में वर्णों की संख्या सीमित हो सकती है, इसलिए इंटरैक्टिव चक्रों की संख्या करें। जब यह सीमा तक पहुँच जाता है, मान लीजिए, 4, इसके द्वारा नियमित रूप से समाप्त हो जाता है।

आइए एक सरल उदाहरण में देखें कि यह कैसे करें:

  • एक "अंत" चार सेट करें, जैसे '\n' (इसका अर्थ है लाइन फ़ीड ASCII char)।
  • इस बीच लूपिंग सीरियल.उपलब्ध () सच है
  • एक अस्थायी चार चर में Serial.read() परिणाम संग्रहीत करना। याद रखें: जैसे ही Serial.read() वास्तव में बफर को "पढ़ता है", यह साफ है और इसमें अगला वर्ण लोड होता है।
  • इस चार के साथ एक स्ट्रिंग चर बढ़ाएँ
  • यदि अंतिम चार "अंत" है, तो लूप से बाहर निकलें।

आमतौर पर, सीरियल कैरेक्टर ऐरे पाने के लिए रूटीन पिक्चर जैसा दिखता है।

यह श्री डेविड ए मेलिस मूल कोड के व्यापक अनुकूलन पर आधारित था।

इसका उपयोग करने और इसका परीक्षण करने के लिए स्वतंत्र हो गए। याद रखें: मान 3 अंकों के प्रारूप में दर्ज किए जाने चाहिए।

यह अभी के लिए है।मैं अतिरिक्त धारावाहिक संचार विवरण में खुद का विस्तार नहीं करूंगा। यह यहां कवर करने के लिए बहुत जटिल है और यह इसके लिए इंट्रैक्टेबल्स का हकदार है।

मुझे आशा है कि यह आपको ब्लू पिल में उदाहरणों का उपयोग करने में मदद करेगा और आपको कुछ ज्ञान देगा कि इस छोटे से बोर्ड के लिए कितना सही कोड है।

अन्य निर्देशयोग्य में मिलते हैं।

सिफारिश की: