本帖最后由 ddb_21ic 于 2025-8-21 16:31 编辑
完整的DMA初始化代码
void spi_dma_data_buff_config(void)
{
dma_single_data_parameter_struct dma_init_struct;
dmamux_gen_parameter_struct dmamux_gen_init_struct;
dmamux_sync_parameter_struct dmamux_sync_init_struct;
/* deinitialize DMA registers of a channel */
dma_deinit(DMA0, DMA_CH1);
/* SPI3 DMA0_CH1 SPI发送,PE3 DRDY 触发SPI发送,开始数据传输 */
dma_single_data_para_struct_init(&dma_init_struct);
dma_init_struct.request = DMA_REQUEST_SPI3_TX; //SPI_TX触发DMA传输
dma_init_struct.direction = DMA_MEMORY_TO_PERIPH;
dma_init_struct.memory0_addr = (uint32_t)(&spi_dma_tx_buff[0]);
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_DISABLE;
dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_8BIT;
dma_init_struct.number = spi_dma_frame_size; //发送一个ADC读取命令帧
dma_init_struct.periph_addr = (uint32_t)&SPI_TDATA(SPI3);
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_init_struct.priority = DMA_PRIORITY_LOW;
dma_init_struct.circular_mode = DMA_CIRCULAR_MODE_ENABLE;
dma_single_data_mode_init(DMA0, DMA_CH1, &dma_init_struct);
//---------------------------------------------------------------------
/* connect key EXTI line to key GPIO pin */
syscfg_exti_line_config(EXTI_SOURCE_GPIOE, EXTI_SOURCE_PIN3);
/* configure key EXTI line */
exti_interrupt_flag_clear(EXTI_3);
exti_init(EXTI_3, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
//exti_init(EXTI_3, EXTI_EVENT, EXTI_TRIG_FALLING);
exti_interrupt_flag_clear(EXTI_3);
// exti_event_enable(EXTI_3); //Event模式不能作为dma同步信号
/* enable and set key EXTI interrupt to the lowest priority */
nvic_irq_enable(EXTI3_IRQn, 2U, 0U);
//---------------------------------------------------------------------
/* DMAMUX channel configuration */
/* initialize DMA request multiplexer channel 0 with synchronization mode */
dmamux_sync_struct_para_init(&dmamux_sync_init_struct);
dmamux_sync_init_struct.sync_id = DMAMUX_SYNC_EXTI3; //EXTI_3作为DMA同步信号
dmamux_sync_init_struct.sync_polarity = DMAMUX_SYNC_FALLING;
dmamux_sync_init_struct.request_number = spi_dma_frame_size;
dmamux_synchronization_init(DMAMUX_MUXCH1, &dmamux_sync_init_struct);
dmamux_synchronization_enable(DMAMUX_MUXCH1);
dma_channel_enable(DMA0, DMA_CH1); //等待DRDY,在EXTI_3中断时打开DMA通道
}
|