Итого: BRR = 22*16 + 12 = 364. Две записи в регистр, одно чтение и операция "Или".
(42e6 * 16)/(16*115200) = 42e6 / 115200 = 364. Мистика, не правда ли?
...
Одна запись в регистр. Не трогая калькулятор. И если скорость или частоту изменить понадобится - тоже калькулятор не понадобится, не говоря уже о том, чтобы внимательно просматривать весь исходник в поисках таких магических цифр как ваши 22 и 12.
(42e6 * 16)/(16*115200) = 42e6 / 115200 = 364. Мистика, не правда ли?
...
Одна запись в регистр. Не трогая калькулятор. И если скорость или частоту изменить понадобится - тоже калькулятор не понадобится, не говоря уже о том, чтобы внимательно просматривать весь исходник в поисках таких магических цифр как ваши 22 и 12.
Есть тонкость, связанная с нецелым делением частоты на скорость. Я тоже делил просто:
Код
USART2->BRR = (36000000 / 57600);
Получалось число без остатка (625), все работало идеально.
Но когда пришлось делить 32000000 на 57600, получилось 555,555... И это число желательно округлить до 556, тогда ошибка будет меньше. Делаю так (прибавляю 0,5 к результату, потом дробную часть теряю):
Код
USART1->BRR = (((32000000<<1) / 57600) + 1)>>1;
В результате загружается 556 = 0x22C. В мануале RM0038 на STM32L151 именно это число, разбитое на 0x22 (37) и 0xC (0,75), показано в таблице 129.
Вашему числу, кстати, тоже единички недостает.
