STM32L4R5的DMAMUX异常
__HAL_RCC_DMA1_CLK_ENABLE();__HAL_RCC_DMAMUX1_CLK_ENABLE();
/*##-3- Configure the DMA ##################################################*/
/* Configure the DMA handler for Transmission process (DMA的发送通道)*/
hdma_tx.Instance = DMA1_Channel5; //DMA1_Channel3
hdma_tx.Init.Request = DMA_REQUEST_GENERATOR0; // DMA_REQUEST_SPI2_TX
hdma_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; //内存到外设
hdma_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_tx.Init.MemInc = DMA_MINC_ENABLE; //DMA_MINC_ENABLEDMA_MINC_DISABLE
hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; //DMA_PDATAALIGN_WORDDMA_PDATAALIGN_BYTE
hdma_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; // DMA_MDATAALIGN_BYTEDMA_MDATAALIGN_WORD
hdma_tx.Init.Mode = DMA_CIRCULAR; //由 DMA_NORMAL 改为循环发送 DMA_CIRCULAR
hdma_tx.Init.Priority = DMA_PRIORITY_HIGH;
HAL_DMA_Init(&hdma_tx);
/* Associate the initialized DMA handle to the the SPI handle */
__HAL_LINKDMA(&ads1298_hspi, hdmatx, hdma_tx);
/* Register Error Callback */
HAL_DMA_RegisterCallback(&hdma_tx, HAL_DMA_XFER_ERROR_CB_ID, &HAL_TransferError);
/* NVIC configuration for DMA transfer complete interrupt*/
HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);
/*##-3- Configure and enable the DMAMUX Request generator####################(配置和使能DMAMUX请求生成器)*/
dmamux_ReqGenParams.SignalID= HAL_DMAMUX1_REQUEST_GEN_EXTI8; /* External request signal is EXTI0 signal HAL_DMAMUX1_REQ_GEN_EXTI8*/
dmamux_ReqGenParams.Polarity= HAL_DMAMUX_REQUEST_GEN_FALLING; /* External request signal edge is Rising*/
dmamux_ReqGenParams.RequestNumber = 27; /* 1 requests on each edge of the external request signal27*/
HAL_DMAEx_ConfigMuxRequestGenerator(ads1298_hspi.hdmatx, &dmamux_ReqGenParams);
/* NVIC configuration for DMAMUX request generator overrun errors*/
HAL_NVIC_SetPriority(DMAMUX1_OVR_IRQn, 4, 0);
HAL_NVIC_EnableIRQ(DMAMUX1_OVR_IRQn);
HAL_DMAEx_EnableMuxRequestGenerator (ads1298_hspi.hdmatx);
HAL_SPI_Transmit_DMA(&ads1298_hspi, adTxBuffer, 27);
代码如上,要配置的功能是DMAMUX检测到PF8的下降沿,就通过通过DMA1的DMA1_Channel5向SPI2->DR发送27个0xAA,实测发现:
dmamux_ReqGenParams.RequestNumber在的 值范围内时,每次中断触发时,DMA1_Channel5能够发送个数,但在范围内时,发送的个数就不够了,严重丢数。查了下库的寄存器配置,没有问题。现在不知道是自己调用的不对,还是其他问题?各位大神路过的帮看看!谢谢
你要传送的 adTxBuffer 跟 dmamux_ReqGenParams 不是一致的吧。
换言之,你的adTxBuffer是否被其他的程序更该?
再者,你用的是SPI的 DMA 传送。检查 SPI 设置。
页:
[1]