本帖最后由 21ele 于 2011-3-17 13:31 编辑
之前讨论过串口dma接收未知长度数据问题,如果收到的数据少于dma接收的数量就没有了,需要有一个超时机制,退出dma接收。
正好有时间仔细看了下数据手册关于串口接收IDLE中断部分,感觉用这个做是完全没有问题的,于是决定把之前程序用定时器做超时的部分替换掉。
动手调试之后,结果令人郁闷,开了接收中断,开了IDLE中断,结果这个IDLE中断根本就不来,完全不像预想的那样,开了接收而没有收到数据,就会一直来!!
不知哪位用过这个IDLE中断,给指点一下,如何才能触发?
如果真像有人所言的那样,根本就玩不出来,那可就是个硬件bug了。
关于IDLE手册中提到的部分有:
1.10 个带标志的中断源− 检测到总线为空闲
2.空闲符号被视为完全由“1"组成的一个完整的数据帧,后面跟着包含了数据的下一帧的开始位。(就是从起始位到停止位全为1)
3.置位 TE 将使得USART 在第一个数据帧前发送一空闲帧
4.当一空闲帧被检测到时,其处理步骤和接收到普通数据帧一样,但如果 IDLEIE位被设置将产生一个中断。
5.当RWU位被写1 时,USART进入静默模式。当检测到一空闲帧时,它被唤醒。然后RWU被硬件清零,但是USART_SR寄存器中的IDLE位并不置起。RWU还可以被软件写0。
6.接收期间:空闲总线检测中断、溢出错误中断、接收数据寄存器非空中断、校验错误中断、LIN 断开符号检测中断、噪音中断(仅在多缓冲器通信)和帧错误中断(仅在多缓冲器通信)。
7.IDLE:监测到IDLE总线
当检测到空闲总线时,该位被硬件置位。如果USART_CR1中的IDLEIE为1,产生中断。由软件序列清除该位(先读USART_SR,然后读USART_DR)
注意:IDLE位不会再次被置高直到RXNE位被置起(即又检测到一次空闲总线) |