|
|
@ -0,0 +1,46 @@ |
|
|
|
#include "zuart_dma_receiver.hpp"
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include "sdk\chip\zirq_dispatcher.hpp"
|
|
|
|
using namespace iflytop; |
|
|
|
|
|
|
|
void ZUARTDmaReceiver::initialize(hardware_config_t *config) { |
|
|
|
m_hw_config = *config; |
|
|
|
m_rxbufsize = m_hw_config.rxbuffersize; |
|
|
|
m_rxbuf = (uint8_t *)malloc(m_rxbufsize); |
|
|
|
ZASSERT(m_rxbuf != nullptr); |
|
|
|
ZASSERT(m_hw_config.huart != nullptr); |
|
|
|
ZASSERT(m_hw_config.dma_rx != nullptr); |
|
|
|
memset(m_rxbuf, 0, m_rxbufsize); |
|
|
|
|
|
|
|
m_dmaisstart = false; |
|
|
|
} |
|
|
|
void ZUARTDmaReceiver::startRx(callback_t cb) { |
|
|
|
m_cb = cb; |
|
|
|
HAL_UART_Receive_DMA(m_hw_config.huart, (uint8_t *)m_rxbuf, m_rxbufsize); |
|
|
|
m_dmaisstart = true; |
|
|
|
ChipTimIrqShceduler::instance().regPeriodJob([this](ChipTimIrqShceduler::Job *job) { periodJOBIrq(); }, 1); |
|
|
|
} |
|
|
|
|
|
|
|
int32_t ZUARTDmaReceiver::gertRxBufSize() { return m_rxbufsize; } |
|
|
|
void ZUARTDmaReceiver::periodJOBIrq() { //
|
|
|
|
|
|
|
|
if (!m_dmaisstart) return; |
|
|
|
|
|
|
|
int rxsize = m_rxbufsize - __HAL_DMA_GET_COUNTER(m_hw_config.dma_rx); |
|
|
|
if (rxsize != m_rxlen) { |
|
|
|
m_rxlen = rxsize; |
|
|
|
m_lastrxticket = zos_get_tick(); |
|
|
|
} |
|
|
|
|
|
|
|
if (zos_haspassedms(m_lastrxticket) > m_hw_config.rxovertime_ms) { |
|
|
|
if (m_cb) m_cb(m_rxbuf, m_rxlen); |
|
|
|
|
|
|
|
m_rxlen = 0; |
|
|
|
HAL_UART_DMAStop(m_hw_config.huart); |
|
|
|
HAL_UART_Receive_DMA(m_hw_config.huart, (uint8_t *)m_rxbuf, m_rxbufsize); |
|
|
|
} |
|
|
|
} |