[bsp/stm32] 将spi DMA传输更改为阻塞线程方式 (#6513)

* [bsp/stm32] 将spi DMA传输更改为阻塞线程方式

* Update bsp/stm32/libraries/HAL_Drivers/drv_spi.h

Co-authored-by: Man, Jianting (Meco) <920369182@qq.com>
This commit is contained in:
BreederBai 2022-10-18 03:52:03 +08:00 committed by GitHub
parent b617a6abd2
commit 3a9152c5fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 1 deletions

View File

@ -411,8 +411,16 @@ static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message *
/* For simplicity reasons, this example is just waiting till the end of the /* For simplicity reasons, this example is just waiting till the end of the
transfer, but application may perform other tasks while transfer operation transfer, but application may perform other tasks while transfer operation
is ongoing. */ is ongoing. */
if (spi_drv->spi_dma_flag & (SPI_USING_TX_DMA_FLAG | SPI_USING_RX_DMA_FLAG))
{
/* blocking the thread,and the other tasks can run */
rt_completion_wait(&spi_drv->cpt, RT_WAITING_FOREVER);
}
else
{
while (HAL_SPI_GetState(spi_handle) != HAL_SPI_STATE_READY); while (HAL_SPI_GetState(spi_handle) != HAL_SPI_STATE_READY);
} }
}
if (message->cs_release && !(device->config.mode & RT_SPI_NO_CS)) if (message->cs_release && !(device->config.mode & RT_SPI_NO_CS))
{ {
@ -537,6 +545,9 @@ static int rt_hw_spi_bus_init(void)
} }
} }
/* initialize completion object */
rt_completion_init(&spi_bus_obj[i].cpt);
result = rt_spi_bus_register(&spi_bus_obj[i].spi_bus, spi_config[i].bus_name, &stm_spi_ops); result = rt_spi_bus_register(&spi_bus_obj[i].spi_bus, spi_config[i].bus_name, &stm_spi_ops);
RT_ASSERT(result == RT_EOK); RT_ASSERT(result == RT_EOK);
@ -938,6 +949,24 @@ static void stm32_get_dma_info(void)
#endif #endif
} }
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
{
struct stm32_spi *spi_drv = rt_container_of(hspi, struct stm32_spi, handle);
rt_completion_done(&spi_drv->cpt);
}
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{
struct stm32_spi *spi_drv = rt_container_of(hspi, struct stm32_spi, handle);
rt_completion_done(&spi_drv->cpt);
}
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
struct stm32_spi *spi_drv = rt_container_of(hspi, struct stm32_spi, handle);
rt_completion_done(&spi_drv->cpt);
}
#if defined(SOC_SERIES_STM32F0) #if defined(SOC_SERIES_STM32F0)
void SPI1_DMA_RX_TX_IRQHandler(void) void SPI1_DMA_RX_TX_IRQHandler(void)
{ {

View File

@ -16,6 +16,7 @@
#include <rthw.h> #include <rthw.h>
#include <drv_common.h> #include <drv_common.h>
#include "drv_dma.h" #include "drv_dma.h"
#include <ipc/completion.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@ -66,6 +67,8 @@ struct stm32_spi
rt_uint8_t spi_dma_flag; rt_uint8_t spi_dma_flag;
struct rt_spi_bus spi_bus; struct rt_spi_bus spi_bus;
struct rt_completion cpt;
}; };
#endif /*__DRV_SPI_H__ */ #endif /*__DRV_SPI_H__ */