21ic问答首页 -
本帖最后由 ddb_21ic 于 2025-8-20 09:58 编辑
//---------------------------------------------------------------------
/* 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);
这里用红色代码,DMA不工作;绿色代码,DMA就能同步启动,中断函数空着的也没问题
这样CPU会增加很多没意义的中断,该怎么解决呢?
EVENT只能用于唤醒MCU?
/* 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);
这里用红色代码,DMA不工作;绿色代码,DMA就能同步启动,中断函数空着的也没问题
这样CPU会增加很多没意义的中断,该怎么解决呢?
EVENT只能用于唤醒MCU?
赞0
就是想禁用中断,不然MCU时间就白白消耗在每秒几十K的中断上了
评论
2025-08-21
赞0
谢谢回复,请看7楼代码,改为ENVENT模式,DMA就不传输了
评论
2025-08-21
赞0
完整的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通道
}
评论
2025-08-21
赞0
评论
2025-08-21
谢谢回复,请看7楼代码,改为ENVENT模式,DMA就不传输了
赞0
评论
2025-08-21
谢谢回复,请看7楼代码,改为ENVENT模式,DMA就不传输了
赞0
评论
2025-08-21
谢谢回复,请看7楼代码,改为ENVENT模式,DMA就不传输了
赞0
评论
2025-08-21
谢谢回复,请看7楼代码,改为ENVENT模式,DMA就不传输了
赞0
评论
2025-08-21
您需要登录后才可以回复 登录 | 注册