Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F103. Проблема с USART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
inventor
Заметил странное поведение USART
после нескольких минут работы
USART впадает в кому внутри прерывания:
CODE
static int i = 0;
void USART3_IRQHandler(void)
{
volatile u8 byte;
register u32 status;

status = USART3->SR;

/* Read one byte from the receive data register */
if (status & USART_FLAG_RXNE) {
byte = USART3->DR;
gps_nmea_parse(byte);
}

/* Write one byte to the transmit data register */
if (status & USART_FLAG_TXE) {
/* Disable the USART3 Transmit interrupt */
USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
}

/* OverRun + Noise + Framing + Parity Error */
if (USART3->SR & 0x0F) {
//USART3->SR |= 0xf;
if(i % 500 == 0)
led_toggle(LED3);
byte = USART3->DR;
}
}


Вертица внутри ошибок OverRun + Noise + Framing + Parity Error
Ошибки не снимаются
В даташите написано, что должны сниматься последовательно чтением
статус регистра и регистра данных.
Не помогает.
В чем может быть засада?
mempfis_
Цитата
В даташите написано, что должны сниматься последовательно чтением
статус регистра и регистра данных.
Не помогает.


Попробуйте не трогая флаги просто выполнить чтение регистра данных уарта.
Код
volatile char data = USART3->DR;


Увидел что Вы это и так делаете.
Вот мой обработчик - всё работает вроде как без нареканий
Код
//читаем флаги и сбрасываем требуемые
  unsigned int flags = USART1->SR;
  volatile unsigned char data;
  
  //анализируем флаги
  //флаг приёма данных
  if(flags & USART_SR_RXNE)
  {
    //проверяем флаги прерываний
    if(!(flags & (USART_SR_PE | USART_SR_FE | USART_SR_NE | USART_SR_ORE)))
    {
      //принят байт данных, читаем его в фифо
      Rx1Buf[Rx1Head++] = USART1->DR;
      if (Rx1Head >= US1_RXBUFSIZE) Rx1Head = 0;
    }
    else
    {
      //ошибка флагов, фиктивное чтение
      data = USART1->DR;
    }
  }
  
  //флаг передачи данных
  if(flags & USART_SR_TXE)
  {
    //регистр на передачу пуст
    if (Tx1Tail != Tx1Head)
    {
      USART1->DR = Tx1Buf[Tx1Tail++];
      if (Tx1Tail >= US1_TXBUFSIZE) Tx1Tail = 0;
    }
    else
    {
      //запрещаем прерывания TXE
      USART1->CR1 &= ~(USART_CR1_TXEIE);
    }
  }
  
  NVIC_ClearPendingIRQ(USART1_IRQn);


inventor
Спасиб, попробую.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.