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

[复制链接]
 楼主| yuchl 发表于 2022-6-29 17:21 | 显示全部楼层 |阅读模式
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);

实在好奇怪!


 楼主| yuchl 发表于 2022-6-29 17:21 | 显示全部楼层
用STM32CubeMX生产V1.1软件,MCU选择STM32F407VE,生成代码测试UART1 IDEL+DMA接收, UART1接收问题依旧;更改keil到V5.29测试 -> USART1接收数据情况依旧;
Uriah 发表于 2022-10-5 10:14 | 显示全部楼层

具存储功能的存储器芯片也能加密
Bblythe 发表于 2022-10-5 13:13 | 显示全部楼层

大部分能够读取或者识别Flash上的数据就能够获得Firmware文件
Pulitzer 发表于 2022-10-5 16:12 | 显示全部楼层

如果在编程时加密锁定位被使能/锁定,就无法用普通编程器直接读取单片机内的程序
Clyde011 发表于 2023-4-1 07:15 | 显示全部楼层

从定时器为TIM2,从模式选择为门控模式,触发源选择ITR0,开启定时器2中断。
万图 发表于 2023-4-1 09:11 | 显示全部楼层

输出了5个频率为10KHz的PWM脉冲
Uriah 发表于 2023-4-1 10:14 | 显示全部楼层

使能主从模式,触发事件选择为更新事件,不需要开启中断。
帛灿灿 发表于 2023-4-1 12:10 | 显示全部楼层

根据实际需求选择用哪种方式
Bblythe 发表于 2023-4-1 13:13 | 显示全部楼层

主定时器为TIM1,通道2配置为PWM输出
周半梅 发表于 2023-4-1 15:09 | 显示全部楼层

主从定时的方式占用CPU资源少
Pulitzer 发表于 2023-4-1 16:12 | 显示全部楼层

主从定时器门控的方式
周半梅 发表于 2023-4-1 17:15 | 显示全部楼层

都可以产生指定个数的PWM脉冲
童雨竹 发表于 2023-4-1 18:08 | 显示全部楼层

中断计数的方式实现简
Wordsworth 发表于 2023-4-1 19:11 | 显示全部楼层

当PWM频率较高时,频繁的中断将影响程序运行的效率
您需要登录后才可以回帖 登录 | 注册

本版积分规则

165

主题

724

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部