ST BlueNRG-1 Ставим UART скорость 9600, получаем 4800 бод.

топ 100 блогов engineering_ru23.12.2017 Одна интересная особенность BlueNRG-1, которая не отражена в документации.
Заставила долго "попотеть".

Вот простейший код, основанный на коде примера:
Project\BlueNRG1_Periph_Examples\Micro\Hello_World
/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
  uint32_t counter = 0; 
  /* System initialization function */
  SystemInit();
  UART->CR_b.OVSFACT = 0;
  
  /* Identify BlueNRG1 platform */
  SdkEvalIdentification();
  
  /* UART initialization */
  SdkEvalComUartInit(UART_BAUDRATE);
  
  /* infinite loop */
  while(1) 
  {
    if (counter == 0 )
      printf("A");
    counter = (counter +1) % 0xFFFFF;
  }  
}


Заливаем, подключаем FTDI, смотрим в Putty, и получаем иероглифы...
Что не так? в интернете находим методику, как определить скорость UART, осциллографом:
https://www.kumari.net/index.php/random/37-determing-unknown-baud-rate

при печати буквы А, видны два коротких импульса, замеряем ширину одного из них, получаем 208мс:
ST BlueNRG-1 Ставим UART скорость 9600, получаем 4800 бод.
Из таблицы по ссылке выше это 4800 бод, а не 9600.

Дальше проверяем, что-же пошло не так?
Находим вот такие настройки делителей клока UART в даташите:
ST BlueNRG-1 Ставим UART скорость 9600, получаем 4800 бод.
Дебуггером находим код библиотеки:
  divider = (UART_CLOCK<<7) / (16 * UART_InitStruct->UART_BaudRate);
  
  ibrd = divider >> 7;
  UART->IBRD = ibrd;
  fbrd = ((divider - (ibrd <<7) + 1) >> 1);
  if (fbrd > 0x3f) {
    ibrd++;
    fbrd = (fbrd - 0x3F) & 0x3F;
  }
  UART->FBRD = fbrd;

Дебуггер показывает, что ibrd и fbrd значения соответствуют таблице.

Что же с OVSFACT ?? в коде библотеки BlueNRG1 он нигде не трогается.
ради интереса, печатаем, его значение, получаем 0...
UART->CR_b.OVSFACT


Что же произошло? пробуем найти в документации, можно ли менять частоту клока? UARTCLOCK но в документации снова ничего нету...
в коде стоит просто константа:

/** @defgroup UART_Private_Defines Private Defines
  * @{
  */
#define UART_CLOCK       (16000000)

Однако похоже у нас по факту он равен 8000000
Что же это может быть?
И тут я заметил, что у меня подтянут DIO7 к VDD, и что дебуг ведется после бутлоадера. Возможно бутлоадер "пачкает" настройки UART так-как сам его использует тоже...
Пробуем подключить DIO7 к земле, перезагружаем устройство.
Так и есть, скорость теперь в норме: 9600...
Однако после бутлоадера изменить скорость возможности никакой нету...
Все "официальные" настройки я проверил, возможно бутлоадер изменяет какие-то недокументированные настройки...
это очевидный баг ST


Оставить комментарий

Архив записей в блогах:
Каждый наш год наполнен важными, радостными иногда и печальными событиями, такова жизнь. Вот и наступил конец 2013 года, пора подводить итоги. Мне захотелось ...
Дорога ложка к обеду. А вам к субботнему ужину. Вкусно! Попробуйте - поймете. Главное - сами кабачки держат форму и не расплываются в кашу. Если вы, конечно, будете точно соблюдать время, температуру и пропорции. Но на этом мы не остановимся. В ближайших планах ещё раз кабачки и бакла ...
...
Помните мой старый опрос за 24.02., еще до появления "вежливых людей" в Крыму? Многие тогда были против. Событие состоялось. Новые вопросы. 1. Как вы лично ...
У меня был выставлен на продажу некий предмет в коллектиблз, который сразу привлек внимание биддеров, посшли ставки и шли на протяжении недели. Сегодня глубокой ночью была сделала последняя ставка, а днем выигравший биддер написал мне что за компом был ребенок  и он просит меня отмени ...