Перейти к содержанию
    

Камень STM32F303CB.Принимаю данные

void USART2_IRQHandler(void)
{
    if ((USART2->ISR & USART_ISR_RXNE) != RESET)
    {
        uint8_t chr = USART2->RDR;

        if (chr == '\r')  
        {
          usart2_rx_buf[usart2_rx_idx] = '\0';
          usart2_rx_idx = 0;
          usart2_rx_ready = 1;
        }
        else
        {
            if(usart2_rx_idx < RX2_BUFFERSIZE)  //no overflow
            {
                usart2_rx_buf[usart2_rx_idx] = chr;
                usart2_rx_idx++;
            }
            else
                usart2_rx_overflow = 1;
            }
    
    }
}

после рисета первый раз я попадаю в условие USART2->ISR & USART_ISR_RXNE - в регистре ISR я вижу RXNE = 1.

И все - все последующте разы я не захожу в условие так как RXNE = 0.

В документации написано что при приеме данных в USART2->RDR флаг взводиться RXNE = 1 а при чтении из USART2->RDR - флаг очищается RXNE =0.

Что я делаю не так?

 

Еще такая проблема - я все время захожу в USART2_IRQHandler - даже когда размыкаю провод RX - хотя у меня включено только одно прерывание - по принятию -

USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);
NVIC_EnableIRQ(USART2_IRQn);

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Начните с примеров.

 

скачал примеры для F3Discovery - для USART примеров нет.

 

Нашел пример для моего камня

void USART1_IRQHandler(void)
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // data receive
    {
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        rx = (unsigned char) USART_ReceiveData(USART1);
        rxbuff[e] = rx;
        e++;
    }

сделал то же самое только для USART2 - та же беда.

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

скачал примеры для F3Discovery - для USART примеров нет.

Тогда надо сначала освоить поиск в гугле или на github

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда надо сначала освоить поиск в гугле или на github

 

мне интересно какая цель ваших ответов? чтоб количество сообщений было больше? за это что то дают? медаль какую?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смысл простой - надо научиться самому искать ответы на простейшие вопросы. А не задавать и потом читать килотонны дисскуссий ни о чём. При том, что в SPL/HAL примеры есть прямо на локальном диске после установки. Мне кажется спрашивать надо о том, что действительно вызывает трудности (нет в гугле или сложные алгоритмы) - например как по данным с аккселерометра отпределить активность (сон, бег, прыжок или падение). Это просто пример, а не вопрос.

 

А завтра у ТС возникнет FE или OV и опять пойдут вопросы. А когда он сам научится ответы искать, то и времени от проблемы до решения будет меньше тратиться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще такая проблема - я все время захожу в USART2_IRQHandler - даже когда размыкаю провод RX - хотя у меня включено только одно прерывание - по принятию -
Чудес не бывает. Либо у вас остался взведенным флаг этого события, либо разрешено прерывание по какому-то еще. Чтобы это узнать, достаточно прочитать регистры настройки и описание их содержимого. Попав в прервание сначала читаем SR, чтобы узнать, какие из флагов выставлены и какие биты отвечают за разрешение прерывания по этим флагам. Потом читаем регистры с этими битами разрешения и выясняем, какое именно событие могло вызвать переход в обработчик прерывания. Потом лезем в исходники "библиотеки" и выясняем, кто и зачем прерывания по этому событию разрешил. Неужели так сложно до этого додуматься самому? И да, без чтения документации у вас ничего не получится даже с самыми лучшими библиотеками, не говоря уже о "библиотеках".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

мне интересно какая цель ваших ответов? чтоб количество сообщений было больше? за это что то дают? медаль какую?

Чтобы не было лишних вопросов

void USART2_IRQHandler(void)
{
    if(USART2->ISR & USART_ISR_RXNE)  // Данные пришли?
    {
        IN_FIFO.buf[IN_FIFO.Put++ % DATABUFSIZE]=USART2->RDR; // кладём в буфер
    }
}
//
void uart2_putc(unsigned char ch)
{
    USART2->TDR=ch;
    while(!(USART2->ISR & USART_ISR_TC));
}
//

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы не было лишних вопросов...

Это зря Вы так думаете, что их не будет :biggrin:

И, кстати, Ваш пример не совсем корректен. Если данных будет слишком много, Вы будете их постоянно принимать, т.к. никакого события переполнения входного буфера, видимо, не предусмотрено.

 

Но как пример, вполне себе...

Изменено пользователем Arlleex

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я отладил прием

void USART2_IRQHandler(void)
{ 
    uint8_t chr;
    uint32_t sr = USART2->ISR; 
    if (sr & USART_ISR_RXNE)
    {
        chr = (uint16_t)(USART2->RDR);
      
        if (chr == '\r')  
        {
            usart2_rx_buf[usart2_rx_idx] = '\0';
            usart2_rx_idx = 0;
            usart2_rx_ready = 1;
        }
        else
        {
            if(usart2_rx_idx < RX2_BUFFERSIZE)  //no overflow
            {
                usart2_rx_buf[usart2_rx_idx] = chr;
                usart2_rx_idx++;
            }
            else
              usart2_rx_overflow = 1;
        }
    }
    USART2->ICR = (uint16_t)~USART_FLAG_RXNE;
}

Проблема такая. Мастер посылает

USART_SendBuf(USART2, "MBE\r", 4); 

Delay_ms(100);

И слейв принимает исправно. Но если убираю задержку - Delay_ms(100); слейв принимает как попало "МMBE\r" , "MBЕE\r" , "\0BЕE\r". Как можно улучшить прием?

 

10 мили - Delay_ms(10) - тоже работает нормально. меньше - ломается.

 

нет Delay_ms(10) - тоже ломается.

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Delay_ms(100);[/code]И слейв принимает исправно. Но если убираю задержку - Delay_ms(100); слейв принимает как попало "МMBE\r" , "MBЕE\r" , "\0BЕE\r". Как можно улучшить прием?

Так может у вас мастер(USART_SendBuf) сливает символы? - На последние биты последнего символа накладываются биты следующего символа. Хотя вроде "\r" нормально принимается.... или теряется вся предыдущая строка?

А у вас случайно не RS485 полудуплекс?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так может у вас мастер(USART_SendBuf) сливает символы? - На последние биты последнего символа накладываются биты следующего символа. Хотя вроде "\r" нормально принимается.... или теряется вся предыдущая строка?

А у вас случайно не RS485 полудуплекс?

 

Я для отладки подключил напрямую пины

MASTER_USART2_TX - SLAVE_USART2_RX

MASTER_USART2_RX - SLAVE_USART2_TX

Ставлю точку останова на стороне мастера - вижу четко уходит строка - никаких накладок. а если ставлю точку останова со стороны слейва, на строке usart2_rx_ready = 1; то вижу накладки.

 

поставил скоп на MASTER_USART2_TX - выходящий пакет довольно красивый.

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ставлю точку останова на стороне мастера - вижу четко уходит строка - никаких накладок. а если ставлю точку останова со стороны слейва, на строке usart2_rx_ready = 1; то вижу накладки.

На какое событие в передатчике вы ставите точку останова? Transmit data register empty или Transmission complete?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На какое событие в передатчике вы ставите точку останова? Transmit data register empty или Transmission complete?

 

передатчик работает по Transmission complete

void USART_SendBuf(USART_TypeDef *USARTx, uint8_t *data, uint32_t size)
{
  while (size--)
  {
      uint32_t timeout = USART_TIMEOUT;
      // wait until data register is empty
      while( !(USARTx->ISR & USART_FLAG_TC) ) {if(!timeout--) break; }     
      USARTx->TDR = *data++;
  }
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

передатчик работает по Transmission complete

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

А со стороны приемника, после приема байта, надо еще проверить Overrun error bit, заодно и всё что еще есть по ошибкам в USART.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...