2016-01-19 9 views
5

Я не могу получить автоматическое определение скорости передачи для работы на STM32L0. Я использую слой абстракции оборудования (HAL).Автоматическая скорость передачи данных для STM32L0

Мой 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 __________ 
    ¦______¦ 
... 

Почему бод не обнаруживается? Я пробовал:

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, скорость передачи данных составляет от FCK/65535 и FCK/16, когда передискретизация на 8, скорость обмена между fCK/65535 и fCK/8).

Я передискретизация на 16, так

fCK= 16000000 

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

Мой Baudrate выбора является: 19200/ 9600 /2400 /300

+0

«Извините, я не могу этого сделать, Летающий швейцар». –

ответ

3

Если вы не можете указать точное содержимое одного байта, которое будет проверено аппаратным средством обнаружения автоматической скорости передачи данных STM32L0, вы можете по-прежнему иметь возможность «сворачивать свою собственную» схему автоматического определения скорости передачи в бодах, если следующие допущения может быть сделана для вашей системы:

  • это допустимо, чтобы отменить произвольное число смежных символов, полученных в процессе обнаружения авто бода.

  • В любом произвольном интервале, в котором принимаются несколько символов, можно предположить, что последовательность бит 010 или 101 является относительно обычным явлением.

  • Устройство имеет доступное периферийное устройство общего назначения, которое может быть отображено на тот же вывод устройства, что и сигнал USART Rx.

Если все вышеперечисленное верно, то вы можете создать свой собственный авто бод схемы обнаружения скорости с помощью входного захвата функции одного из общих периферийных устройств Назначение таймера на чипе. Эти таймеры могут быть сконфигурированы для использования внутренних тактовых импульсов 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 счетами, то вы можете быть уверенно уверены, что скорость передачи равна 19200. После 100 выборок, если бы самый короткий из найденных был между 1665 и 1669 пунктами, то вы можете предположить, что скорость в бодах 9600. И так далее.

Во время этого процесса USART отключается, когда таймер назначен на контакт. После определения правильной скорости передачи в бодах, повторно настройте контакт, чтобы назначить его периферийной функции USART Rx.

+0

Большое спасибо –

+0

a pitty Я не могу использовать оборудование .. –

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); в любом случае. Но стоит попробовать. Вы также можете проверить частоту источника тактового сигнала.

+0

водитель не следит за хронологией, но приспосабливая его, я не решаю свою проблему. –

+0

Ну, это странно, ваша установка кажется вполне нормальным. Вы проверили флаг для состояния обнаружения? Кроме того, он работает с фиксированной скоростью в бодах (я думаю, вы уже пробовали это)? – Haini

+0

Я имею в виду флаг ошибки ABRE. В принципе, я понятия не имею, что может пойти не так с этого момента, извините ... – Haini

2

Поскольку вы используете ABRMOD[1:0] = UART_ADVFEATURE_AUTOBAUDRATE_ONSTARTBIT (режим автоматической скорости передачи в бодах 0), самый первый символ, полученный после инициализации, должен иметь высокий MSB, чтобы механизм автоматического бода работал правильно. Но вы говорите, что ваша последовательность байтов данных является

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

Первый байт в этой последовательности 0x68, который имеет низкую MSB. Таким образом, устройство автоматического обнаружения бода будет записывать неверное значение в BRR. Измените свой первый байт, чтобы иметь высокий MSB, и это должно решить вашу проблему.


Редактировать

STM32L0 имеет 4 режима обнаружения скорости передачи данных автоматически, что позволяет задавать различные характеристики байта, который измеряется. Из RM0367 Reference manual:

Этих режимы:

  • Режима 0: Любой персонаж, начиная с битом в 1. В этом случае USART измеряет длительность бита Start (падающего фронта к поднимающемуся края).

  • Способ 1: Любой символ, начинающийся с бита 10xx. В этом случае USART измеряет продолжительность старта и 1-го бита данных. Измерение производится с падающим фронтом на задний фронт, обеспечивая лучшую точность в случае медленных наклонов сигнала.

  • Режим 2: Персональный кадр 0x7F (это может быть символ 0x7F в первом режиме LSB или 0xFE в первом режиме MSB). В этом случае скорость передачи обновляется сначала в конце стартового бита (BR), а затем в конце бит 6 (на основе измерения, выполненного от падения к краю фронта: BR6). Бит 0 - бит 6 отбирается в BR, а дополнительные биты символа берутся на BR6.

  • Режим 3: рамка с символом 0x55. В этом случае скорость передачи сначала обновляется в конце стартового бита (BR), а затем в конце бит 0 (на основе измерения, проведенного с падающего фронта на задний фронт: BR0), и, наконец, в конце бит 6 (BR6). Бит 0 дискретизируется в BR, бит 1 - бит 6 выбирается в BR0, а дополнительные биты символа берутся на выборку BR6. Параллельно выполняется другая проверка для каждого промежуточного перехода линии RX. Ошибка возникает, если переходы на RX недостаточно синхронизированы с приемником (приемник основан на скорости передачи в бодах, рассчитанной на бит 0).

Если вы не можете гарантировать, что первый байт, полученный после включения автоматического обнаружения передачи подходит один из указанных выше режимов, то я боюсь, что встроенная функция автоматического обнаружения бода не будет работать вы.

Все может быть не потеряно. См. Мой второй ответ на ваш вопрос.

+0

Спасибо. Однако я не контролирую первый байт, но не детерминирован. –

+0

Я добавил раздел «Редактировать» и второй ответ, который может помочь. – sifferman