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

 
 
> Мост между юсартами, STM32F205, usart2 - usart3
Volldemar
сообщение Mar 19 2014, 05:09
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 27-04-09
Из: Украина
Пользователь №: 48 342



Задача: по юсарт2 идут данные с темпом 1 сек, но разного объёма, типа:
Код
$GPRMC,074038.00,A,4912.3940,N,03151.9618,E,00.00,314.7,190314,,,A*59
$GPGSV,4,1,14,01,39,183,24,04,20,314,00,11,12,181,00,13,27,237,29*7F
$GPGSV,4,2,14,17,17,275,01,20,86,111,18,23,63,242,45,25,05,022,00*7C
$GPGSV,4,3,14,31,39,059,00,32,44,102,00,33,18,235,00,37,33,193,00*7F
$GPGSV,4,4,14,39,33,189,00,40,29,150,00*7D

эти данные нужно обрабатывать и выдавать в юсарт3.

Как задумывалось решение:
Настраиваю аппаратный таймер (ТИМ2) на длительность передачи одного байта при скорости 115200. В прерывании юсарт2 принятые байты складываю в массив и обнуляю ТИМ2:
Код
if( USART_GetITStatus( USART2, USART_IT_RXNE ) == SET )
      {
         cChar = USART_ReceiveData( USART2 );
         if ((USART2_Idx == USART2_SIZE-1) || (cChar == '$'))
            {
               USART2_Idx = 0;
            }
         USART2_Buf[USART2_Idx] = cChar;
         USART2_Idx++;
         TIM_SetCounter(TIM2, 0);
         TIM_Cmd(TIM2, ENABLE);
      }

В прерывании ТИМ2, если он таки досчитает до конца, значит байтов больше нет, выставляю семафор:
Код
void TIM2_IRQHandler(void)
{
   portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;

   if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
      {
         TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //Очищаем бит обрабатываемого прерывания
         TIM_Cmd(TIM2, DISABLE); //выключаю таймер
         xSemaphoreGiveFromISR (xSemaphore_usart2, &xHigherPriorityTaskWoken ); //семафорим задаче
      }
}

Ну и сама задача:
Код
   for(;; )
   {
      xSemaphoreTake(xSemaphore_usart2, portMAX_DELAY );
      for (i=0; i<USART2_Idx; i++)
         {
            cChar = USART2_Buf[i];
            xQueueSend( usart3_TxQueue, &cChar, xNoBlock );
         }
      USART2_Idx = 0;
      USART_ITConfig( USART3, USART_IT_TXE, ENABLE );
   }

Вопрос, что не так делаю, но выдача в юсарт3 происходит не стабильно, может в принципе построение решения не правильное? Надеюсь на конструктивное советы и пожелания wink.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kolobok0
сообщение Mar 19 2014, 12:04
Сообщение #2


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Volldemar @ Mar 19 2014, 09:09) *
...Настраиваю аппаратный таймер (ТИМ2) на длительность....построение решения не правильное? Надеюсь на конструктивное советы и пожелания wink.gif


ВЫ как-то маловато таймеров задействовали. Надо было на каждый символ завести sm.gif

А если по теме.
ПДП отменили ужо? Если Вам не парсить нифига - то там три участника тока USART, USART, DMA
мозги отдыхают. не Ваши имеются ввиду а мк...
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 14:42
Рейтинг@Mail.ru


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