stm32 SPI DMA发送代码 标准库
时间: 2023-08-16 21:10:15 浏览: 89
以下是基于STM32标准库的SPI DMA发送代码:
```c
#include "stm32f10x.h"
#define SPI_PORT SPI2
#define DMA_CHANNEL DMA1_Channel5
#define BUFFER_SIZE 16
uint8_t tx_buffer[BUFFER_SIZE] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10};
uint8_t rx_buffer[BUFFER_SIZE];
void SpiDmaSend(void) {
/* Enable DMA clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* Enable SPI clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
/* Configure SPI pins */
GPIO_InitTypeDef gpio_init;
gpio_init.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
gpio_init.GPIO_Mode = GPIO_Mode_AF_PP;
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &gpio_init);
/* Configure SPI */
SPI_InitTypeDef spi_init;
spi_init.SPI_Direction = SPI_Direction_1Line_Tx;
spi_init.SPI_Mode = SPI_Mode_Master;
spi_init.SPI_DataSize = SPI_DataSize_8b;
spi_init.SPI_CPOL = SPI_CPOL_Low;
spi_init.SPI_CPHA = SPI_CPHA_1Edge;
spi_init.SPI_NSS = SPI_NSS_Soft;
spi_init.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
spi_init.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_Init(SPI_PORT, &spi_init);
/* Enable SPI */
SPI_Cmd(SPI_PORT, ENABLE);
/* Configure DMA */
DMA_InitTypeDef dma_init;
dma_init.DMA_PeripheralBaseAddr = (uint32_t)&SPI_PORT->DR;
dma_init.DMA_MemoryBaseAddr = (uint32_t)tx_buffer;
dma_init.DMA_DIR = DMA_DIR_PeripheralDST;
dma_init.DMA_BufferSize = BUFFER_SIZE;
dma_init.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
dma_init.DMA_MemoryInc = DMA_MemoryInc_Enable;
dma_init.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
dma_init.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
dma_init.DMA_Mode = DMA_Mode_Normal;
dma_init.DMA_Priority = DMA_Priority_VeryHigh;
dma_init.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA_CHANNEL, &dma_init);
/* Enable DMA transfer complete interrupt */
DMA_ITConfig(DMA_CHANNEL, DMA_IT_TC, ENABLE);
/* Start DMA transfer */
DMA_Cmd(DMA_CHANNEL, ENABLE);
/* Wait for DMA transfer to complete */
while (DMA_GetFlagStatus(DMA1_FLAG_TC5) == RESET);
/* Disable DMA and SPI */
DMA_Cmd(DMA_CHANNEL, DISABLE);
SPI_Cmd(SPI_PORT, DISABLE);
/* Disable DMA clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, DISABLE);
}
/* DMA1 Channel5 Interrupt Handler */
void DMA1_Channel5_IRQHandler(void) {
if (DMA_GetITStatus(DMA1_IT_TC5)) {
/* Clear the DMA transfer complete interrupt flag */
DMA_ClearFlag(DMA1_FLAG_TC5);
/* Disable DMA transfer complete interrupt */
DMA_ITConfig(DMA_CHANNEL, DMA_IT_TC, DISABLE);
}
}
```
在主函数中,调用`SpiDmaSend()`函数即可实现SPI DMA发送。注意,在代码中使用了DMA1 Channel5和SPI2,如需更改,请自行更改代码。