वर्तमान समय में RTC को कॉन्फ़िगर करने के लिए ST-LINK उपयोगिता का उपयोग करना


9

मैं क्या कर रहा था

मैं एक एसटीएम 32 माइक्रोकंट्रोलर का उपयोग कर रहा हूं और अपनी परियोजना के लिए मुझे दिन के विशिष्ट समय पर डेटा भेजने में सक्षम होने की आवश्यकता है (जैसे, सुबह 11 बजे और दोपहर 2 बजे)। माइक्रोकंट्रोलर को यह जानने की जरूरत है कि इससे पहले कि मैं यह हासिल कर सकूं। दुर्भाग्य से, मेरे पास केवल एक-तरफ़ा संचार है, और इसलिए मैं नेटवर्क से वर्तमान समय का अनुरोध नहीं कर सकता।

इसलिए मैं प्रोग्रामिंग करने के बाद सीधे वर्तमान समय सेट करना चाहता हूं। मुझे पता था कि मैं निम्नलिखित कमांड का उपयोग करके एसटी-लिंक यूटिलिटी कमांड लाइन इंटरफेस (एसटी- LINK_CLI) का उपयोग कर फ्लैश में डेटा लिखने में सक्षम हूं:

ST-LINK_CLI.exe -w32 <Address> <data> -Rst

मैंने एक साधारण परीक्षण स्क्रिप्ट लिखी है जो यूनिक्स समय के टिकट को कुछ पते पर लिखता है जो वर्तमान में कोड द्वारा उपयोग नहीं किया गया है।

मैं समय-स्टांप को पढ़ने और आरटीसी समय निर्धारित करने के लिए इसका उपयोग करने के लिए एक फ़ंक्शन लिखने वाला था। जब तक मैं एसटी-लिंक उपयोगिता उपयोगकर्ता मैनुअल में निम्नलिखित पढ़ता हूं :

-32 फ्लैश मेमोरी, ओटीपी, एसआरएएम और आर / डब्ल्यू रजिस्टरों को लिखने का समर्थन करता है।

जब मैनुअल कहता है कि यह आर / डब्ल्यू रजिस्टरों को लिखने का समर्थन करता है, तो क्या इसका मतलब है कि मैं सीधे आरटीसी रजिस्टरों तक पहुंच सकता हूं और उन्हें सेट कर सकता हूं? मैंने कोशिश की है, लेकिन मैं इन रजिस्टरों को नहीं लिख सकता।

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


मैं क्या करने का इरादा था

RTC रजिस्टर सेट करने के लिए, मैंने निम्नलिखित चरणों को करने की कोशिश की, जैसा कि STM संदर्भ नियमावली में वर्णित है :

  • PWR_CR रजिस्टर में DPB बिट सेट करें
  • RTC_WPR रजिस्टर को 0xCA लिखें
  • RTC_WPR रजिस्टर में 0x53 लिखें
  • RTC_ISR रजिस्टर में INIT बिट सेट करके RTC को रोकें
  • RTC_PRER रजिस्टर पर लिखकर 1Hz घड़ी चुनें
  • RTC_TR रजिस्टर में लिखकर वर्तमान समय लोड करें
  • RTC_DR रजिस्टर पर लिखकर वर्तमान तिथि को लोड करें
  • RTC_ISR रजिस्टर में INIT बिट को रीसेट करके RTC शुरू करें

रजिस्टरों तक पहुँचने के लिए, मैंने निम्नलिखित पतों का उपयोग किया है:

  • PWR_CR: 0x4000 7000
  • RTC_WPR: 0x4000 2824
  • RTC_ISR: 0x4000 280C
  • RTC_PRER: 0x4000 2810
  • RTC_TR: 0x4000 2800
  • RTC_DR: 0x4000 2804

क्या गलत हुआ

मैं इनमें से किसी भी रजिस्टर में नहीं लिख पा रहा हूँ। ST-LINK उपयोगिता के साथ, मुझे निम्नलिखित संदेश मिलता है:

स्मृति लेखन के दौरान त्रुटि हुई!

ST-LINK_CLI का उपयोग करना:

0x00000100 0x40007000 पर लिख रहा है ... त्रुटि!

इन रजिस्टरों को पढ़ना कोई समस्या नहीं है, लेकिन मैं एसटी-लिंक उपयोगिता या इसके कमांड लाइन इंटरफेस का उपयोग करके उन्हें नहीं लिख सकता।


प्रश्न

मैं एसटी-लिंक उपयोगिता का उपयोग करके आर / डब्ल्यू रजिस्टरों को कैसे लिख सकता हूं?

क्या आरटीसी के रजिस्टरों को लिखने की अनुमति देने के लिए किसी प्रकार की लिखना सुरक्षा है जिसे मैंने अनदेखा कर दिया था?


जब तक एक कुंजी-कोड दर्ज नहीं किया जाता है, संभवतः लिख-संरक्षित।
स्पार्की 256

मुझे खुशी है कि आपको शुरुआती संकेतों से बहुत कुछ पता चल गया है। आम तौर पर आपको प्रश्न को संपादित करने के बजाय एक उत्तर के रूप में एक समाधान पोस्ट करना चाहिए, और विशेष रूप से जब आपने इसे अभी तक खुद ही आगे बढ़ाया है तो अंततः अपनी स्वीकार्यता को उस पर स्थानांतरित करना उचित होगा।
क्रिस स्ट्रैटन

मैं वास्तव में इस तरह से नहीं सोचा है! मुझे ऐसा लगता है कि मुझे अभी भी ऐसा करना चाहिए, भले ही मैं आपको कुछ क्रेडिट देना चाहता हूं।
स्पेक्ट्रे 208

प्रोग्रामिंग करने के बाद आपके डिवाइस को कब तक चलना है, और दिन का समय कितना सही है? मुझे बस इस बात की चिंता है कि आरटीसी आपके लिए कितना भी सही क्यों न हो, अंतत: थोड़ा बहाव करने वाला है, कम से कम अगर इसका इस्तेमाल सालों से किया जा रहा है और आपकी समय की जरूरतें सख्त हैं।
तिमो

यह एक बैटरी पर 10 साल तक चलने वाला है। हालांकि, सभी डिवाइसों को एक साथ अपना डेटा भेजने से रोकने के लिए समय योजना पहले से ही कुछ यादृच्छिक संख्या से थोड़ा संशोधित हो जाती है। आरटीसी समय बहाव इसलिए कोई बड़ी बात नहीं है।
स्पेक्ट्रे 208

जवाबों:


4

कुछ रजिस्टर केवल एक विशिष्ट एक्सेस चौड़ाई के लिए कानूनी हैं (जैसे -w32 सही नहीं हो सकते हैं), या लिखित मानों को वापस नहीं पढ़ सकते हैं जो सत्यापन के साथ समस्या पैदा कर सकते हैं।

चीजों तक पहुंचने पर अनुक्रम या राज्य प्रतिबंध भी हो सकते हैं।

एक विकल्प जो सबसे बोधगम्य मुद्दों के आसपास काम करना चाहिए, वह काम करने के लिए एक छोटे से कार्यक्रम को तैयार करना होगा जो रैम में चलाने के लिए जुड़ा होगा। आप ऑफसेट का पता लगाने के बाद डेटा को इसके बाइनरी में स्थानापन्न कर सकते हैं, संशोधित संस्करण अपलोड कर सकते हैं, और इसे चला सकते हैं। या आप प्रोग्राम को फ़ाइल के एक्स्टेंट के बाहर रैम के एक क्षेत्र से मान प्राप्त कर सकते हैं, जिसे आप चलाने से पहले सेट करेंगे। स्टिंकर के महीन दानेदार नियंत्रण के साथ, आप CPU रजिस्टरों में मान भी पास कर सकते हैं, हालाँकि आपको एसटी के बजाय वैकल्पिक ओपन सोर्स कमांड लाइन प्रोग्राम की आवश्यकता हो सकती है (रैम की यह छोटी सी रुटीन संयोगवश संयोगवश उस प्रोग्राम को कैसे पूरा करती है फ़्लैश करना)


3

इसलिए, समस्याओं में से एक था, जैसा कि क्रिस स्ट्रैटन ने बताया:

कुछ रजिस्टर .. लिखित मूल्यों को वापस नहीं पढ़ सकते हैं जो सत्यापन में समस्या पैदा कर सकते हैं।

इसका मतलब यह था कि सत्यापन विफल हो गया, जिससे त्रुटि प्रदर्शित हुई, भले ही लेखन ऑपरेशन वास्तव में सफल रहा।

नीचे पीडब्लूआर_आईएसआर रजिस्टर पढ़ते समय, आईआईटी बिट सेट करते हुए, फिर से रजिस्टर फिर से पढ़ने पर मुझे नीचे दी गई प्रतिक्रिया है:

0x4000280C: 00000027

0x40000280C पर 0x00000080 लिखना ... त्रुटि!

0x4000280C: 000000A7

पता मैच से पता और पढ़ने के लिए लिखे गए मान पर ST-LINK यूटिलिटी जाँच का सत्यापन। इस स्थिति में, लेखन कार्रवाई सफल रही, भले ही दोनों मान मेल नहीं खाते, क्योंकि INIT बिट अब सेट है।

दूसरी समस्या यह थी कि मैं लेखन संचालन के प्रभाव को नोटिस नहीं कर सकता था। माइक्रोकंट्रोलर से कनेक्ट होने के दौरान, इसे एसटी-लिंक द्वारा रीसेट स्थिति में रखा जाता है (जिसे "रीसेट के तहत कनेक्ट करें" के रूप में जाना जाता है)। मुझे HOTPLUG कनेक्ट विकल्प का उपयोग करने की आवश्यकता थी, जो बिना रुके या रीसेट किए माइक्रोकंट्रोलर से जुड़ जाता है।

"कनेक्ट अंडर रीसेट" विकल्प किसी भी निर्देश को निष्पादित करने से पहले लक्ष्य से कनेक्ट करने की अनुमति देता है। यह कई मामलों में उपयोगी है जैसे जब लक्ष्य में एक कोड होता है जो JTAG / SWD पिन को निष्क्रिय करता है।

"हॉटप्लग" विकल्प बिना रुके या रीसेट किए लक्ष्य से जुड़ने की अनुमति देता है। एप्लिकेशन चलने के दौरान रैम एड्रेस या आईपी रजिस्टर को अपडेट करने के लिए यह उपयोगी है

बैच फ़ाइल पूरी तरह से काम करती है जैसा मैं चाहता था! कमांड अब इस तरह दिखता है:

ST-LINK_CLI.exe -c HOTPLUG -w32 <Address> <data> -w32 <Address> <data> ...

1

मुझे लगता है कि क्या हो रहा है कि लिखने के बाद, एक सत्यापन रीड किया जाता है। यदि एक ही रजिस्टर एक पढ़ने में वर्तमान समय में रिटर्न करता है, हालांकि आप आरटीसी को अपडेट करने में सफल होते हैं, तो डिबगर का एहसास नहीं होगा। यह पावर रजिस्टर के साथ एक समस्या की व्याख्या करने की कम संभावना है (जब तक कि डिबगर उस रजिस्टर को हुड के नीचे भी एक्सेस कर रहा है)। मैन्युअल रूप से पढ़ने के मूल्य की जाँच करें। यदि कोई अधिक महत्वपूर्ण समस्या थी, तो यह पढ़ा भी विफल हो सकता है। इसके अलावा, अपनी सूची में अन्य रजिस्टरों का प्रयास करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.