#define APBCLK   8000000UL  // частота тактирования usart
#define BAUDRATE 230400UL   // скорость usart

void Init_usart(void)
{
  GPIOA_CLK_ENABLE;  //Включаем тактирование GPIOA
  USART1_CLK_ENABLE; //Включаем тактирование USART1
  
  GPIOA->MODER   |= GPIO_MODER_MODER9_1;         // PA9  (TX) - Alternate function mode
  GPIOA->MODER   |= GPIO_MODER_MODER10_1;        // PA10 (RX) - Alternate function mode
  GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9;      // PA9  (TX) - High speed
  
  
  
  GPIOA->AFR[1]    |= 0x0110;  // альтернативные функции
  
  RCC->CFGR3     &= ~RCC_CFGR3_USART1SW;
  RCC->CFGR3     |=  RCC_CFGR3_USART1SW;   //HSI selected as USART1 clock
  
  USART1->CR1 |= USART_CR1_UE;               //Включаем USART1
  USART1->CR1 &= ~USART_CR1_M;               //Данные - 8 бит
  USART1->CR2 &= ~USART_CR2_STOP;            //1 стоп-бит
  USART1->BRR =(APBCLK+BAUDRATE/2)/BAUDRATE; //скорость usart
  USART1->CR1 |= USART_CR1_TE;               //Включаем передатчик USART1
  USART1->CR1 |= USART_CR1_RE;               //Включаем приемник USART1
  
  USART1->CR1  |= USART_CR1_RXNEIE;       //прерывание по приему данных
  NVIC_EnableIRQ (USART1_IRQn);           //разрешить прерывания от USART1
  
}

void USART_SendData(uint16_t Data)
{
  while(!(USART1->ISR & USART_ISR_TC));
  USART1->TDR = (Data & (uint16_t)0x01FF);
}
/*
uint16_t USART_ReceiveData(void)
{
  return (uint16_t)(USART1->RDR & (uint16_t)0x01FF);
}
*/


/***********************************/
/*** прерывание по приему данных ***/
/***********************************/
volatile unsigned int usart_temp;
void USART1_IRQHandler(void)
{
  if((USART1->ISR & USART_ISR_RXNE)!=0)
  {
    usart_temp = USART1->RDR;
  }
}