打印
[技术问答]

UART5 接收超时无效

[复制链接]
982|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hanhan1127|  楼主 | 2019-11-21 09:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
UART, TE, AD, ic
UART5参考规格描述确认超时是否有效,配置TOIC时间(这里选择80(即80个波特率时间)),TOCNTEN计数使能,RXTOIEN中断使能,发送5个BYTE的数据,均能正常中断并读取成功,但5个BYTE之后并未看看接收超时中断置位,为什么?
参数函数设置如下:
UART_SetTimeoutCnt(UART5,80); // 配置时间并使能计数功能
void UART_SetTimeoutCnt(UART_T* uart, uint32_t u32TOC)//底层库函数
{
    uart->TOUT = (uart->TOUT & ~UART_TOUT_TOIC_Msk)| (u32TOC);
    uart->INTEN |= UART_INTEN_TOCNTEN_Msk;
}

UART_ENABLE_INT(UART5, (UART_INTEN_RDAIEN_Msk|UART_INTEN_RXTOIEN_Msk )); // 使能接收中断,接收超时中断
NVIC_EnableIRQ(UART5_IRQn);// 使能总中断

void UART5_IRQHandler(void)
{
  u8 Readbuffer=0;
   u32IntSts= UART5->INTSTS;
   if(u32IntSts&UART_INTSTS_RXTOIF_Msk)//超时判断
   {
        UART_WRITE(UART5,0x88);
   }
   
   if(u32IntSts & UART_INTSTS_RDAINT_Msk)
   {   
     Readbuffer=UART_READ(UART5);   //读取数据,清标志
     UART_WRITE(UART5,Readbuffer);  
   }
}



使用特权

评论回复
沙发
dongliushui| | 2019-11-21 11:13 | 只看该作者
这是哪个芯片的,还有这么多串口。

使用特权

评论回复
板凳
hanhan1127|  楼主 | 2019-11-21 11:31 | 只看该作者
dongliushui 发表于 2019-11-21 11:13
这是哪个芯片的,还有这么多串口。

NUC442 。

使用特权

评论回复
地板
hanhan1127|  楼主 | 2019-11-21 11:33 | 只看该作者
这个超时规格描述的比较模糊,不太清楚什么时候启动,应该是中断后读取数据(RX_FIFO空)超时数据清零,并不会再次启动了。

使用特权

评论回复
5
21mengnan| | 2019-11-21 19:12 | 只看该作者
楼上科学

使用特权

评论回复
6
jasontu| | 2019-11-22 07:32 | 只看该作者
串口超时中断是指资料还在串口fifo里面,而且还超过来配置TOIC时间,才引发的中断。
你的代码开了rda中断,有资料就取走了,以致串口toic中断不会发生。
把下面的代码移除就可以,发生TOIC中断
   if(u32IntSts & UART_INTSTS_RDAINT_Msk)
    {   
      Readbuffer=UART_READ(UART5);   //读取数据,清标志
     UART_WRITE(UART5,Readbuffer);  
    }

使用特权

评论回复
7
幸福小强| | 2019-11-22 11:34 | 只看该作者
是不是楼上大侠说的这样

使用特权

评论回复
8
hanhan1127|  楼主 | 2019-11-25 11:07 | 只看该作者
jasontu 发表于 2019-11-22 07:32
串口超时中断是指资料还在串口fifo里面,而且还超过来配置TOIC时间,才引发的中断。
你的代码开了rda中断, ...

是这样的,我原本的意思是想通过超时来实现一帧数据传输,一帧长度不定,发现超时行不通,不过我已经解决了我的需求。

使用特权

评论回复
9
manufact| | 2019-11-25 16:42 | 只看该作者
具体解决方式可以分享一下么

使用特权

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

本版积分规则

9

主题

35

帖子

1

粉丝