打印
[应用相关]

STM32F429 UART IDLE 问题

[复制链接]
536|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
flycamelaaa|  楼主 | 2022-2-28 09:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
IDL, ST, ar
stm32F429 UART7 idle 出现一个问题,现象:设置IDLE中断,在接收数据时,每一个字节都会进IDLE,而且还会进两次。
还用了USART1 USART2 USART3 ,代码设置是一致的,进IDLE很正常。 就这个uart7的IDLE 有问题,很疑惑。
主要代码如下

初始化

```
void MX_UART7_Init(void)
{

  /* USER CODE BEGIN UART7_Init 0 */

  /* USER CODE END UART7_Init 0 */

  LL_USART_InitTypeDef USART_InitStruct = {0};

  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* Peripheral clock enable */
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_UART7);

  LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOF);
  /**UART7 GPIO Configuration
  PF6   ------> UART7_RX
  PF7   ------> UART7_TX
  */
  GPIO_InitStruct.Pin = UART_422_Backup_RX_Pin|UART_422_Backup_TX_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_8;
  LL_GPIO_Init(GPIOF, &GPIO_InitStruct);

  /* UART7 interrupt Init */
  NVIC_SetPriority(UART7_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),1, 0));
  NVIC_EnableIRQ(UART7_IRQn);

  /* USER CODE BEGIN UART7_Init 1 */

  /* USER CODE END UART7_Init 1 */
  USART_InitStruct.BaudRate = 115200;
  USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
  USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
  USART_InitStruct.Parity = LL_USART_PARITY_NONE;
  USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
  USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
  USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
  LL_USART_Init(UART7, &USART_InitStruct);
  LL_USART_ConfigAsyncMode(UART7);
  LL_USART_Enable(UART7);
  /* USER CODE BEGIN UART7_Init 2 */
    LL_USART_EnableIT_IDLE(UART7);
    LL_USART_EnableIT_RXNE(UART7);
  /* USER CODE END UART7_Init 2 */

}
```
中断部分处理如下,已经都屏蔽了中断内部数据的复制了。
  • void UART7_IRQHandler(void)
  • {
  •   /* USER CODE BEGIN UART7_IRQn 0 */
  •     uint8_t res=res;
  •   /* USER CODE END UART7_IRQn 0 */
  •   /* USER CODE BEGIN UART7_IRQn 1 */
  •     if(LL_USART_IsActiveFlag_RXNE(UART7))
  •         {
  •                 res = LL_USART_ReceiveData8(UART7);
  •     }
  •     if(LL_USART_IsActiveFlag_IDLE(UART7))
  •         {
  •         LL_USART_ClearFlag_IDLE(UART7) ;
  •     }
  •   /* USER CODE END UART7_IRQn 1 */
  • }

复制代码


使用特权

评论回复
沙发
diweo| | 2022-2-28 10:13 | 只看该作者
LL_USART_ClearFlag_IDLE(UART7) ;这里设个断点,单步跟踪一下,看看IDLE标志位是不是每次都清

使用特权

评论回复
板凳
香水城| | 2022-2-28 15:02 | 只看该作者
按理说,各个UART的IDle事件的处理是一样的,这些配置都是一样的。

会不会代码别的什么地方出了问题?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

653

主题

2697

帖子

0

粉丝