Чт май 26, 2022 17:04:13
Чт май 26, 2022 19:23:43
oid USART2_IRQHandler(void)
{
/* Линия свободна (idle frame) */
if((USART2->ISR & USART_ISR_IDLE)&&(USART2->CR1 & USART_CR1_IDLEIE))
{
Start_RTOTimer();
USART2->ICR = USART_ICR_IDLECF;
}
/* Предыдущий принятый символ не был прочитан */
if(USART2->ISR & USART_ISR_ORE)
{
ToRXBuff(USART2->RDR);
USART2->ICR = USART_ICR_ORECF;
}
/* Символ был принят */
if((USART2->ISR & USART_ISR_RXNE)&&(USART2->CR1 & USART_CR1_RXNEIE))
{
Stop_RTOTimer();
ToRXBuff(USART2->RDR);
}
/* Готов к передаче символа */
if((USART2->ISR & USART_ISR_TXE)&&(USART2->CR1 & USART_CR1_TXEIE))
{
uint8_t ch;
if(FromTXBuff(&ch))
USART2->TDR = ch;
else
USART2->CR1 &= ~USART_CR1_TXEIE;
}
/* Передача символа была завершена и передающий буфер пуст */
if((USART2->ISR & USART_ISR_TC)&&(USART2->CR1 & USART_CR1_TCIE))
{
}
/* Ошибка кадра в приемнике */
if(USART2->ISR & USART_ISR_FE)
{
USART2->ICR = USART_ICR_FECF;
}
}
Пт май 27, 2022 07:19:06
НовыйДень писал(а):Но ведь это несложно и проверить на деле.
Нет, не выставляется, ведь ничего не было принято, поскольку старт-бит и стоп-бит не были обнаружены, и запуска сдвигового регистра приема не было.
Во время приема флаг RXNE выставляется в конце приема байта, а флаг IDLE будет выставлен после того, как линия RX будет оставаться свободной в течение времени, равного длительности кадра (обычно 10 бит).
Флаг ORE (overrun) будет выставляться тогда, когда был принят новый байт, а предыдущий не был прочитан.
"
Пт май 27, 2022 07:41:12
Eddy_Em писал(а):У меня UART работает через DMA: где-то только передача, где-то - и передача, и прием. И я ни разу в жизни ни IDLE, ни RTO не использовал. ЧЯДНТ?
Пт май 27, 2022 09:22:31
Пт май 27, 2022 09:47:00
Пт май 27, 2022 09:52:21
Пт май 27, 2022 09:59:00
Пт май 27, 2022 10:02:08
Пт май 27, 2022 10:04:27
Пт май 27, 2022 10:21:12
Пт май 27, 2022 10:47:53
а контроль переполнения буфера как реализован? а то ведь это классическая дыра...Eddy_Em писал(а):Элементарно: в STM32F0x2 есть прерывание по символу. Вот я по '\n' и вызываю прерывание, выключаю в нем DMA, меняю местами буферы и выставляю флаг готовности принятой строки.
Пт май 27, 2022 11:02:36
Пт май 27, 2022 11:31:28
Eddy_Em писал(а):Можно и по таймауту. Только придется городить промежуточную буферизацию (кольцевой буфер) с построчной выдачей.
Пт май 27, 2022 11:40:03
Пт май 27, 2022 12:29:40
oid USART2_IRQHandler(void)
{
/* Линия свободна (idle frame) */
if((USART2->ISR & USART_ISR_IDLE)&&(USART2->CR1 & USART_CR1_IDLEIE))
{
Start_RTOTimer();
USART2->ICR = USART_ICR_IDLECF;
}
/* Предыдущий принятый символ не был прочитан */
if(USART2->ISR & USART_ISR_ORE)
{
ToRXBuff(USART2->RDR);
USART2->ICR = USART_ICR_ORECF;
}
/* Символ был принят */
if((USART2->ISR & USART_ISR_RXNE)&&(USART2->CR1 & USART_CR1_RXNEIE))
{
Stop_RTOTimer();
ToRXBuff(USART2->RDR);
}
/* Готов к передаче символа */
if((USART2->ISR & USART_ISR_TXE)&&(USART2->CR1 & USART_CR1_TXEIE))
{
uint8_t ch;
if(FromTXBuff(&ch))
USART2->TDR = ch;
else
USART2->CR1 &= ~USART_CR1_TXEIE;
}
/* Передача символа была завершена и передающий буфер пуст */
if((USART2->ISR & USART_ISR_TC)&&(USART2->CR1 & USART_CR1_TCIE))
{
}
/* Ошибка кадра в приемнике */
if(USART2->ISR & USART_ISR_FE)
{
USART2->ICR = USART_ICR_FECF;
}
}
Пт май 27, 2022 12:32:30
Eddy_Em писал(а):А кто сказал, что байты должны идти "ноздря в ноздрю"? Может, между ними по 2-4 свободных фрейма?
Пт май 27, 2022 17:05:58
Вт июн 14, 2022 10:01:26
Вт июн 14, 2022 10:21:40