dosikus писал(а):
Код: Выделить всё
#define APBCLK 48000000UL
#define BAUDRATE 115200UL
У F030 APBCLK называется PCLK и данный источник тактирования для USART1 не является единственно-возможным:
Clock configuration register 3 (RCC_CFGR3)
===========
Bits 1:0 USART1SW[1:0]: USART1 clock source selection
This bit is set and cleared by software to select the USART1 clock source.
00: PCLK selected as USART1 clock source (default)
01: System clock (SYSCLK) selected as USART1 clock
10: LSE clock selected as USART1 clock
11: HSI clock selected as USART1 clock
Часто может оказаться более удобным использовать для тактирования HSI, т.к. в этом случае настройки последовательного порта не зависят ни от каких изменений в схеме тактирования МК. В функции инициализации порта можно сразу вставить "рыбу":
Код: Выделить всё
RCC->CFGR3 = ( // (RCC->CFGR3 & ~(RCC_CFGR3_USART1SW_0 | RCC_CFGR3_USART1SW_1)) |
// RCC_CFGR3_USART1SW_PCLK
// RCC_CFGR3_USART1SW_SYSCLK
// RCC_CFGR3_USART1SW_LSE
RCC_CFGR3_USART1SW_HSI // 8 MHz HSI clock
);
где в удобной форме выбирать нужный источник.
Код: Выделить всё
USART1->BRR =(APBCLK+BAUDRATE/2)/BAUDRATE; //
Ни к чему эти выкрутасы. В референсе черным по белому написано:
To obtain 921.6 Kbaud with fCK = 48 MHz.
• In case of oversampling by 16:
USARTDIV = 48 000 000/921 600
BRR = USARTDIV = 52d = 34h
Т.е. BRR = частота_тактирования_порта/скорость_в_бодах
Код: Выделить всё
void Usart_Transmit(uint8_t Data)
{
while(!(USART1->ISR & USART_ISR_TC));
USART1->TDR = Data;
}
Нет никакого смысла при передаче ждать, пока весь байт вытолкнется в линию. Правильнее ориентироваться по опустошению регистра данных:
Код: Выделить всё
void Usart_Transmit(uint8_t Data) {
while ((USART1->ISR & USART_ISR_TXE) != USART_ISR_TXE);
USART1->TDR = Data;
}
Не знаете матчасть, dosikus. На F0хх прием конкретного символа можно отслеживать аппаратно, хоть с вызовом прерывания по данному событию.