求助STM32H750VB 串口空闲中断+DMA不定长接收配置代码
如题,我自己搞的老是只有一个字节进DMA接收缓冲。贴上关键部分代码,有熟悉的大牛麻烦指点一下?不胜感激!{:handshake:} :
__align(8) uint8_t Lidar_Buffer __attribute__((section (".RAM_D2")));//DMA1只能访问RAM D2区域
void MX_USART2_UART_Init(void)
{
__HAL_LINKDMA(&huart2,hdmarx,hdma_usart2_rx);
__HAL_LINKDMA(&huart2,hdmatx,hdma_usart2_tx);
huart2.Instance = USART2;
huart2.Init.BaudRate = 230400;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_8;
huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
//if (HAL_UARTEx_SetTxFifoThreshold(&huart2, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
//{
// Error_Handler();
//}
//if (HAL_UARTEx_SetRxFifoThreshold(&huart2, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
//{
// Error_Handler();
//}
if (HAL_UARTEx_DisableFifoMode(&huart2) != HAL_OK)
{
Error_Handler();
}
}
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(uartHandle->Instance==USART2)
{
/* USER CODE BEGIN USART2_MspInit 0 */
/* USER CODE END USART2_MspInit 0 */
/* USART2 clock enable */
__HAL_RCC_USART2_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**USART2 GPIO Configuration
PA2 ------> USART2_TX
PA3 ------> USART2_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USART2 DMA Init */
/* USART2_RX Init */
hdma_usart2_rx.Instance = DMA1_Stream0;
hdma_usart2_rx.Init.Request = DMA_REQUEST_USART2_RX;
hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart2_rx.Init.Mode = DMA_CIRCULAR;
hdma_usart2_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
hdma_usart2_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_usart2_rx) != HAL_OK)
{
Error_Handler();
}
HAL_UART_Receive_DMA(&huart2, Lidar_Buffer, Lidar_BufferLength);//配置串口DMA接收缓冲
/* USART2_TX Init */
hdma_usart2_tx.Instance = DMA1_Stream1;
hdma_usart2_tx.Init.Request = DMA_REQUEST_USART2_TX;
hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart2_tx.Init.Mode = DMA_NORMAL;
hdma_usart2_tx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
hdma_usart2_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_usart2_tx) != HAL_OK)
{
Error_Handler();
}
/* USART2 interrupt Init */
__HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);//空闲中断
HAL_NVIC_SetPriority(USART2_IRQn, 5, 0);//设置优先级
HAL_NVIC_EnableIRQ(USART2_IRQn);//串口2总中断
}
}
void USART2_IRQHandler(void)//串口2中断
{
if(__HAL_UART_GET_IT_SOURCE(&huart2,UART_IT_IDLE) \
&&__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE))
{
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
huart2.RxState = HAL_UART_STATE_READY;
hdma_usart2_rx.State = HAL_DMA_STATE_READY;
HAL_UART_RxCpltCallback(&huart2);//调用回调
}
/* Protect the IRQn */
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
/* USER CODE BEGIN USART2_IRQn 1 */
/* USER CODE END USART2_IRQn 1 */
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//回调函数
{
if(huart == &huart2)
{
static uint16_t count;
count = Lidar_BufferLength - __HAL_DMA_GET_COUNTER(&hdma_usart2_rx);
if(count == 0)return;
hdma_usart2_rx.Lock = HAL_UNLOCKED;
if(huart->pRxBuffPtr < Lidar_Buffer)
{
recedata(Lidar_Buffer,&count);//接收数据
HAL_UART_Receive_DMA(&huart2,Lidar_Buffer,Lidar_BufferLength);
}
else
{
recedata(Lidar_Buffer,&count);//接收数据
HAL_UART_Receive_DMA(&huart2,Lidar_Buffer,Lidar_BufferLength);
}
hdma_usart2_rx.Lock = HAL_LOCKED;
}
}
问题已经解决,DChche开启要注意的问题
https://blog.51cto.com/u_15127516/4265956 是有这个问题,https://www.amobbs.com/thread-5750715-1-1.html qwe2231695 发表于 2022-7-13 01:35
是有这个问题,https://www.amobbs.com/thread-5750715-1-1.html
(引用自3楼)
{:handshake:} {:lol:}
页:
[1]