未验证 提交 3a9152c5 编写于 作者: B BreederBai 提交者: GitHub

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

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

* Update bsp/stm32/libraries/HAL_Drivers/drv_spi.h
Co-authored-by: mysterywolf's avatarMan, Jianting (Meco) <920369182@qq.com>
上级 b617a6ab
...@@ -411,7 +411,15 @@ static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message * ...@@ -411,7 +411,15 @@ 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. */
while (HAL_SPI_GetState(spi_handle) != HAL_SPI_STATE_READY); 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);
}
} }
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) ...@@ -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) ...@@ -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)
{ {
......
...@@ -16,6 +16,7 @@ ...@@ -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 ...@@ -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__ */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册