У меня (для stm32f1xx) вот так считается:
Код
/* для устройств на шине APB2 (up to 72 MHz) */
static uint_fast32_t
calcdivround_apb2(
int_fast32_t freq /* требуемая частота на выходе делителя, в герцах. */
)
{
return (APB2_FREQ + freq / 2) / freq;
}
....
Код
USART1->BRR = calcdivround_apb2(baudrate); // младшие 4 бита - это дробная часть.
инициализация:
Код
RCC->APB2ENR |= RCC_APB2ENR_USART1EN; // Включение тактирования USART1.
USART1->CR1 |= (USART_CR1_RE | USART_CR1_TE); // Transmitter Enable & Receiver Enables
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; //включить тактирование альтернативных функций
arm_hardware_pioa_periphout_altfn2(GPIO_ODR_ODR9, 255); // TX DATA line (2 MHz)
arm_hardware_pioa_inputs(GPIO_ODR_ODR10); // RX data line
NVIC_EnableIRQ(USART1_IRQn); // enable USART1_IRQHandler();
USART1->CR1 |= USART_CR1_UE; // Включение USART1.
т.е., 4 дробных бита в делителе позволяют не учитывать oversampling на 16 в аппаратуре контроллера при расчёте скорости, а просто записатть результат деления тактовой частоты периферии на baud rate. Естественно, программирвоание делителя делать после включения этого периферийного устройства.
зы: BYTE_Transmit_USART1 сами придумали? Жестоко... Вы что, микропроцессор впервые в жизни увидели? Всегда делается просто - проверяется готовность, выводим байт. Бит готовности в этом регистре сбрасываается сам...
Да, мне ещё недавно встретился компилятор для ARM, который unsigned short считал 8-битным. Искренне надеюсь, что у вас не это поделие.
Ну и до кучи, в том компиляторе размер Int переключался в опциях проекта на 2/4 байта.
Сообщение отредактировал Genadi Zawidowski - Nov 15 2013, 19:36