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-20 14:17
最好别在串口中断里面做串口发送!
善良的二哥
2楼-- · 2019-07-20 17:22
 精彩回答 2  元偷偷看……
善良的二哥
3楼-- · 2019-07-20 20:11
正点原子 发表于 2017-5-17 21:12
最好别在串口中断里面做串口发送!

原子哥,我根据我的意思把你们提供的串口通信例程修改了下(F767),串口1接收中断中只负责接收,而主循环中则是串口循环发送,每个循环最多发送一个字节。发现如果主循环中不发送,则串口接收正常,接收速度很快。但是当我主循环里循环发送时,串口接收中断运行一段时间后就无法进入中断,但是程序没死,照样在发送。能麻烦帮看下吗,按理说串口中断也没关,其他中断也没打开。
下面是主循环程序:
[mw_shl_code=c,true]int main(void)
{
    u8 len,i;       
          u32 times=0;
    Cache_Enable();                 //打开L1-Cache
    HAL_Init();                                        //初始化HAL库
    Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz
    delay_init(216);                //延时初始化
          uart_init(115200);                        //串口初始化
    LED_Init();                     //初始化LED
    while(1)
    {
                        times++;
                        if(times>0x2fffff)
                        {
                                times=0;
                                for(i=0;i<12;i++)
                                {
                                        /***************加上这一句,串口接收就有问题*****************/
                                        UART1_TX_BUF[++UART1_SendBuf_Count]='0'+i;    //如果有发送的时候会导致运行无法进入串口接收中断?????
                                  /***************加上这一句,串口接收就有问题*****************/
                                }
                                LED0_Toggle;
                        }               
                        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);                //等待发送结束
                        }                         
          }
}
[/mw_shl_code]


下面是串口中断:
[mw_shl_code=c,true]void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        if(huart->Instance==USART1)//如果是串口1
        {
                UART1_RX_BUF[++UART1_ReceiveBuf_Count] = aRxBuffer_UART1[0]; //串口接收中断中只负责接收
                if(UART1_ReceiveBuf_Count%50==0) LED1_Toggle;
        }
}[/mw_shl_code]
麻烦百忙中帮看下,现在这个项目用的这块核心板,其中好几个串口通讯,都有这个问题。

善良的二哥
4楼-- · 2019-07-21 00:35
原子哥要是手上有开发板,可否帮我试下,万分感谢。
善良的二哥
5楼-- · 2019-07-21 01:55
 精彩回答 2  元偷偷看……
正点原子
6楼-- · 2019-07-21 02:13
善良的二哥 发表于 2017-5-18 23:39
原子哥,我程序中监视了串口寄存器中接收中断使能位,CR1的bit5------RXNEIE;
if((USART1- ...

这个确实是不应该被修改的。

一周热门 更多>