打印

STM32F767单片机使用串口2死机问题

[复制链接]
2960|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我使用的单片机是STM32F767,使用了串口1,然后又使用了串口2,但我一使用串口2,就容易死机,死机后卡死在下图函数中,串口2的初始化如下:

unsigned char UART2_aRxBuffer[USART2_RXBUFFERSIZE];//HAL库使用的串口接收缓冲

UART_HandleTypeDef UART2_Handler; //UART句柄

//串口输出
int USART2_putc(int ch)
{        
        while((USART2->ISR&0X40)==0);//循环发送 直到发送完毕   
        USART2->TDR=(unsigned char)ch;      
        return ch;
}
void Drv_Usart2_Sendx(rt_uint8_t *data, rt_uint16_t size)
{
    rt_uint16_t i = 0;
    rt_interrupt_enter();
    for(i=0; i<size; i++)
    {
        USART2_putc(data);
    }
    rt_interrupt_leave();
}


void uart2_init(unsigned int bound)
{       
    //UART 3?ê??ˉéè??
    UART2_Handler.Instance=USART2;                                            //USART1
    UART2_Handler.Init.BaudRate=bound;                                            //波特率
    UART2_Handler.Init.WordLength=UART_WORDLENGTH_8B;                       //字长为8位格式
    UART2_Handler.Init.StopBits=UART_STOPBITS_1;                            //停止位为1
    UART2_Handler.Init.Parity=UART_PARITY_NONE;                                    //无奇偶校验位
    UART2_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;                       //无硬件流控
    UART2_Handler.Init.Mode=UART_MODE_TX_RX;                                    //收发模式
    HAL_UART_Init(&UART2_Handler);                                            //HAL_UART_Init()会使能UART1

    HAL_UART_Receive_IT(&UART2_Handler, (unsigned char *)UART2_aRxBuffer, USART2_RXBUFFERSIZE);//开启接收中断

}


//串口1中断服务程序
unsigned int USART2_timeout=0;
unsigned long USART2_Rec_rt_tick = 0;
//void USART2_IRQHandler(void)                       
//{
//   
//    //unsigned int maxDelay=0x1FFFF;
//   unsigned int maxDelay=0x1F;
//
//    rt_interrupt_enter();
//   
//    USART2_Rec_rt_tick = rt_tick_get();
//    HAL_UART_IRQHandler(&UART2_Handler);        //调用HAL库中断处理公用函数
//   
//    USART2_timeout=0;
//    while (HAL_UART_GetState(&UART2_Handler)!=HAL_UART_STATE_READY)//等待就绪
//    {
//        USART2_timeout++;//超时处理
//        if(USART2_timeout>maxDelay) break;               
//    }
//
//    USART2_timeout=0;
//    //一次处理完成后,重新开启中断并设置RxXferCount为1
//    while(HAL_UART_Receive_IT(&UART2_Handler,(unsigned char *)UART2_aRxBuffer, USART2_RXBUFFERSIZE)!=HAL_OK)
//    {
//        USART2_timeout++; //超时处理
//        if(USART2_timeout>maxDelay) break;       
//    }
//    rt_interrupt_leave();
//
//}

死机后卡死在这里


使用特权

评论回复

相关帖子

沙发
天命风流|  楼主 | 2021-12-2 15:37 | 只看该作者
我把串口2 的中断函数都屏蔽了,然后还是死机  求指点

使用特权

评论回复
板凳
天命风流|  楼主 | 2021-12-2 15:46 | 只看该作者
把串口2的初始化屏蔽后,立马不死机了

使用特权

评论回复
地板
l4157| | 2021-12-3 08:25 | 只看该作者
我调试F767的时候也碰到过,当时是接收错误中断没处理,你看下是不是和我一样的问题

使用特权

评论回复
5
天命风流|  楼主 | 2021-12-6 08:55 | 只看该作者
l4157 发表于 2021-12-3 08:25
我调试F767的时候也碰到过,当时是接收错误中断没处理,你看下是不是和我一样的问题 ...

接收错误中断怎么处理?

使用特权

评论回复
6
天命风流|  楼主 | 2021-12-6 11:39 | 只看该作者

使用特权

评论回复
7
l4157| | 2021-12-6 15:06 | 只看该作者
我只是简单的禁止错误中断,并清除中断错误标志:
void HAL_UART_IRQHandler_User(UART_HandleTypeDef *huart,uint16_t  p)
{
  uint32_t isrflags   = READ_REG(huart->Instance->ISR);
  uint32_t cr1its     = READ_REG(huart->Instance->CR1);

       
  /* UART in mode Receiver ---------------------------------------------------*/
  if(((isrflags & USART_ISR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
  {
    UART_Receive_IT_User(huart,p);
    return;
  }

  /* UART in mode Transmitter ------------------------------------------------*/
  if(((isrflags & USART_ISR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET))
  {
    UART_Transmit_IT_User(huart);
    return;
  }

  /* UART in mode Transmitter (transmission end) -----------------------------*/
  if(((isrflags & USART_ISR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))
  {
    UART_EndTransmit_IT_User(huart,p);
    return;
  }
        //No error process is needed!
        //Clear ORECF: Overrun error clear flag
        //Clear NCF: Noise detected clear flag
        //Clear FECF: Framing error clear flag
        //Clear PECF: Parity error clear flag       
        //        __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
        READ_REG(huart->Instance->ISR);
        READ_REG(huart->Instance->RDR);               

        huart->Instance->CR3        =        0;                //Error interrupt is inhibited
        //huart->Instance->ICR        =        0x000f;
}

使用特权

评论回复
8
l4157| | 2021-12-6 15:07 | 只看该作者
最后十几行

使用特权

评论回复
9
天命风流|  楼主 | 2021-12-13 15:15 | 只看该作者

使用特权

评论回复
10
天命风流|  楼主 | 2021-12-13 15:16 | 只看该作者

使用特权

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

本版积分规则

91

主题

1175

帖子

6

粉丝