GD32F303写一个SPI DMA代码
时间: 2024-04-15 12:07:28 浏览: 157
以下是一个简单的SPI DMA代码示例:
```c
#include "gd32f30x.h"
/* SPI DMA发送缓冲区 */
uint8_t spi_tx_buf[32] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10};
/* DMA配置结构体 */
dma_parameter_struct dma_init_struct;
/* 外设配置结构体 */
spi_parameter_struct spi_init_struct;
/* DMA传输完成标志 */
__IO FlagStatus dma_transfer_complete_flag = RESET;
int main(void)
{
/* 使能DMA时钟 */
rcu_periph_clock_enable(RCU_DMA0);
/* 配置SPI时钟 */
rcu_periph_clock_enable(RCU_SPI1);
/* 配置SPI引脚 */
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3);
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5);
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_4);
/* 配置SPI参数 */
spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
spi_init_struct.device_mode = SPI_MASTER;
spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT;
spi_init_struct.nss = SPI_NSS_SOFT;
spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;
spi_init_struct.prescale = SPI_PSC_4;
spi_init_struct.endian = SPI_ENDIAN_MSB;
spi_init_struct.master_ss = SPI_MASTER_SS_DISABLE;
spi_init(SPI1, &spi_init_struct);
/* 配置DMA参数 */
dma_deinit(DMA0, DMA_CH3);
dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
dma_init_struct.memory_addr = (uint32_t)spi_tx_buf;
dma_init_struct.memory_inc = DMA_MEMORY_INC_ENABLE;
dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
dma_init_struct.periph_addr = (uint32_t)&(SPI_DATA(SPI1));
dma_init_struct.periph_inc = DMA_PERIPH_INC_DISABLE;
dma_init_struct.periph_width = DMA_PERIPH_WIDTH_8BIT;
dma_init_struct.number = 16;
dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
dma_init_struct.circular_mode = DMA_CIRCULAR_MODE_DISABLE;
dma_init_struct.periph_handshaking = DMA_REQUEST_SPI1_TX;
dma_init(DMA0, DMA_CH3, &dma_init_struct);
/* 使能DMA传输完成中断 */
dma_interrupt_enable(DMA0, DMA_CH3, DMA_INT_FTF);
/* 使能DMA通道 */
dma_channel_enable(DMA0, DMA_CH3);
/* 启动SPI DMA传输 */
spi_dma_enable(SPI1, SPI_DMA_TRANSMIT);
/* 等待DMA传输完成 */
while(RESET == dma_transfer_complete_flag);
/* 清除DMA传输完成标志 */
dma_transfer_complete_flag = RESET;
/* 关闭SPI DMA传输 */
spi_dma_disable(SPI1, SPI_DMA_TRANSMIT);
while(1);
}
/* DMA传输完成中断处理函数 */
void dma0_channel3_isr(void)
{
if(RESET != dma_interrupt_flag_get(DMA0, DMA_CH3, DMA_INT_FLAG_FTF)) {
dma_interrupt_flag_clear(DMA0, DMA_CH3, DMA_INT_FLAG_FTF);
dma_transfer_complete_flag = SET;
}
}
```
阅读全文