ST BlueNRG-1 Ставим UART скорость 9600, получаем 4800 бод.
engineering_ru — 23.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мс:
Из таблицы по ссылке выше это 4800 бод, а не 9600.
Дальше проверяем, что-же пошло не так?
Находим вот такие настройки делителей клока UART в даташите:
Дебуггером находим код библиотеки:
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