我为 USART 数据接收路径配置 DMA。我已经功实现了发送,正在在处理接收。
DMA 配置是在 HAL_UART_MspInit() 中完成的,代码完全复制自 CubeMX 自动生成的版本,在另一个启用 CubeMX 的工程中运行正常:
else if(huart->Instance==USART3)
{
/* Peripheral clock enable */
__HAL_RCC_USART3_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
/**USART3 GPIO Configuration
PD8 ------> USART3_TX
PD9 ------> USART3_RX
*/
GPIO_InitStruct.Pin = XZaber_TX_Pin|XZaber_RX_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
/* USART3 DMA Init */
/* USART3_RX Init */
hdma_usart3_rx.Instance = DMA1_Stream1;
hdma_usart3_rx.Init.Channel = DMA_CHANNEL_4;
hdma_usart3_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_usart3_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart3_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart3_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart3_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart3_rx.Init.Mode = DMA_CIRCULAR;
hdma_usart3_rx.Init.Priority = DMA_PRIORITY_LOW;
hdma_usart3_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_usart3_rx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(huart,hdmarx,hdma_usart3_rx);
/* USART3 interrupt Init */
HAL_NVIC_SetPriority(USART3_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(USART3_IRQn);
}
在我不使用 CubeMX 的工程中,初始化时已显式调用:
__HAL_RCC_DMA1_CLK_ENABLE()
同时也调用了以下启动接收函数:
rv = HAL_UART_Receive_DMA(&huart1, OMRxDat, OM20_MEAS_GET_RXLEN);
rv = HAL_UART_Receive_DMA(&huart3, ZabRxDat, sizeof(ZabRxDat));
我用示波器能看到数据确实发回来了,但所有回调函数都不触发。
我检查了 UART_DMAReceiveCplt()、UART_DMARxHalfCplt 和 UART_DMAError()。
如何才能让数据接收时触发回调函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)?
|
|