发新帖我要提问
12
返回列表
打印
[其他ST产品]

STM32串口通信原理及HAL库代码stm32f1xx

[复制链接]
楼主: 一点点0321
手机看帖
扫描二维码
随时随地手机跟帖
21
一点点0321|  楼主 | 2023-9-20 14:57 | 只看该作者 回帖奖励 |倒序浏览
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{//串口中断接收函数
  /* Check that a Rx process is not already ongoing */
  if(huart->RxState == HAL_UART_STATE_READY)
  {
    if((pData == NULL) || (Size == 0U))
    {
      return HAL_ERROR;
    }

使用特权

评论回复
22
一点点0321|  楼主 | 2023-9-20 14:57 | 只看该作者
  /* Process Locked */
    __HAL_LOCK(huart);

    huart->pRxBuffPtr = pData;//接收的数据缓存指针
    huart->RxXferSize = Size;//接收的最大数据量字节数
    huart->RxXferCount = Size;//还剩余的要接收的数据量字节数

    huart->ErrorCode = HAL_UART_ERROR_NONE;
    huart->RxState = HAL_UART_STATE_BUSY_RX;
   
    /* Process Unlocked */
    __HAL_UNLOCK(huart);

    /* Enable the UART Parity Error Interrupt */
    __HAL_UART_ENABLE_IT(huart, UART_IT_PE);//校验错误中断使能

    /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
    __HAL_UART_ENABLE_IT(huart, UART_IT_ERR);//错误中断使能-帧错误,噪错误,满溢错误

    /* Enable the UART Data Register not empty Interrupt */
    __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);//接收中断使能【如果串口收到数据,则进入到串口处理函数HAL_UART_IRQHandler】

    return HAL_OK;
  }

使用特权

评论回复
23
一点点0321|  楼主 | 2023-9-20 14:57 | 只看该作者
else
  {
    return HAL_BUSY;
  }
}

使用特权

评论回复
24
一点点0321|  楼主 | 2023-9-20 14:57 | 只看该作者
如果串口收到数据,则进入到串口处理函数HAL_UART_IRQHandler的下面部分执行

    if(((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
    {//打开串口中断,且有数据收到-RXNE被置位
      UART_Receive_IT(huart);
      return;
    }

static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
{
  uint16_t* tmp;
  
  /* Check that a Rx process is ongoing */
  if(huart->RxState == HAL_UART_STATE_BUSY_RX)
  {
    if(huart->Init.WordLength == UART_WORDLENGTH_9B)
    {//带有校验
      tmp = (uint16_t*) huart->pRxBuffPtr;
      if(huart->Init.Parity == UART_PARITY_NONE)
      {
        *tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x01FF);
        huart->pRxBuffPtr += 2U;
      }

使用特权

评论回复
25
一点点0321|  楼主 | 2023-9-20 14:57 | 只看该作者
else
      {
        *tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x00FF);
        huart->pRxBuffPtr += 1U;
      }
    }
    else
    {//不带校验
      if(huart->Init.Parity == UART_PARITY_NONE)
      {
        *huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF);//接收数据寄存器RDR被读取【保存数据到接收buf,并指向下一个】,RXNE标志复位。【当下1字节数据8位全部都从接收移位寄存器转移到接收数据寄存器RDR后,RXNE再次被置位,将再次触发RXNE中断,再次到此处执行,如此循环直到收完全部数据】

使用特权

评论回复
26
一点点0321|  楼主 | 2023-9-20 14:58 | 只看该作者
else
      {
        *huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F);
      }
    }

    if(--huart->RxXferCount == 0U)
    {//收完全部数据后
      /* Disable the IRDA Data Register not empty Interrupt */
      __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);//关闭RXNE中断

      /* Disable the UART Parity Error Interrupt */
      __HAL_UART_DISABLE_IT(huart, UART_IT_PE);//关闭校验错误中断
        /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
        __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);//关闭错误中断

使用特权

评论回复
27
一点点0321|  楼主 | 2023-9-20 14:58 | 只看该作者
/* Rx process is completed, restore huart->RxState to Ready */
      huart->RxState = HAL_UART_STATE_READY;

      HAL_UART_RxCpltCallback(huart);//接收完成中断回调函数,用户可以再这里做操作

      return HAL_OK;
    }
    return HAL_OK;
  }
  else
  {
    return HAL_BUSY;
  }
}

使用特权

评论回复
28
中国龙芯CDX| | 2024-4-28 18:14 | 只看该作者
楼主是使用的HAL库进行的开发?

使用特权

评论回复
29
中国龙芯CDX| | 2024-4-28 18:14 | 只看该作者
楼主是使用的HAL库进行的开发?

使用特权

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

本版积分规则