From c34b20ad8c252d251d916912a2421f7e4cb1ed20 Mon Sep 17 00:00:00 2001 From: Attila BODY Date: Fri, 15 Nov 2019 20:45:11 +0100 Subject: [PATCH] WIP --- src/packetusart.cpp | 2 ++ src/usartcore.cpp | 31 ++++++++++++++++++++----------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/packetusart.cpp b/src/packetusart.cpp index 9b0a1f5..b8141f1 100644 --- a/src/packetusart.cpp +++ b/src/packetusart.cpp @@ -19,6 +19,8 @@ PacketUsart::PacketUsart(USART_TypeDef *usart, DMA_TypeDef *dma, uint32_t stream : UsartCore(usart, dma, streamRx, streamTx) { CrcHandler::Instance().AttachSlot(m_crcSlot); + LL_USART_EnableIT_IDLE(usart); + LL_USART_EnableIT_ERROR(usart); } diff --git a/src/usartcore.cpp b/src/usartcore.cpp index df53def..27ffbb9 100644 --- a/src/usartcore.cpp +++ b/src/usartcore.cpp @@ -14,28 +14,37 @@ UsartCore::UsartCore(USART_TypeDef *usart, DMA_TypeDef *dma, uint32_t streamRx, , m_rxDma(dma, streamRx) , m_txDma(dma, streamTx) { + uint32_t status = usart->SR; + volatile uint32_t tmpreg = usart->DR; // clearing some of the error/status bits in the USART + (void) tmpreg; + (void) status; + + *m_txDma.GetIfcReg() = + m_txDma.GetTcMask() | m_rxDma.GetHtMask() | m_txDma.GetTeMask() | m_rxDma.GetFeMask() | m_rxDma.GetDmeMask(); + *m_rxDma.GetIfcReg() = + m_rxDma.GetTcMask() | m_rxDma.GetHtMask() | m_rxDma.GetTeMask() | m_rxDma.GetFeMask() | m_rxDma.GetDmeMask(); + LL_DMA_EnableIT_TC(dma, streamRx); LL_DMA_EnableIT_TE(dma, streamRx); LL_DMA_EnableIT_TC(dma, streamTx); LL_DMA_EnableIT_TE(dma, streamTx); - LL_USART_EnableIT_IDLE(usart); - LL_USART_EnableIT_ERROR(usart); } void UsartCore::UsartIsr() { - if(LL_USART_IsActiveFlag_TC(m_usart) && LL_USART_IsEnabledIT_TC(m_usart)) { // transmission complete + uint32_t status = m_usart->SR; + volatile uint32_t tmpreg = m_usart->DR; // clearing some of the error/status bits in the HW + (void) tmpreg; + + if(LL_USART_IsEnabledIT_TC(m_usart) && LL_USART_IsActiveFlag_TC(m_usart)) { // transmission complete LL_USART_DisableIT_TC(m_usart); TransmissionComplete(); - } else if(LL_USART_IsEnabledIT_ERROR(m_usart)) { - uint32_t status = m_usart->SR; - volatile uint32_t tmpreg = m_usart->DR; // clearing some of the error/status bits in the HW - (void) tmpreg; - - if(status & USART_SR_IDLE) { - ReceiverIdle(); - } + } + if(LL_USART_IsEnabledIT_IDLE(m_usart) && (status & USART_SR_IDLE)) { + ReceiverIdle(); + } + if(LL_USART_IsEnabledIT_ERROR(m_usart)) { if(status & USART_SR_FE) { FramingError(); }