F7串口中断运行无法进入?

2019-07-20 14:13发布

最近公司一个项目,使用的核心板是原子哥的F767,自己设计了外部电路,现在在串口通讯是有点问题无法解决。
其中用到几个串口,和定时器,其中串口1是和上位机通讯,串口1的优先级最高,抢占优先级是1,其他串口和定时器都是2和3,串口1需要将ADC采集的数据每100ms一次上传给上位机;同时接收上位机的控制指令。串口1我只打开了接收中断,在接受中断中的唯一操作是将接收到的字节存入到我事先准备好的缓存数组中。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)      
{
if(huart->Instance==USART1)
{
  UART1_RX_BUF[++UART1_ReceiveBuf_Count] = aRxBuffer_UART1[0];   //将接收到的字节存入自己定义的接收缓存数组中
  if(UART1_ReceiveBuf_Count%50==0) LED1_Toggle;
}
每次ADC采集完成(100ms),将采集的值存入到我自己定义的发送缓存数组中,串口1的发送是循环发送,主循环中每次最多发送一个字节,主循环很快。
  if(ADC_Sampling_Enable==0)   //1组采样完成
  {
   Vin1=2.5*ADS1251_Read_middle(ADC_Sample)/0x7fffff;
   ADC_Sampling_Enable=1;    //开启下一组采样
   UART1_DisposalTemp[0]='?';    //头
   UART1_DisposalTemp[1]='1';    //表示主板的信息
   UART1_DisposalTemp[2]='1';    //表示测量的电压
   UART1_DisposalTemp[3]='1';    //对应的档位
      ADC_float_to_ascll(Vin1,UART1_DisposalTemp) ;
    UART1_DisposalTemp[11]='#';
    //printf(urt_disposaltemp);
   for(i=0;i<12;i++)
   {
    UART1_TX_BUF[++UART1_SendBuf_Count]=UART1_DisposalTemp[i];   //ADC采样值存入到自己定义的发送缓存数组中,等待发送
   }
  }


  if(UART1_SendBuf_Count!=UART1_SendBuf_Current)  //main循环中发送串口数据,此处每次最多发一个字节
  {
    HAL_UART_Transmit(&UART1_Handler,(uint8_t*)(&UART1_TX_BUF[++UART1_SendBuf_Current]),1,1000); //发送接收到的数据
   while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);  //等待发送结束
  }

问题如下:
串口1发送没问题,但是接收一段时间后会出现无法接收的现象,程序没有卡死,因为串口还在定时发送,但是就是无法进入串口接收中断。当我串口不发送时(把这句注释掉://UART1_TX_BUF[++UART1_SendBuf_Count]=UART1_DisposalTemp[i]; ),则串口接收就没问题。一开始以为接收中断是不是打开,调试时确认没打开(TXEIE和TCIE都是0);请教,这个可能是什么原因?


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
正点原子
1楼-- · 2019-07-21 20:55
善良的二哥 发表于 2017-5-23 15:49
原子哥,测试方法如下:
串口接收完成中断中将接收到的字节存入到自己定义的接收数组中,一旦接收到的字 ...

测试了,没问题。
我在寄存器版本,串口通信实验基础上修改的,将接收buf改为100KB大小。
然后每接收50个字节,就控制LED1取反。

测试结果如下:
无标题.png

源码: 实验3 串口通信实验-大量数据接收测试.rar (146.83 KB, 下载次数: 262) 2017-5-30 18:32 上传 点击文件名下载附件
正点原子
2楼-- · 2019-07-22 01:56
 精彩回答 2  元偷偷看……
善良的二哥
3楼-- · 2019-07-22 06:50
正点原子 发表于 2017-5-30 18:35
测试了大概一个小时,接收了76*100K数据,没有死机,正常执行。

原子哥,多谢你的写的例程,我试了也没有问题。但是我现在用库函数的话就会出现无法进入接收中断的现象,我写的例程在4楼,这个一边发送,一边接收,一会接收中断就进不去了,我也是在F7开发板上测试的,我发现是USART1->CR1的RXNEIE被清零了,如6楼所说。
原子哥,可否麻烦你帮我用我四楼的程序测试下,一会中断就死了,不甚感激。

一周热门 更多>