From 8a4e0bd58c37b60604214c8b22e4856c39081605 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 6 Oct 2018 10:32:54 +1000 Subject: [PATCH] HAL_ChibiOS: fixed RCIN for iomcu we need to disable/re-enable DMA on each IRQ for the STM32F10x --- libraries/AP_HAL_ChibiOS/SoftSigReader.cpp | 12 ++++++++---- libraries/AP_HAL_ChibiOS/SoftSigReader.h | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/libraries/AP_HAL_ChibiOS/SoftSigReader.cpp b/libraries/AP_HAL_ChibiOS/SoftSigReader.cpp index 5208976cc8..d429231a5a 100644 --- a/libraries/AP_HAL_ChibiOS/SoftSigReader.cpp +++ b/libraries/AP_HAL_ChibiOS/SoftSigReader.cpp @@ -47,14 +47,15 @@ bool SoftSigReader::attach_capture_timer(ICUDriver* icu_drv, icuchannel_t chan, //setup address for full word transfer from Timer dmaStreamSetPeripheral(dma, &icu_drv->tim->DMAR); - uint32_t dmamode = STM32_DMA_CR_DMEIE | STM32_DMA_CR_TEIE; + dmamode = STM32_DMA_CR_DMEIE | STM32_DMA_CR_TEIE; dmamode |= STM32_DMA_CR_CHSEL(dma_channel); dmamode |= STM32_DMA_CR_PL(0); + dmamode |= STM32_DMA_CR_DIR_P2M | STM32_DMA_CR_PSIZE_WORD | + STM32_DMA_CR_MSIZE_WORD | STM32_DMA_CR_MINC | STM32_DMA_CR_TCIE; dmaStreamSetMemory0(dma, signal); dmaStreamSetTransactionSize(dma, _bounce_buf_size); - dmaStreamSetMode(dma, dmamode | STM32_DMA_CR_DIR_P2M | STM32_DMA_CR_PSIZE_WORD | - STM32_DMA_CR_MSIZE_WORD | STM32_DMA_CR_MINC | STM32_DMA_CR_TCIE); - + dmaStreamSetMode(dma, dmamode); + icucfg.frequency = INPUT_CAPTURE_FREQUENCY; icucfg.channel = chan; icucfg.width_cb = NULL; @@ -92,8 +93,11 @@ void SoftSigReader::_irq_handler(void* self, uint32_t flags) SoftSigReader* sig_reader = (SoftSigReader*)self; sig_reader->sigbuf.push(sig_reader->signal, sig_reader->_bounce_buf_size); //restart the DMA transfers + dmaStreamDisable(sig_reader->dma); + dmaStreamSetPeripheral(sig_reader->dma, &sig_reader->_icu_drv->tim->DMAR); dmaStreamSetMemory0(sig_reader->dma, sig_reader->signal); dmaStreamSetTransactionSize(sig_reader->dma, sig_reader->_bounce_buf_size); + dmaStreamSetMode(sig_reader->dma, sig_reader->dmamode); dmaStreamEnable(sig_reader->dma); } diff --git a/libraries/AP_HAL_ChibiOS/SoftSigReader.h b/libraries/AP_HAL_ChibiOS/SoftSigReader.h index 91e76f9ace..7318055205 100644 --- a/libraries/AP_HAL_ChibiOS/SoftSigReader.h +++ b/libraries/AP_HAL_ChibiOS/SoftSigReader.h @@ -42,6 +42,7 @@ private: uint8_t enable_chan_mask; uint8_t max_pulse_width; const stm32_dma_stream_t* dma; + uint32_t dmamode; ICUConfig icucfg; ICUDriver* _icu_drv = nullptr; uint16_t _bounce_buf_size = DEFAULT_BOUNCE_BUF_SIZE;