Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с флагом USART_FLAG_RXNE в USART3
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Salamander
Господа, есть проблемка.
ПРи попытке переделать рабочий и отлаженный код на STM3F103REt6 с USART1 на USART3 зависает прием.
Точнее, базовые операции работают, через Terminal я с контроллером разговариваю. Но когда заливаю прошивку через USART по протоколу YModem, не сбрасывается флаг USART_FLAG_RXNE
Вот функция из-за которой происходит зависание, то есть она вызывается в цикле и нулевой результат, возвращаемый ею приводит к зависанию цикла и прекращению его лишь после таймаута:
Код
uint32_t SerialKeyPressed(uint8_t *key)
{

  if ( USART_GetFlagStatus(EVAL_COM3, USART_FLAG_RXNE) != RESET)
  {
    *key = (uint8_t)EVAL_COM3->DR;
    return 1;
  }
  else
  {
    return 0;
  }
}


Вот настройка USART

Код
oid BT_USART_Init(void)
{
  USART_InitTypeDef USART_InitStructure;
      NVIC_InitTypeDef  NVIC_InitStructure;

RCC->APB1ENR |= RCC_APB1ENR_USART3EN;
    
    /* Enable Clock and clock For REMAP - RCC_APB2Periph_AFIO                                             */

                     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO, ENABLE); // Alternate Function

                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

    
    
    /* Configure USART Tx as alternate function push-pull */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* Configure USART Rx as input floating */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* USART resources configuration (Clock, GPIO pins and USART registers) ----*/
  /* USART configured as follow:
        - BaudRate = 115200 baud  
        - Word Length = 8 Bits
        - One Stop Bit
        - No parity
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled
  */
    
    
  USART_InitStructure.USART_BaudRate = 38400;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_Init(USART3, &USART_InitStructure);  
    USART_Cmd(USART3, ENABLE);
    
            //       NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
           //     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
             //     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
             //     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
             //
          //        USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);  /* Enable Receive interrupt */

}


При перенастройке на USART3 я учел, что он тактируется от APB1, вроде бы других отличий от USART1 не имеется...
В чем может быть проблема?
SSerge
Цитата(Salamander @ Mar 10 2015, 01:50) *
Вот функция из-за которой происходит зависание, то есть она вызывается в цикле и нулевой результат, возвращаемый ею приводит к зависанию цикла и прекращению его лишь после таймаута:

Эта функция возвращает нулевой результат как раз при сброшенном RXNE.
Приёмник ничего не принимает, вот он RXNE и не выставляет.
Так и должно быть.
Salamander
Код
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)
{
  FlagStatus bitstatus = RESET;
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_FLAG(USART_FLAG));
  /* The CTS flag is not available for UART4 and UART5 */
  if (USART_FLAG == USART_FLAG_CTS)
  {
    assert_param(IS_USART_123_PERIPH(USARTx));
  }  
  
  [b]if ((USARTx->SR & USART_FLAG) != (uint16_t)RESET)
  {
    bitstatus = SET;
  }[/b]
  else
  {
    bitstatus = RESET;
  }
  return bitstatus;
}

Выделил жирным. Судя по брейкпоинтам bitstatus=SET всегда вызывается.
То что на приемник информация идет - это точно, при перенастройке на USART1 все работает.
Ну и собственно USART3 тоже как бы работает - данные в комп идут в любом объеме, обратно - через терминал введенные байты тоже идут. А вот при попытке передать файл - виснет.
Golikov A.
Цитата
USARTx->SR

а вместо х не должен быть конкретный номер?
SSerge
А EVAL_COM3 и USART3 это точно одно и то же?
Salamander
Цитата(Golikov A. @ Mar 9 2015, 23:36) *
а вместо х не должен быть конкретный номер?

Это параметр, он в заголовке прописан, а при вызове указывается конкретно

Цитата(SSerge @ Mar 9 2015, 23:48) *
А EVAL_COM3 и USART3 это точно одно и то же?

Соседнюю тему про бутлодер помните? Таи была ссылка на In Appliction bootloader об успешном окучивании которого я и рапортовал.
Взято оттуда. Там есть дефайны для портов. Нет их только для 3 юсарта. Я дописал -на передачу работает. На прием клацаний по клавишам в терминале работает. Не хочет только принимать файлы.
Salamander
Решил проблему.
Надо было в компе в настройках порта всего лишь отключить аппаратное управление потоком (что выставлено по умолчанию).
Для меня остается загадкой, как у меня в первый раз получилось передать файл при настройках по умолчанию, когда я еще экспериментировал с USART1.
Golikov A.
может он у вас с контролем разведенsm.gif Или по какой то причине сигнал CTR залип в нужном состоянии
Salamander
Цитата(Golikov A. @ Mar 10 2015, 23:46) *
может он у вас с контролем разведенsm.gif Или по какой то причине сигнал CTR залип в нужном состоянии

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