2016-01-19 8 views
5

के लिए पता लगाता है मुझे STM32L0 पर काम करने के लिए ऑटो-बॉड रेट डिटेक्शन नहीं मिल सकता है। मैं हार्डवेयर abstraction परत (एचएएल) का उपयोग कर रहा हूँ।ऑटो बॉड रेट एसटीएम 32 एल 0

मेरे initilization कोड है:

/* USART1 init function */ 
void MX_USART1_UART_Init(void) 
{ 

    huart1.Instance = USART1; 
    huart1.Init.BaudRate = 300; 
    huart1.Init.WordLength = UART_WORDLENGTH_9B; 
    huart1.Init.StopBits = UART_STOPBITS_1; 
    huart1.Init.Parity = UART_PARITY_EVEN; 
    huart1.Init.Mode = UART_MODE_TX_RX; 
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; 
    huart1.Init.OverSampling = UART_OVERSAMPLING_16; 
    huart1.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED; 
    huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_AUTOBAUDRATE_INIT; 
    huart1.AdvancedInit.AutoBaudRateEnable = UART_ADVFEATURE_AUTOBAUDRATE_ENABLE; 
    huart1.AdvancedInit.AutoBaudRateMode = UART_ADVFEATURE_AUTOBAUDRATE_ONSTARTBIT; 
    HAL_UART_Init(&huart1); 


} 

बाइट्स मैं UART1 से अधिक भेज रहा है:

 0 1 2 3 4 5 6 7 8 
000x 68 0B 0B 68 53 FD 52 FF FF .. etc. 

0x68 = 0b01101000 
0x0B = 0b00001011 
0xFD = 0b11111101 <-- Character starting with 1, baudrate should be detected 


0xFD : 
    start 1 1 ..... 
___ bit __________ 
    ¦______¦ 
... 

क्यों baudrate नहीं पता लगाया जा रहा है? मैं कोशिश की है:

UART_ADVFEATURE_AUTOBAUDRATE_ONSTARTBIT और UART_ADVFEATURE_AUTOBAUDRATE_ONFALLINGEDGE

तो मैं मोड सेटिंग के कालक्रम समायोजित और से चालक में सक्षम करने के लिए:

/* if required, configure auto Baud rate detection scheme */    
    if(HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_AUTOBAUDRATE_INIT)) 
    { 
    assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATE(huart->AdvancedInit.AutoBaudRateEnable)); 
    MODIFY_REG(huart->Instance->CR2, USART_CR2_ABREN, huart->AdvancedInit.AutoBaudRateEnable); 
    /* set auto Baudrate detection parameters if detection is enabled */ 
    if(huart->AdvancedInit.AutoBaudRateEnable == UART_ADVFEATURE_AUTOBAUDRATE_ENABLE) 
    { 
     assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATEMODE(huart->AdvancedInit.AutoBaudRateMode)); 
     MODIFY_REG(huart->Instance->CR2, USART_CR2_ABRMODE, huart->AdvancedInit.AutoBaudRateMode); 
    } 
    } 

को
/* if required, configure auto Baud rate detection scheme */    
    if(HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_AUTOBAUDRATE_INIT)) 
    { 
    assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATE(huart- 
    /* set auto Baudrate detection parameters if detection is enabled */ 
    if(huart->AdvancedInit.AutoBaudRateEnable == UART_ADVFEATURE_AUTOBAUDRATE_ENABLE) 
    { 
     assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATEMODE(huart->AdvancedInit.AutoBaudRateMode)); 
     MODIFY_REG(huart->Instance->CR2, USART_CR2_ABRMODE, huart->AdvancedInit.AutoBaudRateMode); 
    } 
    MODIFY_REG(huart->Instance->CR2, USART_CR2_ABREN, huart->AdvancedInit.AutoBaudRateEnable); 
    } 

नहीं करता कुछ भी करो

इसके अलावा निम्नलिखित ठीक लग रहा है:।

घड़ी स्रोत आवृत्ति की उम्मीद संचार की गति (जब 16 से oversampling, बॉड दर/65535 fck के बीच है और fck/16 साथ संगत होना चाहिए जब 8 से oversampling, baudrate एफकेसी/65535 और एफकेसी/8 के बीच है)।

मैं 16 से oversampling रही है, इसलिए

fCK= 16000000 

fCK > 16000000/65535 = 244  = 244 Hz 
fCK < 16000000/16 = 1000000 = 1 MHz 

मेरे पसंद के baudrate रहे हैं: 19200/ 9600 /2400 /300

+0

"मुझे खेद है; मैं ऐसा नहीं कर सकता, फ्लाइंग स्विसमैन।" –

उत्तर

3

यदि आप एसटीएम 32 एल 0 के ऑटो बॉड रेट डिटेक्शन हार्डवेयर द्वारा जांच के लिए एक बाइट की सटीक सामग्री निर्दिष्ट करने में असमर्थ हैं, तो आप अभी भी निम्नलिखित धारणाओं को "अपनी खुद की" ऑटो बॉड रेट डिटेक्शन योजना "रोल" करने में सक्षम हो सकते हैं

  • यह ऑटो बॉड का पता लगाने की प्रक्रिया के दौरान सन्निहित प्राप्त पात्रों में से एक मनमाना संख्या त्यागने के लिए अनुमति है: आपके सिस्टम के लिए बनाया जा सकता है।

  • किसी भी मनमाने ढंग से अंतराल के दौरान जहां कई वर्ण प्राप्त किए जा रहे हैं, यह माना जा सकता है कि बिट अनुक्रम 010 या 101 अपेक्षाकृत सामान्य घटना है।

  • डिवाइस एक उपलब्ध सामान्य प्रयोजन टाइमर परिधीय कि USART आरएक्स संकेत के रूप में एक ही डिवाइस पिन करने के लिए मैप किया जा सकता है।

तो ऊपर के सभी सही हैं, तो आप अपने खुद ऑटो बॉड दर का पता लगाने योजना चिप पर सामान्य प्रयोजन टाइमर बाह्य उपकरणों में से एक के इनपुट पर कब्जा सुविधा का उपयोग करके बना सकते हैं। इन टाइमर को आंतरिक घड़ी के रूप में आंतरिक 16 मेगाहट्र्ज घड़ी का उपयोग करने के लिए कॉन्फ़िगर किया जा सकता है। प्रत्येक टाइमर में 16-बिट काउंटर होता है। 16 मेगाहर्ट्ज घड़ी के साथ, टाइमर में (1/16,000,000 हर्ट्ज) = 62.5 एनएस नाड़ी माप संकल्प होता है।

एक बिट की अवधि अपना पसंदीदा बॉड दर पर इस प्रकार है:

Baud Microseconds 62.5-nS Clocks 
---- ------------ -------------- 
    300  3,333.3   53,333 
2400  416.7   6,667 
9600  104.2   1,667 
19200   52.1   833 

आप इनपुट पर कब्जा मोड में टाइमर सेट अप करना होगा, और यह दो आसन्न किनारे संक्रमण के बीच घड़ियों की संख्या की गिनती है । अपेक्षाकृत उच्च संख्या के नमूनों के लिए इस ऑपरेशन को निष्पादित करें, 100 कहें। उनमें से कई नमूने दो या दो से अधिक आसन्न शून्य, या दो या अधिक आसन्न लोगों की चौड़ाई का प्रतिनिधित्व करेंगे। लेकिन आप सबसे कम नमूना देख रहे हैं। यदि आपको 831 और 835 गणनाओं के बीच कोई मिलता है, तो आप उचित रूप से आश्वस्त हो सकते हैं कि बॉड दर 1 9 200 है। 100 नमूने के बाद, यदि आपको सबसे कम मिला 1665 और 1669 के बीच था, तो आप बॉड रेट मान सकते हैं 9600. और इतने पर।

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

+0

आपको बहुत धन्यवाद –

+0

एक पिटी मैं हार्डवेयर का उपयोग नहीं कर सकता .. –

2
डेटापत्रक से

(This one, पेज 759)। "ऑटो बॉड रेट डिटेक्शन को सक्रिय करने से पहले, ऑटो बॉड रेट डिटेक्शन मोड को चुना जाना चाहिए"। -> करने के लिए अपने लाइनों स्विच करने का प्रयास:

huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_AUTOBAUDRATE_INIT; huart1.AdvancedInit.AutoBaudRateMode = UART_ADVFEATURE_AUTOBAUDRATE_ONSTARTBIT; huart1.AdvancedInit.AutoBaudRateEnable = UART_ADVFEATURE_AUTOBAUDRATE_ENABLE; `

मुझे नहीं लगता कि यह एक बड़ा अंतर कर देगा के रूप में आप वैसे भी HAL_UART_Init(&huart1); साथ init प्रक्रिया शुरू करते हैं। लेकिन यह एक कोशिश के लायक है। आप अपनी घड़ी स्रोत आवृत्ति भी देख सकते हैं।

+0

चालक क्रोनोलॉजी का पालन नहीं करता है फिर भी इसे समायोजित करने से मेरी समस्या हल नहीं होती है –

+0

वैसे यह अजीब बात है, आपका सेटअप अब तक बहुत अधिक दिखता है। क्या आपने पहचान राज्य के लिए ध्वज की जांच की? साथ ही, क्या यह एक निश्चित बॉड दर के साथ काम कर रहा है (मुझे लगता है कि आपने पहले ही यह कोशिश की है)? – Haini

+0

मेरा मतलब एबीआरई त्रुटि ध्वज है। असल में मुझे नहीं पता कि इस बिंदु से क्या गलत हो सकता है, क्षमा करें ... – Haini

2

चूंकि आप ABRMOD[1:0] = UART_ADVFEATURE_AUTOBAUDRATE_ONSTARTBIT (ऑटो बॉड रेट मोड 0) का उपयोग कर रहे हैं, इसलिए ऑटो बॉड तंत्र को ठीक तरह से काम करने के लिए प्रारंभिकरण के बाद प्राप्त होने वाले पहले चरित्र को उच्च एमएसबी होना चाहिए। लेकिन आप का कहना है कि डेटा बाइट्स की अपने अनुक्रम

68 0B 0B 68 53 FD 52 FF FF .. etc. 

इस क्रम में पहले बाइट 0x68 है, जो एक कम MSB है है। इसलिए, ऑटो बॉड डिटेक्शन हार्डवेयर बीआरआर को गलत मान लिखेंगे। एक उच्च एमएसबी रखने के लिए अपना पहला बाइट बदलें, और इससे आपकी समस्या हल होनी चाहिए।


संपादित

STM32L0 4 ऑटो बॉड दर का पता लगाने मोड, आप बाइट कि मापा जाता है के विभिन्न विशेषताओं निर्दिष्ट करने की अनुमति है।

ये मोड हैं::

  • मोड 0: किसी भी चरित्र 1. पर थोड़ा के साथ शुरू इस मामले USART प्रारंभ बिट की अवधि उपायों में (गिरने बढ़ती करने के लिए धार RM0367 Reference manual से धार)।

  • मोड 1: किसी भी चरित्र एक 10xx बिट पैटर्न के साथ शुरू होता है। इस मामले में, यूएसएआरटी प्रारंभ और पहली डेटा बिट की अवधि को मापता है। धीमी सिग्नल ढलानों के मामले में बेहतर सटीकता सुनिश्चित करने के लिए माप गिरने वाले किनारे पर गिरने के लिए किया जाता है।

  • मोड 2: 0x7F वर्ण फ़्रेम (यह एलएसबी प्रथम मोड में 0x7F वर्ण या एमएसबी प्रथम मोड में 0xFE हो सकता है)। इस मामले में, बॉड्रेट को स्टार्ट बिट (बीआरएस) के अंत में पहले अपडेट किया जाता है, फिर बिट 6 के अंत में (गिरने वाले किनारे से गिरते किनारे से माप के माप के आधार पर: BR6)। बिट 0 से बिट 6 बीआरएस में नमूने किए जाते हैं जबकि चरित्र के आगे बिट्स बीआर 6 में नमूने होते हैं।

  • मोड 3: एक 0x55 चरित्र फ्रेम। इस मामले में, बॉड्रेट को स्टार्ट बिट (बीआरएस) के अंत में पहले अपडेट किया जाता है, फिर बिट 0 के अंत में (गिरने वाले किनारे से गिरने वाले किनारे से होने वाले माप के आधार पर: BR0), और अंत में बिट के अंत में 6 (बीआर 6)। बिट 0 बीआरएस पर नमूना है, बिट 1 से बिट 6 बीआर 0 पर नमूना है, और चरित्र के आगे बिट्स बीआर 6 में नमूने हैं। समानांतर में, आरएक्स लाइन के प्रत्येक मध्यवर्ती संक्रमण के लिए एक और जांच की जाती है। एक त्रुटि उत्पन्न होती है यदि आरएक्स पर संक्रमण रिसीवर के साथ पर्याप्त रूप से सिंक्रनाइज़ नहीं होते हैं (रिसीवर बिट 0 पर गणना की गई बॉड दर पर आधारित होता है)।

आप सुनिश्चित नहीं कर सकते हैं कि ऑटो बॉड का पता लगाने को सक्षम करने के बाद प्राप्त पहले बाइट से ऊपर विधियों में से एक हो गया है, तो मुझे डर है कि निर्मित ऑटो बॉड का पता लगाने की सुविधा के लिए काम नहीं करेगा हूँ आप।

हालांकि सभी खो नहीं सकते हैं। अपने प्रश्न का मेरा दूसरा जवाब देखें।

+0

धन्यवाद। हालांकि पहले बाइट पर मेरा कोई नियंत्रण नहीं है, यह निश्चित नहीं है। –

+0

मैंने एक "संपादन" खंड जोड़ा, और दूसरा जवाब जो मदद कर सकता है। – sifferman

संबंधित मुद्दे