人间不清醒ab 2023-12-15 12:03 采纳率: 75%
浏览 9
已结题

hal库串口中断只能发不能收

串口发数据正常,对方也有回复,但就是单片机收不到,收数据中断也不进,回掉函数更没反应,怎么办?

void USARTx_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_USART2_CLK_ENABLE();
//    __HAL_RCC_AFIO_CLK_ENABLE();
    __HAL_RCC_GPIOF_CLK_ENABLE();
    /**USART2 引脚配置
    PF0     ------> USART2_TX
    PF1     ------> USART2_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF9_USART2;
    HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_1;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
    

//    HAL_UART_Receive_IT(&huart2,(uint8_t *)&aRxBuffer,1);

}



/* USART2 init function */

void USART2_Init(u16 baud)
{

    
    huart2.RxCpltCallback=UART2_RcvCpltCallBack;
  huart2.Instance = USART2;
  huart2.Init.BaudRate = baud;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }

    HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART2_IRQn);
    
    HAL_NVIC_ClearPendingIRQ(USART2_IRQn);
    

}

  • 写回答

1条回答 默认 最新

  • xiaobuding_QAQ 2023-12-15 16:28
    关注

    我的意思是这句话不能注释掉的,我给你发我用HAL库编写的串口,我的主控是STM32G030,你自己改下。

    UART_HandleTypeDef huart2;
    
    uint8_t uart2_rx_count = 0;
    uint8_t uart2_rx_buf[20]= {0};
    uint8_t Uart2Ch = 0;
    
    
    #define bound2          115200//Uart2波特率
    #define UART2_GPIO   GPIOA
    #define TX2_Pin          GPIO_PIN_2
    #define RX2_Pin          GPIO_PIN_3//根据实际引脚配置    
    
    /*******************************************************************************
     * 函数名:Uart_GPIO_Init
     * 描述  :串口2引脚配置初始化
     * 输入  :void
     * 输出  :void
     * 调用  :串口2初始化
     * 备注  :uart2复用引脚功能
    *******************************************************************************/
    void Uart_GPIO_Init(void)
    {
      GPIO_InitTypeDef GPIO_InitStruct = {0};
    
      /* GPIO Ports Clock Enable */    
      __HAL_RCC_GPIOA_CLK_ENABLE();            
        
      //uart2 tx
      GPIO_InitStruct.Pin = TX2_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Pull = GPIO_PULLUP;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
     GPIO_InitStruct.Alternate = GPIO_AF1_USART2;
      HAL_GPIO_Init(UART2_GPIO, &GPIO_InitStruct);        
    
      //uart2 rx
      GPIO_InitStruct.Pin = RX2_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Pull = GPIO_PULLUP;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
     GPIO_InitStruct.Alternate = GPIO_AF1_USART2;
      HAL_GPIO_Init(UART2_GPIO, &GPIO_InitStruct);        
    }
    
    
    /*******************************************************************************
     * 函数名:User_Uart2_Init
     * 描述  :用户串口2配置初始化
     * 输入  :void
     * 输出  :void
     * 调用  :串口2初始化
     * 备注  :
    *******************************************************************************/
    void User_Uart2_Init(void)
    {    
      __HAL_RCC_USART2_CLK_ENABLE();//USART2上电默认时钟是关闭的,需要手动打开
        
      huart2.Instance = USART2;
      huart2.Init.BaudRate = bound2;//设置波特率
      huart2.Init.WordLength = UART_WORDLENGTH_8B;//设置数据长度8位
      huart2.Init.StopBits = UART_STOPBITS_1;//设置停止位1位
      huart2.Init.Parity = UART_PARITY_NONE;//设置不使用奇偶校验
      huart2.Init.Mode = UART_MODE_TX_RX;//设置同时支持发送和接收
      huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;//禁用硬件流控制
      huart2.Init.OverSampling = UART_OVERSAMPLING_16;//使用16倍过采样
      huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;//禁用单个比特采样
      huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1;
      huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
      if (HAL_UART_Init(&huart2) != HAL_OK)
      {
        Error_Handler();
      }
      if (HAL_UARTEx_SetTxFifoThreshold(&huart2, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
      {
        Error_Handler();
      }
      if (HAL_UARTEx_SetRxFifoThreshold(&huart2, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
      {
        Error_Handler();
      }
      if (HAL_UARTEx_DisableFifoMode(&huart2) != HAL_OK)
      {
        Error_Handler();
      }
      __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);//启用接收中断
      HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);//设置优先级
      HAL_NVIC_EnableIRQ(USART2_IRQn);//UART2中断使能        
    }
    
    void USART2_IRQHandler(void)
    { 
      if(USART2->ISR & USART_ISR_RXNE_RXFNE)//检查接收缓冲区非空标志位
      {
        HAL_UART_IRQHandler(&huart2);
        uart2_rx_buf[uart2_rx_count] = Uart2Ch;                
        HAL_UART_Receive_IT(&huart2,(uint8_t *)&Uart2Ch,1);//启动接收,并配置接收完成时的中断回调函数    
      }        
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月23日
  • 已采纳回答 12月15日
  • 创建了问题 12月15日

悬赏问题

  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?
  • ¥50 复现论文;matlab代码编写
  • ¥30 echarts 3d地图怎么实现一进来页面散点数据和卡片一起轮播
  • ¥15 数字图像的降噪滤波增强
  • ¥15 心碎了,为啥我的神经网络训练的时候第二个批次反向传播会报错呀,第一个批次都没有问题
  • ¥15 MSR2680-XS路由器频繁卡顿问题
  • ¥15 VB6可以成功读取的文件,用C#读不了
  • ¥15 如何使用micpyhon解析Modbus RTU返回指定站号的湿度值,并确保正确?
  • ¥15 C++ 句柄后台鼠标拖动如何实现