OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 79|回复: 0

STM32L4R5ZI串口接收中断的问题

[复制链接]

91

主题

215

帖子

0

精华

高级会员

Rank: 4

积分
697
金钱
697
注册时间
2014-10-15
在线时间
166 小时
发表于 3 天前 | 显示全部楼层 |阅读模式
1金钱
我用STM32CUBEMX生成了一个STM32L4R5ZI的串口程序,使能了接收中断。
部分代码:
  1. static void MX_USART1_UART_Init(void)
  2. {

  3.   /* USER CODE BEGIN USART1_Init 0 */

  4.   /* USER CODE END USART1_Init 0 */

  5.   /* USER CODE BEGIN USART1_Init 1 */

  6.   /* USER CODE END USART1_Init 1 */
  7.   huart1.Instance = USART1;
  8.   huart1.Init.BaudRate = 9600;
  9.   huart1.Init.WordLength = UART_WORDLENGTH_8B;
  10.   huart1.Init.StopBits = UART_STOPBITS_1;
  11.   huart1.Init.Parity = UART_PARITY_NONE;
  12.   huart1.Init.Mode = UART_MODE_TX_RX;
  13.   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  14.   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  15.   huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  16.   huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  17.   huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  18.   if (HAL_UART_Init(&huart1) != HAL_OK)
  19.   {
  20.     Error_Handler();
  21.   }
  22.   if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  23.   {
  24.     Error_Handler();
  25.   }
  26.   if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  27.   {
  28.     Error_Handler();
  29.   }
  30.   if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
  31.   {
  32.     Error_Handler();
  33.   }
  34.         HAL_UART_Receive_IT(&huart1, (uint8_t *)buffer, 1);
  35.         //HAL_NVIC_SetPriority(USART1_IRQn,0,0);
  36.         //HAL_NVIC_EnableIRQ(USART1_IRQn);
  37.   /* USER CODE BEGIN USART1_Init 2 */

  38.   /* USER CODE END USART1_Init 2 */

  39. }
复制代码
中断处理函数:
  1. void USART1_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN USART1_IRQn 0 */

  4.   /* USER CODE END USART1_IRQn 0 */
  5.   HAL_UART_IRQHandler(&huart1);
  6.   /* USER CODE BEGIN USART1_IRQn 1 */

  7.   /* USER CODE END USART1_IRQn 1 */
  8. }
复制代码
  1. void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
  2. {
  3.   uint32_t isrflags   = READ_REG(huart->Instance->ISR);
  4.   uint32_t cr1its     = READ_REG(huart->Instance->CR1);
  5.   uint32_t cr3its     = READ_REG(huart->Instance->CR3);

  6.   uint32_t errorflags;
  7.   uint32_t errorcode;
  8.         //uint8_t buffer[1];
  9.   /* If no error occurs */
  10.   errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE | USART_ISR_RTOF));
  11.   if (errorflags == 0U)
  12.   {
  13.     /* UART in mode Receiver ---------------------------------------------------*/
  14. #if defined(USART_CR1_FIFOEN)
  15.     if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)
  16.         && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)
  17.             || ((cr3its & USART_CR3_RXFTIE) != 0U)))
  18. #else
  19.     if (((isrflags & USART_ISR_RXNE) != 0U)
  20.         && ((cr1its & USART_CR1_RXNEIE) != 0U))
  21. #endif /* USART_CR1_FIFOEN */
  22.     {
  23.       if (huart->RxISR != NULL)
  24.       {
  25.         huart->RxISR(huart);
  26.                                 __HAL_UART_CLEAR_IDLEFLAG(&huart1);
  27.                                 __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
  28.                                 HAL_UART_Receive(&huart1,buffer,1,1000);
  29.                                 HAL_UART_Transmit(&huart1,buffer,1,1000);
  30.       }
复制代码
我试图先接收一个字节数据,然后再发送出去。
可是只能接收一个字节,我想可能是没有清中断标志。
我不知道怎么清,找了两个函数:
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
__HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
可是还是不管用。请高手指教,谢谢!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-6-4 02:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表