Одна интересная особенность 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
Date: 2017-12-23 10:55 am (UTC)в коде стоит просто константа:
/** @defgroup UART_Private_Defines Private Defines
* @{
*/
#define UART_CLOCK (16000000)
Однако похоже у нас по факту он равен 8000000
Что же это может быть?
UART_CLOCK - никак не влияет на частоту тактирования UART. Наоборот, это значение, которое ВЫ должны задать, для правильного расчета делителей.
Так что это к вам вопрос, какая у вас частота тактирования UART и почему в вашей программе она не соответствует действительности.
no subject
Date: 2017-12-23 11:42 am (UTC)no subject
Date: 2017-12-23 12:16 pm (UTC)Не, понятно, что бывает Errata. Понятно, что ошибки возможны. И бывает, что среда разработки действительно вытворяет что-то непонятное (особый привет пользователям Eclipse). Но это бывает гораздо реже, чем собственная невнимательность. Что по мне, то искать в каждом собственном баге ошибку производителя несколько странно. Лучше уж задаться сначала вопросом: "а может я чего-то не понимаю"? Это вот первая мысль, которая у меня обычно возникает. Потом разбираешься - действительно. Так и есть. И через год-полтора вдруг выясняется, что при таком подходе куча детских ошибок куда-то пропадает. А адепты секты: "это глючит комп" как делали ошибки нелепые так и продолжают их делать.
no subject
Date: 2017-12-23 12:41 pm (UTC)У вас чему UART_CLOCK равен? 8 МHz? Вы сами этого не знаете? Так сначала разберитесь и пропишите правильно UART_CLOCK.
no subject
Date: 2017-12-23 12:52 pm (UTC)no subject
Date: 2017-12-23 02:26 pm (UTC)no subject
Date: 2017-12-23 02:26 pm (UTC)это полная глупость, простите.
no subject
Date: 2017-12-23 02:28 pm (UTC)не нужно отвечать на это сообщение, если вы не найдете как...
no subject
Date: 2017-12-23 02:30 pm (UTC)no subject
Date: 2017-12-23 02:37 pm (UTC)no subject
Date: 2017-12-23 02:37 pm (UTC)#define UART_CLOCK (8000000)
no subject
Date: 2017-12-23 02:38 pm (UTC)no subject
Date: 2017-12-23 02:38 pm (UTC)#define UART_CLOCK (16000000)
no subject
Date: 2017-12-23 02:41 pm (UTC)no subject
Date: 2017-12-23 02:49 pm (UTC)спасибо капитан очевидность, осциллятор 16МГЦ у меня стоит.
а теперь перечитайте пост еще раз... там приводится дефайн из библиотеки BlueNRG1
no subject
Date: 2017-12-23 02:52 pm (UTC)это стандартная практика для STM32, а не для этого чипа...
хотя я не обязан знать ничего про STM32 для работаы с BlueNRG1
no subject
Date: 2017-12-23 02:53 pm (UTC)и он повлияет только на расчет делителей, я проверил...
т.е. у вас будут неправильно рассчитываться делители и все...
no subject
Date: 2017-12-23 02:56 pm (UTC)no subject
Date: 2017-12-23 02:56 pm (UTC)no subject
Date: 2017-12-23 02:58 pm (UTC)"осциллятор 16МГЦ у меня стоит" — да неужели? А с чего тогда вы взяли вот это "Однако похоже у нас по факту он равен 8000000"?
Если осциллятор 16MHz, то и дефайн верно прописан. Дефайн прописывается в зависимости от установленного осциллятора и никак не влияет на реальную частору. Если вы этого не знаете, то уже даже не смешно, а печально.
no subject
Date: 2017-12-23 02:58 pm (UTC)так почему я должен доказывать его?
спасибо вам за схему тактирования..
так может обясните почему с бутлоадером она равна 8 МГЦ а без бутлоадера равна 16МГЦ? когда внешний кварц я как можете догадаться не перепаиваю... у меня он равен 16МГЦ.
Код не меняется. Все что меняется бутлоадер с джампом в аппликацю, или без бурлоадера.
no subject
Date: 2017-12-23 03:03 pm (UTC)no subject
Date: 2017-12-23 03:05 pm (UTC)no subject
Date: 2017-12-23 03:07 pm (UTC)за сем просто скажите что вы выскочка которому не хватает общения или нужно признание изза низкой самооценки?
no subject
Date: 2017-12-23 03:07 pm (UTC)"так может обясните почему с бутлоадером она равна 8 МГЦ а без бутлоадера равна 16МГЦ? когда внешний кварц я как можете догадаться не перепаиваю... у меня он равен 16МГЦ.
Код не меняется. Все что меняется бутлоадер с джампом в аппликацю, или без бурлоадера." — потому что надо курить мануал у меня это заняло буквально минуту:
"Once the bootloader is activated, the code starts a procedure to auto-detect the host UART baud rate"
Бутлоадер определяет baud rate хоста!!! И автоматически устанавливает её такой какой нужно. Вы никак на это повлиять не можете. Только если в хосте поменяете. Что у вас выступает в роли хоста и какой там baud rate установлен?