zzipeng 发表于 2022-7-11 21:20:51

求助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;
        }
}

zzipeng 发表于 2022-7-12 21:06:29

问题已经解决,DChche开启要注意的问题
https://blog.51cto.com/u_15127516/4265956

qwe2231695 发表于 2022-7-13 01:35:45

是有这个问题,https://www.amobbs.com/thread-5750715-1-1.html

zzipeng 发表于 2022-7-13 09:38:57

qwe2231695 发表于 2022-7-13 01:35
是有这个问题,https://www.amobbs.com/thread-5750715-1-1.html
(引用自3楼)

{:handshake:} {:lol:}
页: [1]
查看完整版本: 求助STM32H750VB 串口空闲中断+DMA不定长接收配置代码