OpenEdv-开源电子网

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

求助F030 HAL库串口中断接收问题

[复制链接]

11

主题

92

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2016-3-27
在线时间
83 小时
发表于 2017-3-28 16:23:37 | 显示全部楼层 |阅读模式
50金钱
首先我在F030系列生成的代码中,没有看到回调函数的调用.
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;
    }

    /* In case of 9bits/No Parity transfer, pData buffer provided as input paramter
       should be aligned on a u16 frontier, as data to be received from RDR will be
       handled through a u16 cast. */
    if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
    {
      if((((uint32_t)pData)&1U) != 0U)
      {
        return  HAL_ERROR;
      }
    }

    /* Process Locked */
    __HAL_LOCK(huart);

    huart->pRxBuffPtr = pData;
    huart->RxXferSize = Size;
    huart->RxXferCount = Size;

    /* Computation of UART mask to apply to RDR register */
    UART_MASK_COMPUTATION(huart);

    huart->ErrorCode = HAL_UART_ERROR_NONE;
    huart->RxState = HAL_UART_STATE_BUSY_RX;

    /* Process Unlocked */
    __HAL_UNLOCK(huart);

    /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
    SET_BIT(huart->Instance->CR3, USART_CR3_EIE);

    /* Enable the UART Parity Error and Data Register not empty Interrupts */
    SET_BIT(huart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE);


    return HAL_OK;
  }
  else
  {
    return HAL_BUSY;
  }
}


然后我在while循环之前开启中断  HAL_UART_Receive_IT(&huart2,Rx_Buf,1);
确定Rx_Buf可以接到数据,但是我在回调函数里转存数据的时候,就无法转存过去
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
{
    Zigbee_Buf[R_Count++]=Rx_Buf[0];
    HAL_UART_Receive_IT(&huart2,Rx_Buf,1);
}
Zigbee_Buf这个数组里一直没数据...而且我只能接收到第一次发送的一个字节的数据,第二次发另外的数据就接收不到了,..不知道问题出在哪里了.有没有人懂这个的,..点拨一下





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

92

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2016-3-27
在线时间
83 小时
 楼主| 发表于 2017-3-28 16:37:48 | 显示全部楼层
我知道了......写错函数了...HAL_UART_RxCpltCallback应该是这个  晕.......
调用回调函数的是在这个函数里面
HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
{
  uint16_t* tmp;
  uint16_t  uhMask = huart->Mask;
  uint16_t  uhdata;

  /* Check that a Rx process is ongoing */
  if(huart->RxState == HAL_UART_STATE_BUSY_RX)
  {
    uhdata = (uint16_t) READ_REG(huart->Instance->RDR);
    if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
    {
      tmp = (uint16_t*) huart->pRxBuffPtr ;
      *tmp = (uint16_t)(uhdata & uhMask);
      huart->pRxBuffPtr +=2U;
    }
    else
    {
      *huart->pRxBuffPtr++ = (uint8_t)(uhdata & (uint8_t)uhMask);
    }

    if(--huart->RxXferCount == 0U)
    {
      /* Disable the UART Parity Error Interrupt and RXNE interrupt*/
      CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));

      /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
      CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);

      /* 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
  {
    /* Clear RXNE interrupt flag */
    __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);

    return HAL_BUSY;
  }
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165359
金钱
165359
注册时间
2010-12-1
在线时间
2110 小时
发表于 2017-3-28 21:38:18 | 显示全部楼层
帮顶
回复

使用道具 举报

22

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2016-5-17
在线时间
29 小时
发表于 2017-6-11 00:05:41 | 显示全部楼层

请问下  为什么要 用void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)这个函数呢?不用不行吗?
static void MX_USART1_UART_Init(void)
{

  huart1.Instance = USART1;
  huart1.Init.BaudRate = 9600;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
        HAL_UART_IRQHandler(&huart1);        
        //HAL_UART_Receive_IT(&huart1,(uint8_t *)aRxBuffer,RXBUFFERSIZE);
        UART_Receive_IT(&huart1);

}
//void USART1_IRQHandler(void)
//{
//        u8 Res;
//        
//        if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)!=RESET))  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
//        {
//        HAL_UART_Receive(&huart1,&Res,1,1000);
//                if((USART_RX_STA&0x8000)==0)//接收未完成
//                {
//                        if(USART_RX_STA&0x4000)//接收到了0x0d
//                        {
//                                if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
//                                else USART_RX_STA|=0x8000;        //接收完成了
//                        }
//                        else //还没收到0X0D
//                        {        
//                                if(Res==0x0d)USART_RX_STA|=0x4000;
//                                else
//                                {
//                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
//                                        USART_RX_STA++;
//                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收         
//                                }                 
//                        }
//                }                    
//        }
//        
//}我这样写就是不行呢?进不去中断里面 是我没有使能接收中断啊?还是写的对不呢
回复

使用道具 举报

11

主题

92

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2016-3-27
在线时间
83 小时
 楼主| 发表于 2017-7-19 15:37:11 | 显示全部楼层
那个回调函数算是HAL库的特色机制吧= =
回复

使用道具 举报

11

主题

92

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2016-3-27
在线时间
83 小时
 楼主| 发表于 2017-7-19 15:38:13 | 显示全部楼层
STM32初学~zy 发表于 2017-6-11 00:05
请问下  为什么要 用void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)这个函数呢?不用不行吗?
...

那个是回调函数,HAL库的特色机制吧,你这种库函数的不知道能不能兼容,其他没问题的话,也许就是不能兼容
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-12-19 04:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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