http://vkorehovisback.livejournal.com/ (
vkorehovisback.livejournal.com) wrote in
engineering_ru2017-12-23 06:15 am
Entry tags:
ST BlueNRG-1 Ставим UART скорость 9600, получаем 4800 бод.
Одна интересная особенность BlueNRG-1, которая не отражена в документации.
Заставила долго "попотеть".
Вот простейший код, основанный на коде примера:
Project\BlueNRG1_Periph_Examples\Micro\Hello_World
Заливаем, подключаем FTDI, смотрим в Putty, и получаем иероглифы...
Что не так? в интернете находим методику, как определить скорость UART, осциллографом:
https://www.kumari.net/index.php/random/37-determing-unknown-baud-rate
при печати буквы А, видны два коротких импульса, замеряем ширину одного из них, получаем 208мс:

Из таблицы по ссылке выше это 4800 бод, а не 9600.
Дальше проверяем, что-же пошло не так?
Находим вот такие настройки делителей клока UART в даташите:

Дебуггером находим код библиотеки:
Дебуггер показывает, что ibrd и fbrd значения соответствуют таблице.
Что же с OVSFACT ?? в коде библотеки BlueNRG1 он нигде не трогается.
ради интереса, печатаем, его значение, получаем 0...
Что же произошло? пробуем найти в документации, можно ли менять частоту клока? UARTCLOCK но в документации снова ничего нету...
в коде стоит просто константа:
Однако похоже у нас по факту он равен 8000000
Что же это может быть?
И тут я заметил, что у меня подтянут DIO7 к VDD, и что дебуг ведется после бутлоадера. Возможно бутлоадер "пачкает" настройки UART так-как сам его использует тоже...
Пробуем подключить DIO7 к земле, перезагружаем устройство.
Так и есть, скорость теперь в норме: 9600...
Однако после бутлоадера изменить скорость возможности никакой нету...
Все "официальные" настройки я проверил, возможно бутлоадер изменяет какие-то недокументированные настройки...
это очевидный баг ST
UPDATE:
Поскольку тут налетела толпа невежд, кто-то утверждает что клок UART изменить нельзя, кто-то указывает на схему клока и говорит что можно, при этом не говорит как именно его изменить...
Специально по заявкам таких телезрителей, привожу кусок из заголовочного файла BlueNRG1
В даташите ничего об этом не сказано, и о чюдо! даже на схеме клоков эта настройка не отражена!
видимо для многих является откровением что на заборе может быть написано х.. а там дрова...
Заставила долго "попотеть".
Вот простейший код, основанный на коде примера:
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
UPDATE:
Поскольку тут налетела толпа невежд, кто-то утверждает что клок UART изменить нельзя, кто-то указывает на схему клока и говорит что можно, при этом не говорит как именно его изменить...
Специально по заявкам таких телезрителей, привожу кусок из заголовочного файла BlueNRG1
typedef struct { /*!< CKGEN_SOC Structure */
union {
__IO uint32_t CONTROL; /*!< Control clock and reset of SOC */
struct {
uint32_t : 10;
__IO uint32_t UART_CKDIV : 4; /*!< UART baud rate clock setting from 1 to 16 MHz according to the
formula 16 / (n + 1) MHz. */
} CONTROL_b; /*!< BitSize */
};
В даташите ничего об этом не сказано, и о чюдо! даже на схеме клоков эта настройка не отражена!
видимо для многих является откровением что на заборе может быть написано х.. а там дрова...
no subject
в коде стоит просто константа:
/** @defgroup UART_Private_Defines Private Defines
* @{
*/
#define UART_CLOCK (16000000)
Однако похоже у нас по факту он равен 8000000
Что же это может быть?
UART_CLOCK - никак не влияет на частоту тактирования UART. Наоборот, это значение, которое ВЫ должны задать, для правильного расчета делителей.
Так что это к вам вопрос, какая у вас частота тактирования UART и почему в вашей программе она не соответствует действительности.
no subject
no subject
Не, понятно, что бывает Errata. Понятно, что ошибки возможны. И бывает, что среда разработки действительно вытворяет что-то непонятное (особый привет пользователям Eclipse). Но это бывает гораздо реже, чем собственная невнимательность. Что по мне, то искать в каждом собственном баге ошибку производителя несколько странно. Лучше уж задаться сначала вопросом: "а может я чего-то не понимаю"? Это вот первая мысль, которая у меня обычно возникает. Потом разбираешься - действительно. Так и есть. И через год-полтора вдруг выясняется, что при таком подходе куча детских ошибок куда-то пропадает. А адепты секты: "это глючит комп" как делали ошибки нелепые так и продолжают их делать.
no subject
не смотря на юзерпик и пятницу вчера, всё же хочу заметить, что этот подход и в целом по жизни очень помогает :)
no subject
no subject
no subject
так почему я должен доказывать его?
спасибо вам за схему тактирования..
так может обясните почему с бутлоадером она равна 8 МГЦ а без бутлоадера равна 16МГЦ? когда внешний кварц я как можете догадаться не перепаиваю... у меня он равен 16МГЦ.
Код не меняется. Все что меняется бутлоадер с джампом в аппликацю, или без бурлоадера.
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
это полная глупость, простите.
no subject
no subject
это стандартная практика для STM32, а не для этого чипа...
хотя я не обязан знать ничего про STM32 для работаы с BlueNRG1
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
no subject
спасибо капитан очевидность, осциллятор 16МГЦ у меня стоит.
а теперь перечитайте пост еще раз... там приводится дефайн из библиотеки BlueNRG1
(no subject)
(no subject)
(no subject)
no subject
У вас чему UART_CLOCK равен? 8 МHz? Вы сами этого не знаете? Так сначала разберитесь и пропишите правильно UART_CLOCK.
no subject
не нужно отвечать на это сообщение, если вы не найдете как...
no subject
#define UART_CLOCK (8000000)
(no subject)
no subject
#define UART_CLOCK (16000000)
(no subject)
(no subject)
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
как мне кажется ее нету. Чип относительно новый.
хотя сходу можно было перенести пару косяков из MS версии.
ведь на плате осталась фильтрация для LS клока.