реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Проблема с флагом USART_FLAG_RXNE в USART3
Salamander
сообщение Mar 9 2015, 18:50
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443



Господа, есть проблемка.
ПРи попытке переделать рабочий и отлаженный код на 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 не имеется...
В чем может быть проблема?

Сообщение отредактировал Salamander - Mar 9 2015, 19:02
Go to the top of the page
 
+Quote Post
SSerge
сообщение Mar 9 2015, 19:36
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



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

Эта функция возвращает нулевой результат как раз при сброшенном RXNE.
Приёмник ничего не принимает, вот он RXNE и не выставляет.
Так и должно быть.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 9 2015, 19:46
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443



Код
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 тоже как бы работает - данные в комп идут в любом объеме, обратно - через терминал введенные байты тоже идут. А вот при попытке передать файл - виснет.

Сообщение отредактировал Salamander - Mar 9 2015, 20:07
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 9 2015, 20:36
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
USARTx->SR

а вместо х не должен быть конкретный номер?
Go to the top of the page
 
+Quote Post
SSerge
сообщение Mar 9 2015, 20:48
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



А EVAL_COM3 и USART3 это точно одно и то же?


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 9 2015, 20:56
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443



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

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

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

Соседнюю тему про бутлодер помните? Таи была ссылка на In Appliction bootloader об успешном окучивании которого я и рапортовал.
Взято оттуда. Там есть дефайны для портов. Нет их только для 3 юсарта. Я дописал -на передачу работает. На прием клацаний по клавишам в терминале работает. Не хочет только принимать файлы.

Сообщение отредактировал Salamander - Mar 9 2015, 20:57
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 10 2015, 17:59
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443



Решил проблему.
Надо было в компе в настройках порта всего лишь отключить аппаратное управление потоком (что выставлено по умолчанию).
Для меня остается загадкой, как у меня в первый раз получилось передать файл при настройках по умолчанию, когда я еще экспериментировал с USART1.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 10 2015, 20:46
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



может он у вас с контролем разведенsm.gif Или по какой то причине сигнал CTR залип в нужном состоянии
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 11 2015, 03:11
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443



Цитата(Golikov A. @ Mar 10 2015, 23:46) *
может он у вас с контролем разведенsm.gif Или по какой то причине сигнал CTR залип в нужном состоянии


Прикрепленные файлы
Прикрепленный файл  MINI_STM32_V3.0_SCH.pdf ( 68.01 килобайт ) Кол-во скачиваний: 5
 
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th June 2025 - 03:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01445 секунд с 7
ELECTRONIX ©2004-2016