OpenEdv-开源电子网

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

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

[复制链接]

12

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2018-2-28
在线时间
23 小时
发表于 2018-9-25 09:27:17 | 显示全部楼层 |阅读模式
5金钱
  最近使用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); //循环发送,直到发送完毕

  如果你把第一行代码注释掉,就能够正常的发送。
  接收中断和发送功能有什么关系,真的蛮奇怪的。

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

使用道具 举报

12

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2018-2-28
在线时间
23 小时
 楼主| 发表于 2018-9-25 09:30:05 | 显示全部楼层
再把我的串口配置代码贴上来看下。
[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]
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-9-26 02:33:44 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 04:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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