加入大疆C板例程bsp
This commit is contained in:
101
bsp/boards/bsp_spi.c
Normal file
101
bsp/boards/bsp_spi.c
Normal file
@@ -0,0 +1,101 @@
|
||||
#include "bsp_spi.h"
|
||||
#include "main.h"
|
||||
|
||||
extern SPI_HandleTypeDef hspi1;
|
||||
extern DMA_HandleTypeDef hdma_spi1_rx;
|
||||
extern DMA_HandleTypeDef hdma_spi1_tx;
|
||||
|
||||
void SPI1_DMA_init(uint32_t tx_buf, uint32_t rx_buf, uint16_t num)
|
||||
{
|
||||
SET_BIT(hspi1.Instance->CR2, SPI_CR2_TXDMAEN);
|
||||
SET_BIT(hspi1.Instance->CR2, SPI_CR2_RXDMAEN);
|
||||
|
||||
__HAL_SPI_ENABLE(&hspi1);
|
||||
|
||||
|
||||
//disable DMA
|
||||
//失效DMA
|
||||
__HAL_DMA_DISABLE(&hdma_spi1_rx);
|
||||
|
||||
while(hdma_spi1_rx.Instance->CR & DMA_SxCR_EN)
|
||||
{
|
||||
__HAL_DMA_DISABLE(&hdma_spi1_rx);
|
||||
}
|
||||
|
||||
__HAL_DMA_CLEAR_FLAG(&hdma_spi1_rx, DMA_LISR_TCIF2);
|
||||
|
||||
hdma_spi1_rx.Instance->PAR = (uint32_t) & (SPI1->DR);
|
||||
//memory buffer 1
|
||||
//内存缓冲区1
|
||||
hdma_spi1_rx.Instance->M0AR = (uint32_t)(rx_buf);
|
||||
//data length
|
||||
//数据长度
|
||||
__HAL_DMA_SET_COUNTER(&hdma_spi1_rx, num);
|
||||
|
||||
__HAL_DMA_ENABLE_IT(&hdma_spi1_rx, DMA_IT_TC);
|
||||
|
||||
|
||||
//disable DMA
|
||||
//失效DMA
|
||||
__HAL_DMA_DISABLE(&hdma_spi1_tx);
|
||||
|
||||
while(hdma_spi1_tx.Instance->CR & DMA_SxCR_EN)
|
||||
{
|
||||
__HAL_DMA_DISABLE(&hdma_spi1_tx);
|
||||
}
|
||||
|
||||
|
||||
__HAL_DMA_CLEAR_FLAG(&hdma_spi1_tx, DMA_LISR_TCIF3);
|
||||
|
||||
hdma_spi1_tx.Instance->PAR = (uint32_t) & (SPI1->DR);
|
||||
//memory buffer 1
|
||||
//内存缓冲区1
|
||||
hdma_spi1_tx.Instance->M0AR = (uint32_t)(tx_buf);
|
||||
//data length
|
||||
//数据长度
|
||||
__HAL_DMA_SET_COUNTER(&hdma_spi1_tx, num);
|
||||
|
||||
|
||||
}
|
||||
|
||||
void SPI1_DMA_enable(uint32_t tx_buf, uint32_t rx_buf, uint16_t ndtr)
|
||||
{
|
||||
__HAL_DMA_DISABLE(&hdma_spi1_rx);
|
||||
__HAL_DMA_DISABLE(&hdma_spi1_tx);
|
||||
|
||||
|
||||
while(hdma_spi1_rx.Instance->CR & DMA_SxCR_EN)
|
||||
{
|
||||
__HAL_DMA_DISABLE(&hdma_spi1_rx);
|
||||
}
|
||||
while(hdma_spi1_tx.Instance->CR & DMA_SxCR_EN)
|
||||
{
|
||||
__HAL_DMA_DISABLE(&hdma_spi1_tx);
|
||||
}
|
||||
|
||||
__HAL_DMA_CLEAR_FLAG (hspi1.hdmarx, __HAL_DMA_GET_TC_FLAG_INDEX(hspi1.hdmarx));
|
||||
__HAL_DMA_CLEAR_FLAG (hspi1.hdmarx, __HAL_DMA_GET_HT_FLAG_INDEX(hspi1.hdmarx));
|
||||
__HAL_DMA_CLEAR_FLAG (hspi1.hdmarx, __HAL_DMA_GET_TE_FLAG_INDEX(hspi1.hdmarx));
|
||||
__HAL_DMA_CLEAR_FLAG (hspi1.hdmarx, __HAL_DMA_GET_DME_FLAG_INDEX(hspi1.hdmarx));
|
||||
__HAL_DMA_CLEAR_FLAG (hspi1.hdmarx, __HAL_DMA_GET_FE_FLAG_INDEX(hspi1.hdmarx));
|
||||
|
||||
__HAL_DMA_CLEAR_FLAG (hspi1.hdmatx, __HAL_DMA_GET_TC_FLAG_INDEX(hspi1.hdmatx));
|
||||
__HAL_DMA_CLEAR_FLAG (hspi1.hdmatx, __HAL_DMA_GET_HT_FLAG_INDEX(hspi1.hdmatx));
|
||||
__HAL_DMA_CLEAR_FLAG (hspi1.hdmatx, __HAL_DMA_GET_TE_FLAG_INDEX(hspi1.hdmatx));
|
||||
__HAL_DMA_CLEAR_FLAG (hspi1.hdmatx, __HAL_DMA_GET_DME_FLAG_INDEX(hspi1.hdmatx));
|
||||
__HAL_DMA_CLEAR_FLAG (hspi1.hdmatx, __HAL_DMA_GET_FE_FLAG_INDEX(hspi1.hdmatx));
|
||||
|
||||
|
||||
hdma_spi1_rx.Instance->M0AR = rx_buf;
|
||||
hdma_spi1_tx.Instance->M0AR = tx_buf;
|
||||
|
||||
__HAL_DMA_SET_COUNTER(&hdma_spi1_rx, ndtr);
|
||||
__HAL_DMA_SET_COUNTER(&hdma_spi1_tx, ndtr);
|
||||
|
||||
__HAL_DMA_ENABLE(&hdma_spi1_rx);
|
||||
__HAL_DMA_ENABLE(&hdma_spi1_tx);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user