diff --git a/os/hal/ports/STM32/LLD/SPIv2/spi_lld.c b/os/hal/ports/STM32/LLD/SPIv2/spi_lld.c index cc4635122..8a218ac46 100644 --- a/os/hal/ports/STM32/LLD/SPIv2/spi_lld.c +++ b/os/hal/ports/STM32/LLD/SPIv2/spi_lld.c @@ -417,6 +417,7 @@ void spi_lld_start(SPIDriver *spip) { STM32_DMA_CR_PSIZE_BYTE | STM32_DMA_CR_MSIZE_BYTE; spip->txdmamode = (spip->txdmamode & ~STM32_DMA_CR_SIZE_MASK) | STM32_DMA_CR_PSIZE_BYTE | STM32_DMA_CR_MSIZE_BYTE; + spip->fsize = sizeof (uint8_t); } else { /* Frame width is larger than 8 bits.*/ @@ -424,6 +425,7 @@ void spi_lld_start(SPIDriver *spip) { STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD; spip->txdmamode = (spip->txdmamode & ~STM32_DMA_CR_SIZE_MASK) | STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD; + spip->fsize = sizeof (uint16_t); } /* SPI setup and enable.*/ spip->spi->CR1 = 0; @@ -547,6 +549,9 @@ void spi_lld_ignore(SPIDriver *spip, size_t n) { void spi_lld_exchange(SPIDriver *spip, size_t n, const void *txbuf, void *rxbuf) { + /* DMA buffer invalidation because data cache.*/ + dmaBufferInvalidate(rxbuf, (uint8_t *)rxbuf + (n * spip->fsize)); + dmaStreamSetMemory0(spip->dmarx, rxbuf); dmaStreamSetTransactionSize(spip->dmarx, n); dmaStreamSetMode(spip->dmarx, spip->rxdmamode| STM32_DMA_CR_MINC); @@ -601,6 +606,9 @@ void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf) { */ void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf) { + /* DMA buffer invalidation because data cache.*/ + dmaBufferInvalidate(rxbuf, (uint8_t *)rxbuf + (n * spip->fsize)); + dmaStreamSetMemory0(spip->dmarx, rxbuf); dmaStreamSetTransactionSize(spip->dmarx, n); dmaStreamSetMode(spip->dmarx, spip->rxdmamode | STM32_DMA_CR_MINC); diff --git a/os/hal/ports/STM32/LLD/SPIv2/spi_lld.h b/os/hal/ports/STM32/LLD/SPIv2/spi_lld.h index 235341e35..781aa24fd 100644 --- a/os/hal/ports/STM32/LLD/SPIv2/spi_lld.h +++ b/os/hal/ports/STM32/LLD/SPIv2/spi_lld.h @@ -473,21 +473,25 @@ struct SPIDriver { */ SPI_TypeDef *spi; /** - * @brief Receive DMA stream. + * @brief Receive DMA stream. */ const stm32_dma_stream_t *dmarx; /** - * @brief Transmit DMA stream. + * @brief Transmit DMA stream. */ const stm32_dma_stream_t *dmatx; /** - * @brief RX DMA mode bit mask. + * @brief RX DMA mode bit mask. */ uint32_t rxdmamode; /** - * @brief TX DMA mode bit mask. + * @brief TX DMA mode bit mask. */ uint32_t txdmamode; + /** + * @brief Frame size in bytes. + */ + size_t fsize; }; /*===========================================================================*/ diff --git a/readme.txt b/readme.txt index f56eb63bf..5f34825e0 100644 --- a/readme.txt +++ b/readme.txt @@ -95,6 +95,8 @@ - HAL: Introduced support for TIM21 and TIM22 in STM32 ST driver. - HAL: Updated STM32F0xx headers to STM32CubeF0 version 1.3.0. Added support for STM32F030xC, STM32F070x6, STM32F070xB devices. +- HAL: Fixed wrong ld file in STM32F072xB USB CDC demo (bug #634)(backported + to 3.0.2). - NIL: Fixed Wrong assertion in NIL chSemResetI() and NIL OSAL osalThreadDequeueAllI() (bug #633)(backported to 3.0.2). - RT: Fixed problem with RT mutexes involving priority inheritance (bug #632) diff --git a/testhal/STM32/STM32F0xx/USB_CDC/Makefile b/testhal/STM32/STM32F0xx/USB_CDC/Makefile index 7ff07a711..61a96c588 100644 --- a/testhal/STM32/STM32F0xx/USB_CDC/Makefile +++ b/testhal/STM32/STM32F0xx/USB_CDC/Makefile @@ -96,7 +96,7 @@ include $(CHIBIOS)/os/rt/ports/ARMCMx/compilers/GCC/mk/port_v6m.mk include $(CHIBIOS)/test/rt/test.mk # Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F051x8.ld +LDSCRIPT= $(STARTUPLD)/STM32F072xB.ld # C sources that can be compiled in ARM or THUMB mode depending on the global # setting.