针对STM32 H723使用SPI6+BDMA时频繁出现UDR(Underrun)和OVR(Overrun)错误的问题,以下是逐步解决方案:
SPI_BaudRatePrescaler参数。hdma_rx.Init.PeriphRequest = BDMA_REQUEST_SPI6_RX;
hdma_rx.Init.Mode = DMA_CIRCULAR; // 循环模式
hdma_tx.Init.Mode = DMA_CIRCULAR;HAL_NVIC_SetPriority)。void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) {
if (hspi->Instance == SPI6) {
__HAL_SPI_CLEAR_UDRFLAG(hspi); // 清除UDR标志
__HAL_SPI_CLEAR_OVRFLAG(hspi); // 清除OVR标志
HAL_SPI_DeInit(hspi);
HAL_SPI_Init(hspi);
// 重新启动DMA传输
}
}hdma_rx.Init.DoubleBufferMode = ENABLE;
hdma_rx.Init.MemoryBurst = DMA_MBURST_INC4;
HAL_DMAEx_MultiBufferStart_IT(&hdma_rx, (uint32_t)&SPI6->RXDR, rx_buf0, rx_buf1, BUFFER_SIZE);SCB_CleanDCache_by_Addr或SCB_InvalidateDCache_by_Addr维护缓存。// 发送前清理发送缓冲区缓存
SCB_CleanDCache_by_Addr(tx_buffer, BUFFER_SIZE);
// 接收后无效化接收缓冲区缓存
SCB_InvalidateDCache_by_Addr(rx_buffer, BUFFER_SIZE);HAL_DMA_Start_IT(&hdma_rx, (uint32_t)&SPI6->RXDR, (uint32_t)rx_buf, BUFFER_SIZE);
HAL_DMA_Start_IT(&hdma_tx, (uint32_t)tx_buf, (uint32_t)&SPI6->TXDR, BUFFER_SIZE);
HAL_SPI_TransmitReceive_DMA(&hspi6, tx_buf, rx_buf, BUFFER_SIZE);SPI_SR、BDMA_CxCR),分析错误触发时的状态。通过调整SPI/DMA配置、优化中断处理、确保缓存一致性,并验证硬件信号,可有效解决UDR和OVR错误。若问题仍存在,建议逐步简化代码(如禁用其他外设),定位冲突源。
举报
举报
举报
更多回帖