[求助帖]开启串口接收中断,无法使用printf函数

2019-07-20 06:01发布

  最近使用HAL调试串口的程序,定位到一个很奇怪的问题!就是我把RXNEIE

清零之后,无法使用printf函数。(因为我们一般做串口中断程序处理的时候,接收
到完整字符串之后,先把中断关闭为了防止接收其他字符,等我们做完处理之后,再把串口接收中断开启。)
  下面来看我的测试代码!
  [mw_shl_code=applescript,true]  while (1)
  {  
    USART2->CR1 &= 0xdf;
   
    printf("fuck you!");
    delay_ms(100);  }[/mw_shl_code]
              
  在执行完while里面的第一行代码,再去执行printf函数。
  就会一直停在这一句while ((USART2->SR & 0X40) == 0); //循环发送,直到发送完毕

  如果你把第一行代码注释掉,就能够正常的发送。
  接收中断和发送功能有什么关系,真的蛮奇怪的。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
正点原子
1楼-- · 2019-07-20 06:26
 精彩回答 2  元偷偷看……
JQChris
2楼-- · 2019-07-20 06:10
再把我的串口配置代码贴上来看下。
[mw_shl_code=applescript,true]void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  
  if( huart->Instance == USART2 )
  {
    __HAL_RCC_GPIOA_CLK_ENABLE();  //开启GPIOA的时钟
    __HAL_RCC_USART2_CLK_ENABLE();   //使能USART2的时钟
   
    //发送引脚的配置
    GPIO_InitStructure.Pin = UART2_TX;
      GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
     GPIO_InitStructure.Pull = GPIO_NOPULL;
     GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStructure.Alternate = GPIO_AF7_USART2;  //复用映射
    HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);
   
     //接收引脚的配置
    GPIO_InitStructure.Pin = UART2_RX;
//      GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
//     GPIO_InitStructure.Pull = GPIO_NOPULL;
//    GPIO_InitStructure.Alternate = GPIO_AF7_USART2;  //复用映射
    HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);
   
    //NVIC的配置
    //中断分组已经在HAL_Init()当中配置成功,是2
    HAL_NVIC_SetPriority(USART2_IRQn, 1, 1); //设置中断优先级
    HAL_NVIC_EnableIRQ(USART2_IRQn);         //使能中断通道
   
   
  }
}

void UART2_Init(uint32_t Baudrate)                  //串口2的配置
{
  
  UART_Structure.Instance = USART2;
  UART_Structure.Init.BaudRate = Baudrate;
  UART_Structure.Init.WordLength = UART_WORDLENGTH_8B; //8位数据
  UART_Structure.Init.StopBits = UART_STOPBITS_1;      //1位停止位
  UART_Structure.Init.HwFlowCtl = UART_HWCONTROL_NONE; //无硬件流控制
  UART_Structure.Init.Mode = UART_MODE_TX_RX;          //发送和接收模式
  UART_Structure.Init.Parity = UART_PARITY_NONE;       //不使用奇偶校验
  
  HAL_UART_Init(&UART_Structure);       //这个函数会调用HAL_UART_MspInit
  
  //UART_Structure这个结构体变量已经指向了UART2
  //HAL_UART_Receive_IT(&UART_Structure,&UARTRxBuffer,1);//使能串口接受中断
  
  USART2->CR1 |= (uint8_t)0x20; //将RXNEIE置为1,开启接收中断
  
}
[/mw_shl_code]

一周热门 更多>