
0. लेख पढ़ने से पहले
इस लेख के निम्नलिखित उद्देश्य हैं:
- इस बोर्ड के साथ विशेष रूप से काम करने का तरीका दिखाएं;
- उस दृष्टिकोण को दिखाएं जिसके द्वारा आप एक निमिष एलईडी प्रोग्राम लिख सकते हैं, जो केवल प्रलेखन और तर्क पर निर्भर है;
- उस सामग्री को किसी ऐसी भाषा में प्रस्तुत करें जो उस व्यक्ति के लिए समझ में आती है जो सूक्ष्म रूप से माइक्रोकंट्रोलर से परिचित है।
अतिरिक्त फ़ाइलों का उपयोग करने के संदर्भ में कोड न्यूनतम हो जाएगा - हम एक फ़ाइल को शामिल नहीं करेंगे, सिवाय उन लोगों के जो एक खाली, लेकिन वैध, फर्मवेयर बनाने के लिए आवश्यक हैं। यानी फर्मवेयर कोड के आधार पर, जो काम करता है, लेकिन कुछ भी उपयोगी नहीं है।
हमें निम्नलिखित दस्तावेज की आवश्यकता होगी:
- डेटशीट STM32F030x4 (मैं जनवरी 2017 से दस्तावेज़ का उपयोग करता हूं DocID024849 Rev 3);
- RM0360 संदर्भ मैनुअल STM32F030x4 / x6 / x8 / xC (मैं अप्रैल 2017 से दस्तावेज़ का उपयोग करता हूं DocID025023 Rev 4);
- सर्किट बोर्ड।
आप इन दस्तावेज़ों को
क्लाउड से डाउनलोड कर सकते हैं।
लेख में टाइमर पर विचार
नहीं किया जाएगा और कोड में शामिल
नहीं होगा।
ST-LINK प्रोग्रामर का उपयोग
नहीं किया गया था। बोर्ड के साथ काम करने के लिए, एक USB-COM एडाप्टर (RS232 जो PL2303HX पर आधारित है) का उपयोग किया गया था, जो एक COM पोर्ट का अनुकरण करता है।
विंडोज एक्स होस्ट पर वर्चुअलबॉक्स संस्करण 5.2.22r126460 के माध्यम से चलने वाली एक विंडोज़ एक्सपी प्रोफेशनल एसपी 3 वर्चुअल मशीन पर सब कुछ एकत्र किया गया था।
1. USB-COM एडाप्टर के लिए ड्राइवर को स्थापित करना
विंडोज कोई मदद नहीं है, आधिकारिक साइट से डाउनलोड करें
प्रोलिफिक (Google में अनुरोध "
प्रोलिफिक ड्राइवर का पहला लिंक) ड्राइवर USB से UART / सीरियल / प्रिंटर
PL2303 विंडोज ड्राइवर (आपको
मानक ड्राइवर की आवश्यकता है )। या आप मेरे
क्लाउड से डाउनलोड कर सकते हैं।
ड्राइवर को स्थापित करें, रिबूट करें और नया COM पोर्ट देखें।
इंस्टॉलर और नए COM पोर्ट के नाम के साथ स्क्रीनशॉट पोर्ट सेटिंग्स मानक छोड़ दिया है। आप अपने विवेक पर COM पोर्ट नंबर बदल सकते हैं। मेरे अनुभव में, मेरे जीवन में केवल एक बार मैंने एक कार्यक्रम देखा है जिसमें केवल पहले 4 COM पोर्ट देखे जाते हैं, अगर मैं गलत नहीं हूँ तो यह विंडोज़ के तहत किसी प्रकार का ब्लूटूथ टर्मिनल था।
2. बोर्ड पर फर्मवेयर को भरना
2.0 बोर्ड के साथ काम करने के लिए उपयोगिता डाउनलोड करना
हम
STM वेबसाइट से
FLASHER-STM32 उपयोगिता डाउनलोड करते हैं (विवरण में इसे STM32 फ्लैश लोडर प्रदर्शनकारी (UM0462) कहा जाता है), आपको इसके लिए पंजीकरण करना होगा, लेकिन यह डरावना नहीं है - अंत में हम इंस्टॉलर के साथ ज़िप संग्रह छोड़ देंगे; अगला-> अगला-> अगला ... और सब कुछ स्थापित है। सुविधा के लिए, मैं काम करने वाले फ़ोल्डर में इस एप्लिकेशन का शॉर्टकट बनाता हूं।
यहाँ उपयोगिता (साइट का स्क्रीनशॉट) है डिफ़ॉल्ट रूप से, उपयोगिता
C: प्रोग्राम फ़ाइलें \ STMicroelectronics \ Software \ Flash लोडर डेमो \ STMFlashLoader Demo.exe के लिए पथ ।
२.१ बूथ-संज्ञा
बोर्ड पर एक BOOT जम्पर है।
- जब जम्पर बंद हो जाता है , तो माइक्रोकंट्रोलर अपनी मेमोरी से निर्देशों को लोड करेगा (यानी, एक प्रोग्रामर द्वारा लिखित प्रोग्राम)।
- जब जम्पर खुला होता है , तो माइक्रोकंट्रोलर को आरएक्स और TX लाइनों पर जानकारी मिलेगी, अर्थात। इसे COM पोर्ट (एडॉप्टर से मेरे मामले में) से फ्लैश किया जाएगा।
2.2 उपयोगिता का विन्यास

इस एप्लिकेशन को चलाएं, यह वास्तव में सबसे सरल है (जिसमें न्यूनतम सेटिंग्स हैं)। पहली विंडो पर, चुनें:
- इंटरफ़ेस (मेरे पास COM-3 है);
- वह गति जिसके साथ कंप्यूटर और माइक्रोकंट्रोलर संचार करेंगे (IMHO, 9600 सामान्य मूल्य);
- डेटा बिट्स की संख्या (किसी कारण से यह विंडो मेरे लिए उपलब्ध नहीं है, लेकिन अभी तक यह महत्वपूर्ण नहीं है);
- समता (मुझे कोई समानता नहीं है, अर्थात् कोई नहीं);
- इको (मेरे पास ऑफ है);
- प्रतीक्षा समय (मेरे पास 10 सेकंड हैं)।
अगला क्लिक करें, और यदि सब कुछ क्रम में है, तो हम एक हरे रंग की रोशनी देखेंगे और "लक्ष्य पठनीय है"; यदि हम लाल बत्ती देखते हैं, तो कंप्यूटर कनेक्ट नहीं हो सकता है।
यदि माइक्रोकंट्रोलर का सफलतापूर्वक पता चला है तो लक्ष्य पठनीय है हमेशा मदद करने वाले चरणों का क्रम:
- सबसे पहले, आपको यह जांचने की आवश्यकता है कि बोर्ड पर BOOT जम्पर बंद है या नहीं।
- दूसरे, किसी भी मामले में, माइक्रोकंट्रोलर की शक्ति को बंद करें और अधिमानतः बोर्ड से एडाप्टर से आने वाली TX और RX लाइनें (आप जमीन को डिस्कनेक्ट नहीं कर सकते हैं)।
- तीसरा, प्रोग्राम में, बैक टू द एंड, यानी। पहले पृष्ठ पर, या यहां तक कि इसे बंद करें और इसे पुनरारंभ करें (आम तौर पर बोलना, यह कभी-कभी जमा देता है)। इस कार्यक्रम के माध्यम से बोर्ड से प्रत्येक कनेक्शन से पहले हमेशा पहले पृष्ठ से शुरू करना महत्वपूर्ण है।
- चौथा, एडेप्टर से तारों को बोर्ड तक उठाएं और कार्यक्रम में फिर से कनेक्ट करने का प्रयास करें (पहले पृष्ठ से सुनिश्चित करें!)।
यदि अन्य सभी विफल हो जाते हैं, तो आप सब कुछ बंद करने का प्रयास कर सकते हैं, कंप्यूटर को पुनरारंभ कर सकते हैं, और बोर्ड को फिर से कनेक्ट करने का प्रयास कर सकते हैं।
क्योंकि मैं एक वर्चुअल मशीन के माध्यम से काम करता हूं, मुझे कई बार USB-COM एडाप्टर को फिर से कनेक्ट करना पड़ता है ताकि वर्चुअल मशीन द्वारा इसका पता लगाया जा सके, और होस्ट मशीन के पास टूटे ड्राइवरों को स्थापित करने का समय नहीं है।
एक अन्य विकल्प जो मुझे इस लेख को लिखने के दौरान काम करते हुए मिला, वह है लगातार खींचते तारों के बजाय बोर्ड पर एक बटन दबाना। हालाँकि, आपको किसी भी स्थिति में BOOT जम्पर को बंद और खोलना होगा। यह विकल्प काम करता है क्योंकि बटन को बाहरी
NRST रीसेट के पैर तक लाया जाता है।
अगली विंडो में, लक्ष्य डिवाइस का चयन करें लक्ष्य। वैसे, कभी-कभी यहां आप देख सकते हैं (शायद एक बग) सामान्य रूप से बाएं उपकरण, उदाहरण के लिए, एसटीएम 32 के बजाय एसटीएम 8 देखें - कहीं न कहीं किसी तरह की विफलता थी, उपचार प्रक्रिया ऊपर वर्णित है। इसलिए, इस चरण पर आप नेक्स्ट पर क्लिक करने के लिए जल्दी नहीं कर सकते, लेकिन हमेशा इस तथ्य पर ध्यान दें कि वांछित डिवाइस को लक्ष्य में चुना गया है।
कैसे निर्धारित करें कि हमारे पास कौन सा डिवाइस है? - हम चिप को देखते हैं और उस पर लिखे गए सभी चीजों को फिर से लिखते हैं। हम अपनी चिप पर
डेटाशीट को खोलते हैं, अनुभाग
आदेश जानकारी का वर्णन करता है कि कौन सा पत्र किसके लिए जिम्मेदार है। मेरे मामले में यह है:


मैं लक्ष्य में अपनी चिप (16K) का चयन करता हूं और आगे बढ़ता हूं। एक चिप के साथ 4 क्रियाओं का विकल्प दिया जाता है:
- मेमोरी मिटा दें (संपूर्ण क्षेत्र का चयन करें);
- डिवाइस पर फर्मवेयर लिखें;
- डिवाइस से फर्मवेयर पढ़ें;
- लिखने या पढ़ने की सुरक्षा को सक्षम / अक्षम करें।
2.3 बोर्ड से फर्मवेयर पढ़ें
जब मैंने पहली बार बोर्ड को कनेक्ट किया, तो मैंने मूल फर्मवेयर, एक प्रकार का बैकअप रखने का फैसला किया - अब हम इसे करेंगे। यह इंगित करना आवश्यक होगा कि इस फर्मवेयर को कहाँ सहेजना है और मेमोरी के किन पृष्ठों को सहेजना है, यह भी
चुनने के लिए एक
हेक्स ,
बिन या
s19 फ़ाइल प्रारूप का उपयोग करने का प्रस्ताव है।
पढ़ने के लिए मेमोरी पेज चुनें यदि आप बस फर्मवेयर को बोर्ड पर अपलोड करते हैं या बोर्ड से फर्मवेयर पढ़ते हैं, तो इन फ़ाइल स्वरूपों के बीच कोई अंतर नहीं है। निम्नलिखित एक प्रगति पृष्ठ है, जिस पर कभी-कभी प्रक्रिया लंबे समय तक (जरूरी नहीं कि 99) के लिए 99% तक जमा हो जाती है, लेकिन कुछ सेकंड के बाद यह माना जाता है कि यह सफलतापूर्वक पूरा होता है - वास्तव में, उसके बाद बोर्ड ने उस व्यवहार को नहीं दिया जो लोड किए गए फर्मवेयर के अनुरूप होगा। सीधे शब्दों में कहें, तो आपको सब कुछ फिर से जोड़ने और फ़र्मवेयर को फिर से भरने की ज़रूरत है, इस बारे में कुछ भी महत्वपूर्ण नहीं है।
फर्मवेयर फ़ाइल सहेज ली गई थी, और भविष्य में इसे बोर्ड पर अपलोड किया जा सकता है।
हालाँकि, यदि रीड प्रोटेक्शन स्थापित है, तो फर्मवेयर को पढ़ा नहीं जा सकता है।
२.४ बोर्ड चमकती
अब फर्मवेयर फाइल भरें, जिसके सोर्स कोड की राइटिंग नीचे दी गई है। आगे देखते हुए, मैं कहूंगा कि हम
बिन और
हेक्स फ़ाइलों को अपलोड करेंगे, क्योंकि विकास का माहौल उन्हें जारी करेगा।
S19 और
हेक्स फ़ाइलों के लिए अतिरिक्त सेटिंग्स समान हैं; उनके विपरीत,
बिन फ़ाइल में, आप उस पते का चयन कर सकते हैं जिसमें से फर्मवेयर रिकॉर्ड किया जाएगा, उपयोगिता में डिफ़ॉल्ट रूप से यह 8000000 (हमारे लिए उपयुक्त) है।
रिकॉर्डिंग के लिए तैयारी कर रहा है रिकॉर्डिंग से पहले, आप तीन विकल्पों में से एक का चयन करके माइक्रोकंट्रोलर की फ्लैश मेमोरी को साफ कर सकते हैं:
- आवश्यक पृष्ठ मिटाएँ (स्मृति के आवश्यक अनुभागों को साफ़ करें);
- कोई मिटा (शुद्धि के बिना);
- ग्लोबल इरेज़ (पूर्ण सफाई)।
वास्तव में, सफाई स्मृति को शून्य लिखने की प्रक्रिया है।
अभी भी वैकल्पिक बाइट्स हैं, लेकिन अभी तक आप उन्हें छू नहीं सकते हैं। अगला क्लिक करें, प्रक्रिया पूरी होने तक प्रतीक्षा करें, और आप कर रहे हैं।
यदि आप मेरा फर्मवेयर रिकॉर्ड करना चाहते हैं, तो आप इसे क्लाउड,
ब्लिंक.बिन फ़ाइल में पा सकते हैं। इस फर्मवेयर का उपयोग करते समय, PA4 पैर से अंतर्निहित एलईडी ब्लिंकिंग को ब्लिंक करना चाहिए।
3. कोड लेखन
3.0 CooCox CoIDE विकास पर्यावरण की स्थापना
आप आईडीई को
सॉफ्टपीडिया डॉट कॉम वेबसाइट से डाउनलोड कर सकते हैं, इससे पहले कि आप इसे एसटीएम वेबसाइट से और आईडीई वेबसाइट से डाउनलोड कर सकते हैं, लेकिन जब से आईडीई ने समर्थन करना बंद कर दिया है, यह असंभव हो गया है। कुछ भी महत्वपूर्ण नहीं है कि आईडीई अब समर्थित नहीं है, नहीं, क्योंकि कोड लिखने के लिए, मुख्य बात संकलक है। मैंने दोनों संस्करण डाउनलोड किए, लेकिन मैं 1.7.8 संस्करण का उपयोग करता हूं।
पर्यावरण का पहला प्रक्षेपण
यहां अच्छी तरह से वर्णित
है , अगला-> अगला-> अगला ... और कुछ भी जटिल नहीं है। मैं केवल इतना जोड़ूंगा कि पहले एक परियोजना बनाना बेहतर है, और फिर बाकी सब कुछ।
और फिर भी, यदि आपने रिपॉजिटरी टैब खो दिया है, तो आप इसे मेनू में देख सकते हैं
-> रिपॉजिटरी ।
आप
यहां पर्यावरण के लिए उपकरण (कंपाइलर) डाउनलोड कर सकते
हैं या Google से "हाथ के लिए ग्नू उपकरण" पूछ सकते हैं; मैंने एक विकल्प डाउनलोड किया है जिसमें अंत में sha1.exe है।
3.1 स्रोत फ्रेमवर्क
तो, परियोजना बनाई गई है, चिप का चयन किया गया है, अब हम परियोजना में न्यूनतम स्रोतों को जोड़ देंगे, जिसके बिना यह बिल्कुल भी नहीं रह पाएगा।
यह है कि इस परियोजना को कैसे देखा जाना चाहिए जब इसे बनाया जाता है, अर्थात। वहाँ केवल मुख्य main.c फ़ाइल है और अधिक कुछ नहीं CMSIS BOOT का चयन करें और वातावरण स्वचालित रूप से
M0 Cmsis Core का चयन करेगा, क्योंकि आश्रितों को इसकी आवश्यकता होती है।
अब हमें सूत्रों का न्यूनतम सेट मिलता है परियोजना को इकट्ठा करें (आइकन बनाएँ, या F7 कुंजी)। मेरे लिए अज्ञात कारणों से, हेक्स फ़ाइल एकत्र नहीं की गई थी (कंसोल में एक चेतावनी है); मैंने IDE और कंपाइलर को कई बार पुनर्स्थापित किया, प्रोजेक्ट को फिर से बनाया, लेकिन किसी कारण से वर्चुअल मशीन पर ऐसा परिणाम; दूसरे कंप्यूटर पर (आभासी नहीं, लेकिन वास्तविक) सब कुछ एक-पर-एक है और आउटपुट हेक्स पर काम कर रहा है। सौभाग्य से, बिन है।
परियोजना को सफलतापूर्वक इकट्ठा किया गया था मैं आपको फ़ाइल आकार पर ध्यान देने की सलाह देता हूं, यह कंसोल में आउटपुट के अंत में देखा जा सकता है, या आप इसे मानक तरीकों से देख सकते हैं (यहां, वैसे, आप देख सकते हैं कि हेक्स खाली है); उसी समय, यह स्क्रीनशॉट दिखाता है कि फर्मवेयर फाइलें प्रोजेक्ट फ़ोल्डर में हैं, फिर डीबग / बिन / यद्यपि कोड कुछ भी नहीं करता है, मैं यह सुनिश्चित करने के लिए बोर्ड को अपलोड करता हूं कि आप इसे अपलोड कर सकते हैं (उदाहरण के लिए, उपयोगिता इसे अस्वीकार नहीं करती है)। मैं पाठक को ऐसा करने की सलाह देता हूं। यदि यह काम नहीं करता है, तो बार-बार प्रयास करें, और टिप्पणियां लिखें।
3.2 फिंगर एल्गोरिदम
शुरू करने के लिए, हम एक एल्गोरिथ्म को स्केच करते हैं, मानव दृष्टिकोण से, माइक्रोकंट्रोलर एक एलईडी को ब्लिंक करेगा। और इसके लिए थोड़ा तर्क करना होगा।
प्रत्येक उपकरण संग्रहीत ऊर्जा के कारण काम करता है, उदाहरण के लिए, कुछ इंजन विभिन्न प्रकार के ईंधन पर चल सकते हैं, लेकिन इसके लिए इंजन को उस प्रकार के ईंधन के साथ समायोजित करने की आवश्यकता होती है जिसे हम इसे खिलाने जा रहे हैं। इसी तरह, ऊर्जा स्रोत के लिए माइक्रोकंट्रोलर को समायोजित (ट्यून) करने की आवश्यकता है - यह एल्गोरिथ्म
का पहला ब्लॉक होगा।
हम आगे कारण। डेस्कटॉप कंप्यूटर में एक मॉनिटर, स्पीकर, कीबोर्ड, माउस है ... और आप देख सकते हैं कि कुछ डिवाइस हमें जानकारी प्रदान करते हैं, और दूसरों की मदद से हम कंप्यूटर को जानकारी प्रदान करते हैं, लेकिन वे सभी उन सभी (सिस्टम यूनिट) के लिए एक बॉक्स से जुड़े हैं। आप अनुमान लगा सकते हैं कि माइक्रोकंट्रोलर सूचना प्राप्त कर सकता है और दे सकता है, जिसका अर्थ है कि उसके पैर एक संकेत प्राप्त कर सकते हैं या एक संकेत दे सकते हैं - यह एल्गोरिथ्म
का अगला ब्लॉक होगा।
इसके बाद, माइक्रोकंट्रोलर को एलईडी चालू करना चाहिए, थोड़ी देर प्रतीक्षा करें, एलईडी बंद करें, थोड़ी देर प्रतीक्षा करें और इसे चालू करें-प्रतीक्षा-बंद करें ...
नतीजतन, एल्गोरिथ्म कुछ इस तरह दिखाई देगा

इस फ़्लोचार्ट का उद्देश्य यह स्पष्ट रूप से दिखाना है कि एल्गोरिथ्म क्या करता है; सबसे पहले, योजना खुद के लिए लिखी जाती है, इसलिए हर कोई इसे लिखने के लिए स्वतंत्र है / जैसा वह चाहता है (अपने लिए) आकर्षित करना। मेरा मानना है कि इस योजना का उद्देश्य यथासंभव सरल, पठनीय और सहज ज्ञान युक्त होना चाहिए, जिसमें उच्च स्तर का अमूर्त होना चाहिए।
इस एल्गोरिथ्म के अनुसार, हम कोड लिखेंगे।
3.3 प्रलेखन के साथ काम करना
मैं खुले फ़ाइल
stm32f0xx.h के साथ लेख के इस भाग को पढ़ने की सलाह देता
हूं , जो कि हमारी परियोजना के
cmsis_boot फ़ोल्डर और खुले दस्तावेज़ में निहित है।
3.3.1 एक घड़ी स्रोत का चयन
सबसे पहले, आपको माइक्रोकंट्रोलर को शक्ति प्रदान करने की आवश्यकता है। माइक्रोकंट्रोलर को एडेप्टर से 5 वोल्ट प्राप्त होता है (एक मल्टीमीटर से मापा जाता है), लेकिन यह सवाल उठता है कि "माइक्रोकंट्रोलर किस आवृत्ति पर काम करता है", क्योंकि यह ज्ञात है कि इलेक्ट्रॉनिक्स विभिन्न आवृत्तियों पर काम करते हैं। सबसे पहले,
डेटाशीट खोलें, सामग्री में आप दो खंड देख सकते हैं जो अर्थ में प्रासंगिक हैं:
पावर प्रबंधन ,
घड़ियां और स्टार्टअप । पहला वोल्टेज और कम पावर मोड के बारे में है। दूसरा खंड वह छिपाता है जो हम इस समय रुचि रखते हैं। पहले से ही पहले वाक्य में यह कहा गया है कि "आंतरिक RC 8 MHz थरथरानवाला को रीसेट पर डिफ़ॉल्ट CPU घड़ी के रूप में चुना गया है", जिसका अर्थ है कि
डिफ़ॉल्ट रूप से MC को रीसेट करने के बाद, आंतरिक 8 MHz RC श्रृंखला को
मुख्य घड़ी स्रोत के रूप में चुना गया है।
इसके बाद कुछ अकल्पनीय क्लॉक ट्री स्कीम आती है, जिस पर हम थोड़ी देर बाद विचार करेंगे।
सख्ती से बोलना, आप वाक्यांश पर भरोसा कर सकते हैं "एमके को रीसेट करने के बाद डिफ़ॉल्ट रूप से ..." और लेख के इस हिस्से को तिरछे तरीके से पढ़ें।
अब आपको बोर्ड से विचलित होने और आंतरिक एलईडी की तलाश करने की आवश्यकता है। मुझे पता है कि सर्किट में डायोड को
डी 1 ,
डी 2 ..., यानी द्वारा दर्शाया गया है।
D == डायोड ,
रेज़र R7 के पास मेरे बोर्ड पर डायोड
D1 है ।
शायद, बोर्ड की सावधानीपूर्वक जांच करने के बाद, आप यह पता लगा सकते हैं कि डायोड को किस पैर से जोड़ा गया है, लेकिन मैं सर्किट बोर्ड की ओर रुख करूंगा। दुर्भाग्य से, बोर्ड के तत्व सर्किट में तत्वों को उनके स्थान से बिल्कुल मेल नहीं खाते हैं; लेकिन मुझे खुशी है कि मुझे इंटरनेट पर ऐसी योजना मिली (अन्यथा मुझे लंबे समय तक कुछ भी नहीं मिला)।

आरेख में हम देखते हैं कि डायोड के कैथोड को जम्पर
जे 2 के माध्यम से जमीन से जोड़ा जाता है, और एनोड एक अवरोधक के माध्यम से
पीए 4 से जुड़ा होता है।
पीए 4 का मतलब पोर्ट
ए का 4
वा आउटपुट है, जिसका अर्थ है कि एलईडी को बंद करने और बंद करने के लिए,
पीए 4 के आउटपुट में वोल्टेज की आपूर्ति करना आवश्यक होगा।
अगला, आपको यह निर्धारित करने की आवश्यकता है कि इस आउटपुट पर वोल्टेज कैसे लागू किया जाए। मेरे लिए, यह बिल्कुल सहज नहीं था, और लंबे समय तक मैंने डॉक्यूमेंटशीट की शुरुआत में ही
विवरण खंड में
ब्लॉक डायग्राम के साथ आने तक और साथ में प्रलेखन रखा। और इसमें मैंने क़ीमती ट्रैक देखा
PA [15: 0] <=> GPIO पोर्ट A <=> AHB डिकोडर <=> बस मैट्रिक्स <=> Cortex-M0 , i.e. पोर्ट
ए एक सामान्य-उद्देश्य I / O पोर्ट है और
AHB बस से जुड़ा हुआ है।
डायग्राम को ब्लॉक करें(छवि क्लिक करने योग्य है)

मैं ध्यान देता हूं कि इलेक्ट्रॉनिक्स में यह माइक्रोकंट्रोलर के आउटपुट को पोर्ट में तोड़ने के लिए प्रथागत है, और आमतौर पर पोर्ट में 16 आउटपुट होते हैं। आरेख से पता चलता है कि पोर्ट
ए ,
बी और
सी में सिर्फ 16 हैं, लेकिन पोर्ट
डी और
एफ में कम (16 से कम पिन हो सकते हैं, अधिक - नहीं)।
आइए
घड़ी के पेड़ की योजना पर वापस जाएं और
एएचबी द्वारा हस्ताक्षरित आउटपुट का पता लगाएं। हम यह पता लगाएंगे कि यह आउटपुट किस आवृत्ति पर काम करता है।
AHB को HCLK सिग्नल है, जो
HPRE डिवाइडर से
निकलता है । इस डिवाइडर को स्विच
SW से
SYSCLK सिग्नल मिलता है।
SWSCLK को
प्रोग्राम के रूप में सेट करने पर
SW इनपुट में कौन से सिग्नल का उपयोग किया जाएगा - फिर हम इसे कोड में सेट करेंगे। पसंद की पेशकश की है:
- एचएसआई - एक आंतरिक उच्च आवृत्ति जनरेटर से एक संकेत, यह एक 8 मेगाहर्ट्ज क्वार्ट्ज गुंजयमान यंत्र द्वारा निर्मित होता है, जिसे मैंने इस बोर्ड के साथ काम करने से पहले मिलाया था;
- PLLCLK - आवृत्ति गुणक PLLMUL से संकेत;
- एचएसई - बाहरी उच्च आवृत्ति जनरेटर से संकेत।
कोई भी विकल्प हमारे कार्य के लिए उपयुक्त है, मेरा सुझाव है कि उनमें से सबसे सरल और सबसे सस्ती -
एचएसआई ।
हम
संदर्भ पुस्तिका में जाएंगे और खंड
7 रीसेट और घड़ी नियंत्रण (आरसीसी) खोलेंगे , विशेष रूप से
7.2.6 प्रणाली घड़ी चयन , जहां एक बार फिर से हम डेटाशीट में पाए गए एक समान
शब्दांकन पर आते हैं: "सिस्टम रीसेट के बाद,
एचएसआई थरथरानवाला को सिस्टम के रूप में चुना जाता है। घड़ी "- अर्थात हमें कुछ भी नहीं करना है, एमके
एचएसआई पर शुरू होगा।
यह सुनिश्चित करने के लिए कि एमके वास्तव में इस स्रोत से काम करेगा, मैं इसे कार्यक्रम में स्पष्ट रूप से लिखूंगा; उन रजिस्टरों पर स्क्रॉल करें जो रीसेट करने और क्लॉकिंग के लिए ज़िम्मेदार हैं (धारा
7.4 आरसीसी रजिस्टर )। प्रलेखन में वर्णित पहला रजिस्टर
घड़ी नियंत्रण रजिस्टर (RCC_CR) है ; नीचे बिट्स का वर्णन है, जो किसके लिए जिम्मेदार है।
हम
एचएसआईएन शून्य बिट में रुचि रखते हैं, जो गुंजयमान यंत्र (
0 - ऑफ,
1 - ऑन) को चालू करने के लिए जिम्मेदार है।
इस प्रकार,
RCC_CR रजिस्टर में एक लिखना आवश्यक होगा। (शून्य बिट एक है, या 2
0 = 1)।
अब हम
stm32f0xx.h में
RCC (
#define RCC ) की परिभाषा दर्ज करते हैं।
जैसा कि आप देख सकते हैं, यह
RCC_BASE पर स्थित संरचना है; पता
0x40021000 , यदि आप सभी
परिभाषित का विस्तार करते
हैं , तो वही पता
संदर्भ मैनुअल में खंड
2.2.2 मेमोरी मैप में देखा जा सकता है
और सीमा एड्रेस और
रजिस्टर 5 मेमोरी मैपिंग (
एएचबी क्षेत्र) में डेटाशीट में देखा जा सकता है।
आरसीसी ब्लॉक
सीआर रजिस्टर में
एचएसआई को सक्षम करने के लिए एक इकाई लिखने के लिए, आपको कोड की एक पंक्ति की आवश्यकता है
RCC->CR |= 0x1;
३.३.२ पैर लगाना
एलईडी को नजरअंदाज करने और सिग्नल को बंद करने के लिए माइक्रोकंट्रोलर के पैर को एक संकेत भेजना ताकि एलईडी सरल कार्य हो, और इसलिए यह
GPIO फ़ंक्शन (सामान्य प्रयोजन इनपुट-आउटपुट पोर्ट) पर लागू होता है।
डिफ़ॉल्ट रूप से, एमके पैर जुड़े नहीं हैं, अर्थात। आउटपुट अनिश्चितता है। एक बंदरगाह को कनेक्ट करना आवश्यक है, जिसके पैर एलईडी को शक्ति देगा। इससे पहले, हमने निर्धारित किया कि
GPIO पोर्ट
AHB बस से जुड़े हैं - आपको इस बस को लेने की जरूरत है। खंड
7.4 आरसीसी रजिस्टरों (रीसेट और नियंत्रण नियंत्रण रजिस्टर) के माध्यम से फ्लिप करना जारी है, हम अनुभाग
7.4.6 एएचबी परिधीय घड़ी सक्षम रजिस्टर (
आरसीसी_एएचबीएनआर ,
एएचबी बस
घड़ी सक्षम रजिस्टर )
पाते हैं । इससे पहले, मैंने निर्धारित किया कि मेरा एलईडी
पीए 4 पैर से जुड़ा है - तदनुसार, मुझे पोर्ट
ए से निपटने के लिए रजिस्टर के 17 वें बिट को एक इकाई लिखने की आवश्यकता है
।AHB परिधीय घड़ी सक्षम रजिस्टर तदनुसार, कोड होना चाहिए
RCC->AHBENR |= (1 << 17);
या, जो एक ही बात है
RCC->AHBENR |= 0x20000;
या तो
#define फ़ाइल का उपयोग करके
stm32f0xx.h लिखें
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
हमारे पास पोर्ट
ए है , अब हमें एमके को सूचित करने की आवश्यकता है कि
पीए 4 बाहर निकलने पर काम करेगा - हम अनुभाग
8 सामान्य-उद्देश्य I / Os (GPIO) पढ़ेंगे; अनुभाग का परिचय पहले से ही कहता है, "प्रत्येक सामान्य-उद्देश्य I / O पोर्ट में चार 32-बिट कॉन्फ़िगरेशन रजिस्टर (
GPIOx_MODER ,
GPIOx_OTYPER ,
GPIOx_OSPEEDR और
GPIOx_PODDR ), दो 32-बिट डेटा रजिस्टर (
GPIOx_IDR और
GPIOx_ODR ) हैं ..."
पोर्ट में 4 ट्यूनिंग रजिस्टर और 2 डेटा रजिस्टर हैं - यह वही है जो हमें चाहिए (पोर्ट
ए , या
पीए 4 आउटपुट कॉन्फ़िगर करें, और समय-समय
पर इसे 0 और
1 भेजें)। क्या हो रहा है की एक बेहतर समझ (सिद्धांत) के लिए, आप इस अनुभाग को पढ़ सकते हैं, लेकिन मैं खंड
8.4 GPIO रजिस्टरों को नीचे स्क्रॉल करता हूं और विवरण के अनुसार पोर्ट को कॉन्फ़िगर करता हूं।
- पोर्ट मोड - निकास। प्रलेखन के अनुसार, संबंधित रजिस्टर ( GPIOA_MODER ) के संबंधित क्षेत्र ( MODER4 ) में 01 लिखना आवश्यक है, अर्थात बिट्स 9 और 8 : 9 वीं बिट में 8 वीं इकाई में शून्य होना चाहिए:
GPIOA->MODER |= (1 << 8); //
GPIOA->MODER |= 0x100; //
GPIOA->MODER |= GPIO_MODER_MODER4_0;
- आउटपुट का प्रकार । ईमानदारी से, मैं अभी भी इस मामले की सर्किटरी का पूरी तरह से पता नहीं लगा पाया हूं (मैं समझूंगा, मंचों को फिर से पढ़ें, आदि), लेकिन एमके आउटपुट के कॉन्फ़िगरेशन पर अन्य संसाधनों का अध्ययन, साथ ही तर्क और अंतर्ज्ञान, यह सुझाव देता है कि एक धक्का होना चाहिए। -पुल और उसके बाद पुल-अप होना चाहिए। किसी भी मामले में, कोड लिखा है, सब कुछ काम करता है और कुछ भी नहीं जलाया जाता है। जलने का एक वास्तविक जोखिम है यदि आप खुले-नाली प्रकार और शॉर्ट सर्किट इस आउटपुट को किसी अन्य डिवाइस के साथ चुनते हैं, जैसा कि यह एक खुला निकास है और किसी भी चीज़ द्वारा संरक्षित नहीं है। इसके अलावा, हमारे पास डायोड के सामने एक वर्तमान-सीमित अवरोधक है - यह निश्चित रूप से यहां नहीं जलाएगा।
प्रलेखन के बाद, 4 बिट में शून्य लिखना आवश्यक है; प्रलेखन यह भी बताता है कि रीसेट के बाद शून्य होगा।
GPIOA->OTYPER &= ~(1 << 4); //
GPIOA->OTYPER &= ~0x10; //
GPIOA->OTYPER &= ~GPIO_OTYPER_OT_4;
GPIO पोर्ट आउटपुट प्रकार रजिस्टर
- उत्पादन की गति । हमारे मामले में, इससे कोई फर्क नहीं पड़ता, लेकिन निष्ठा के लिए मैं यहां शून्य लिखूंगा।
GPIOA->OSPEEDR &= ~(1 << 8); //
GPIOA->OSPEEDR &= ~0x100; //
GPIOA->OSPEEDR &= ~GPIO_OSPEEDER_OSPEEDR4_0;
GPIO पोर्ट आउटपुट स्पीड रजिस्टर
- एक लिफ्ट । क्योंकि आउटपुट एलईडी को शक्ति देगा, आपको इसे शक्ति तक खींचने की आवश्यकता है, अर्थात। खींच-तान ।
पोर्ट ए के 4 वें पिन को कसने के लिए आवश्यक है; प्रलेखन कहता है कि इसके लिए क्रमशः 9 और 8 बिट्स में शून्य और एक लिखना आवश्यक है।
GPIOA->PUPDR |= (1 << 8); //
GPIOA->PUPDR |= 0x100; //
GPIOA->PUPDR |= GPIO_PUPDR_PUPDR4_0;
GPIO पोर्ट पुल-अप / पुल-डाउन रजिस्टर
3.3.3 / बंद और देरी पर एलईडी
इससे पहले हम पढ़ते हैं कि प्रत्येक पोर्ट में क्रमशः
IDR और
ODR डेटा रजिस्टर - इनपुट और आउटपुट डेटा रजिस्टर शामिल हैं। तार्किक शून्य और एमके पैर पर वाले - क्या यह डेटा है? - हाँ, डेटा। डेटा माइक्रोकंट्रोलर (
इनपुट हो ) के बाहर से आ सकते हैं और माइक्रोकंट्रोलर से बाहर निकल कर दूसरे डिवाइस (
आउटपुट ) पर जा
सकते हैं । एमके पैर पर इकाई एक उच्च वोल्टेज स्तर की उपस्थिति है, अर्थात। यदि आप एक को आउटपुट में लाते हैं, तो वोल्टेज होगा, और यह एलईडी हमारे एलईडी को पावर दे सकता है। माइक्रोकंट्रोलर लेग के लिए एक यूनिट का आउटपुट इस यूनिट को
ODR आउटपुट रजिस्टर में लिखने की तुलना में कुछ और है।
GPIO पोर्ट आउटपुट डेटा रजिस्टर प्रलेखन के अनुसार, हम देखते हैं कि प्रत्येक पोर्ट (
ए ,
बी ,
सी ,
डी ,
एफ ) के लिए 32-बिट रजिस्टर है, हालांकि। पोर्ट में 16 से अधिक पिन नहीं हो सकते हैं, फिर रजिस्टर के पहले 16 बिट्स का उपयोग किया जाता है। प्रत्येक बिट एक पोर्ट नंबर (पिन) से मेल खाती है। एक इकाई को
PA4 लेग में आउटपुट करने के लिए, किसी को 4 बिट पर एक यूनिट लिखने के लिए, एक शून्य को आउटपुट करने के लिए - 4 जी बिट पर एक शून्य लिखना होगा, अर्थात्। आउटपुट से वोल्टेज निकालें।

एलईडी को चालू करने के लिए कोड इस तरह दिखेगा
GPIOA->ODR |= (1 << 4); //
GPIOA->ODR |= 0x10; //
GPIOA->ODR |= GPIO_ODR_4;
एलईडी बंद करने के लिए कोड
GPIOA->ODR &= ~(1 << 4); //
GPIOA->ODR &= ~0x10; //
GPIOA->ODR &= ~GPIO_ODR_4;
लेकिन अगर आप चालू करने के लिए लाइन के बाद एलईडी को बंद करने के लिए लाइन लिखते हैं, तो एलईडी नहीं झपकेगी (यदि आप क्या होता है में रुचि रखते हैं - आप कोशिश कर सकते हैं; कुछ भी नहीं जलाएगा, यह पहले ही ऊपर चर्चा की जा चुकी है) - तो आपको देरी करने की आवश्यकता है। टाइमर का उपयोग देरी के लिए किया जाता है, लेकिन टाइमर एक अलग लेख (जटिलता के कारण) के योग्य हैं, इसलिए हम एक बैसाखी देरी करेंगे: हम निष्क्रिय चक्र चलाएंगे। एक बिंदु है:
यदि कंपाइलर ऑप्टिमाइज़ेशन सक्षम है , तो
कंपाइलर हमारे निष्क्रिय चक्र
को काट देगा और इसमें कोई देरी नहीं होगी। सुनिश्चित करें कि अनुकूलन सक्षम नहीं है। ऐसा करने के लिए, प्रोजेक्ट कॉन्फ़िगरेशन (प्रोजेक्ट ट्री में प्रोजेक्ट नाम पर राइट-क्लिक करें) पर जाएं और
कंपाइल टैब में
कंपाइल कंट्रोल स्ट्रिंग लाइन की जांच
करें : इसमें
-O0 तर्क ("शून्य के बारे में" का अर्थ है कि ऑप्टिमाइज़ेशन अक्षम है)। यदि आपने मेरे निर्देशों के अनुसार सब कुछ एकत्र किया है, तो सबसे अधिक संभावना है कि आपके पास
-O0 भी होगा, क्योंकि यह डिफ़ॉल्ट रूप से था और मैंने यहां कुछ भी नहीं देखा था। तर्क
-O1 -O2 -O3 का अर्थ है कि संबंधित स्तर का अनुकूलन सक्षम है।
कंपाइलर ऑप्टिमाइज़ेशन चेक एक निष्क्रिय चक्र इस तरह लिखा जा सकता है:
int t = 4000000; while(t > 0) t--;
मैंने
t का मान सेट नहीं किया है, मैंने इस तरह तर्क दिया है: यदि माइक्रोकंट्रोलर 8MHz पर चलता है, तो यह एक सेकंड में लगभग 8,000,000 निर्देशों को निष्पादित करेगा, यदि आप गहराई से अतिरंजित करते हैं, तो एक आधे सेकंड की देरी के लिए आपको चक्र को 4,000,000 बार चलाने की आवश्यकता होगी।
बेकार चक्र को एलईडी चालू करने के बाद, और इसे बंद करने के बाद चलाने की आवश्यकता होगी, और यह सब एक साथ लूप।
३.४ संहिता लिखना और भागना
आइए कोड की सभी पंक्तियों को एक साथ रखें जो हमने पहले लिखा था। आपको
stm32f0xx.h हेडर फ़ाइल भी शामिल करनी होगी हमने इस पर भरोसा किया और इसे संरचनाओं, पतों और मूल्यों की परिभाषा से लिया। परिणाम होना चाहिए:
#include "stm32f0xx.h" int main(void) { int t; // '' RCC->CR |= 0x1; // HSI RCC->AHBENR |= RCC_AHBENR_GPIOAEN; // A GPIOA->MODER |= GPIO_MODER_MODER4_0; // PA4 GPIOA->OTYPER &= ~GPIO_OTYPER_OT_4; // push-pull PA4 GPIOA->OSPEEDR &= ~GPIO_OSPEEDER_OSPEEDR4_0; // PA4 GPIOA->PUPDR |= GPIO_PUPDR_PUPDR4_0; // pull-up PA4 while(1) { GPIOA->ODR |= GPIO_ODR_4; // PA4 t = 4000000; while(t > 0) t--; // GPIOA->ODR &= ~GPIO_ODR_4; // PA4 t = 4000000; while(t > 0) t--; // } }
उपयोगिता के माध्यम से बोर्ड पर कोड को फिर से बनाएँ और भरें पर क्लिक करें।

बोर्ड के लिए एक नया फर्मवेयर लॉन्च करने के लिए, BOOT जम्पर को बंद करने और एक रीसेट (RESET) करने के लिए मत भूलना।
4. निष्कर्ष
कोड लिखा है, सब कुछ काम करता है। फोर्सेस का खर्च कम हुआ। मुझे खुशी है कि प्रलेखन के आधार पर, यह वर्किंग कोड लिखने के लिए निकला, मोटे तौर पर इस तथ्य के कारण कि एसटीएम के पास उच्च गुणवत्ता वाले दस्तावेज हैं।
योजना यह है कि कैसे एक आईडीई के बिना, हाथ से सब कुछ इकट्ठा करने के लिए एक लेख लिखना है, कंसोल के माध्यम से,
सच्चे oldschool , आदर्श रूप से ताकि यह सब लिनक्स के तहत किया जा सके। अब मैं PWM और ADCs (इस बोर्ड पर भी) पर काम कर रहा हूं - मैं उन पर एक लेख भी लिखूंगा।