[求助] STM32F407VE替换STM32F429VI出现UART1空闲中断异常问题

jack4103   2022-6-29 17:23 楼主

STM32F429VI价格太高,用STM32F407VE替换,没有修改程序测试UART,SPI,CAN都正常。使用一段时间后发现UART1空闲中断只能接收一个字节,而UART2,3相同设置能正常接收;
           初始如下:
         if(uartHandle->Instance==USART1)
  {
  /* USER CODE BEGIN USART1_MspInit 0 */

  /* USER CODE END USART1_MspInit 0 */
    /* USART1 clock enable */
    __HAL_RCC_USART1_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**USART1 GPIO Configuration
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
    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_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* USART1 DMA Init */
    /* USART1_RX Init */
    hdma_usart1_rx.Instance = DMA2_Stream2;
    hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4;
    hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_usart1_rx.Init.Mode = DMA_NORMAL;
    hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW;
    hdma_usart1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart1_rx);

    /* USART1_TX Init */
    hdma_usart1_tx.Instance = DMA2_Stream7;
    hdma_usart1_tx.Init.Channel = DMA_CHANNEL_4;
    hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_usart1_tx.Init.Mode = DMA_NORMAL;
    hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
    hdma_usart1_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart1_tx);

    /* USART1 interrupt Init */
    HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);
  /* USER CODE BEGIN USART1_MspInit 1 */

  /* USER CODE END USART1_MspInit 1 */
  }

           接收处理如下:

            __HAL_UART_CLEAR_IDLEFLAG(&huart1);
            HAL_UART_DMAStop(&huart1);
            temp = huart1.hdmarx->Instance->NDTR;
            Usart1Type1.rx_len =  UART_RECEIVE_LEN - temp;
            Usart1Type1.receive_flag = 1;
            HAL_UART_Receive_DMA(&huart1, Usart1Type1.usartDMA_rxBuf, UART_RECEIVE_LEN);
            __HAL_DMA_SET_COUNTER(huart->hdmarx, UART_RECEIVE_LEN);
            __HAL_DMA_ENABLE(huart->hdmarx);

实在好奇怪!

用STM32CubeMX生产V1.1软件,MCU选择STM32F407VE,生成代码测试UART1 IDEL+DMA接收, UART1接收问题依旧;更改keil到V5.29测试 -> USART1接收数据情况依旧;

回复评论 (3)

F407.jpg

F429.jpg 不知问题是不是出在这里:

UART1 在两个芯片的最高速率不一样, 429 比 407 高, 所以有时出问题。

这也可解释为什么 UART2, UART3 正常, 应为用的 时种源不一样, 1 是 APB2, 2,3 是 APB1。

你可能要改 RCC 设置。

 

点赞  2022-6-30 02:12

好的,我配置的是使用内部晶振,倍频到168M。奇怪的是这个以前都可以,过了一段时间就有问题。

点赞  2022-7-1 14:39

重新更新了一下,又都可以了,换了一根USB转RS232线。问题是以前的USB转串口线在STM32F429上是正常的。

 

点赞  2022-7-1 15:44
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复