|
大佬好,现在遇到了个问题,想要通过例程V7-011和V7-052实现SPI的DMA传输,双buffer模式,用函数HAL_DMAEx_MultiBufferStart_IT,但是现在配置有些问题,麻烦指导下,谢谢
----------------------------------------------
void DMA_Init(void)
{
MX_SPI1_Init();
//---------------------------------------------------------------------------------------------------------------------------------
/* 使能DMA时钟 */
__HAL_RCC_DMA1_CLK_ENABLE(); // 根据实际DMA流选择
//HAL_DMA_MuxRequestGeneratorConfigTypeDef dmamux_ReqGenParams = {0};
/* SPI DMA发送配置 */
hdma_spi1_tx.Instance = DMA1_Stream0; /* 例化使用的DMA数据流 */
hdma_spi1_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE; /* 使能FIFO*/
hdma_spi1_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; /* 用于设置阀值, 如果禁止FIFO此位不起作用*/
hdma_spi1_tx.Init.MemBurst = DMA_MBURST_SINGLE; /* 用于存储器突发,如果禁止FIFO此位不起作用*/
hdma_spi1_tx.Init.PeriphBurst = DMA_PBURST_SINGLE; /* 用于外设突发,禁止FIFO此位不起作用 */
hdma_spi1_tx.Init.Request = DMA_REQUEST_SPI1_TX; /* 请求类型 */
hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; /* 传输方向是从存储器到外设 */
hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE; /* 外设地址自增禁止 */
hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE; /* 存储器地址自增使能 */
hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; /* 外设数据传输位宽选择字节,即32bit */
hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; /* 存储器数据传输位宽选择字节,即32bit */
hdma_spi1_tx.Init.Mode = DMA_CIRCULAR; /* 正常模式 */
hdma_spi1_tx.Init.Priority = DMA_PRIORITY_MEDIUM; /* 优先级低 */
//----------------------------------------------------------------------------------------------------------
/* 初始化DMA */
if(HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)
{
Error_Handler();
}
/* 关联DMA句柄到SPI */
__HAL_LINKDMA(&hspi1, hdmatx, hdma_spi1_tx);
/* 使能DMA发送中断 */
HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
/* 同步触发配置 */
dmamux_syncParams.EventEnable = ENABLE;
dmamux_syncParams.SyncPolarity = HAL_DMAMUX_SYNC_RISING;
dmamux_syncParams.RequestNumber = 1;
dmamux_syncParams.SyncSignalID = HAL_DMAMUX1_SYNC_TIM12_TRGO; /* HAL_DMAMUX1_SYNC_TIM12_TRGO HAL_DMAMUX1_SYNC_LPTIM1_OUT*/
dmamux_syncParams.SyncEnable = ENABLE;
HAL_DMAEx_ConfigMuxSync(&hdma_spi1_tx, &dmamux_syncParams);
/*##-4- 启动DMA双缓冲传输 ################################################*/
/*
1、此函数会开启DMA的TC,TE和DME中断
2、如果用户配置了回调函数DMA_Handle.XferHalfCpltCallback,那么函数HAL_DMA_Init会开启半传输完成中断。
3、如果用户使用了DMAMUX的同步模式,此函数会开启同步溢出中断。
4、如果用户使用了DMAMUX的请求发生器,此函数会开始请求发生器溢出中断。
*/
if (HAL_DMAEx_MultiBufferStart_IT(&hdma_spi1_tx,
(uint32_t)dac_buffer1, // 缓冲区1地址
(uint32_t)&hspi1.Instance->TXDR, // SPI数据寄存器地址
(uint32_t)dac_buffer2, // 缓冲区2地址
BUFFER_SIZE)!= HAL_OK) {
Error_Handler();
}
/* 用不到的中断可以直接关闭 */
DMA1_Stream0->CR &= ~DMA_IT_DME;
DMA1_Stream0->CR &= ~DMA_IT_TE;
//DMAMUX1_RequestGenerator0->RGCR &= ~DMAMUX_RGxCR_OIE;
DMAMUX的同步模式的同步溢出中断如何关闭?
TIM12_Config();
//HAL_SPI_Transmit_DMA(&hspi1, (uint8_t*)dac_buffer1, BUFFER_SIZE); 该函数通过例程运行成功
} |
|