【分享】KL关闭后重启串口不能正常运行解决办法——转帖

2020-02-21 20:53发布

本帖最后由 cn_x 于 2014-9-4 14:17 编辑

原文链接:http://blog.sina.com.cn/s/blog_7e76c0810102uypr.html
1. 适用范围

本文所描述现象适合于Kinetis L系列单片机,目前已测试过MKL25Z128VLK4、MKL26Z128VFM4两款芯片。其中MKL25Z128VLK4芯片的测试是基于FRDM-KL25Z开发套件。软件开发平台为Keil Review MDK 4.74 。2. 原理概述2.1      现象描述当UART0在接收数据的时候,如果在这时关闭UART0的串口接收中断,即停止接收数据(此时RXD引脚还有数据输入),那么在再次打开接收中断后,UART0不能进入接收中断继续接收数据。2.2      现象还原2.2.1   还原办法使用两个串口,一个串口作为测试对象,另外一个串口用于与PC进行通信,给MCU发送测试命令。本测试使用UART0作为被测试对象,UART1用于PC机向MCU发送命令。UART0使用端口为PTA1、PTA2,FRDM-KL25Z开发套件已将其通过USB转串口芯片连接到SDA接口上,使用时只需使用USB连接线直接连接到PC机即可。UART1使用端口为PTE0和PTE1,使用时需要外接USB转串口线连接到PC机。UART0采用中断接收方式,并且中断里面回传接收的数据。默认开启接收中断。在关闭UART0的接收中断后再次向UART0发送数据,故意使接收数据溢出。之后打开接收中断,观察UART0能否正常接收数据。UART1也采用中断接收方式,在UART1的中断函数中判断接收命令,并且置位相应的标志位,之后在主函数中根据标志位的变化对UART0进行操作,操作命令及功能如下。除此之外UART1还会回传UART0_SI寄存器的值。UART1发送指令:Ø  “A”:关闭串口0接收中断;Ø  “B”:开启串口0接收中断;Ø  “C”:清除UART0_S1寄存器OR标志位;2.2.2   还原步骤1.         通过UART0向MCU发送字符串“01234567889”,从串口助手接收到数据中可以看出UART0能够正常的回传数据(能够进入接收中断)。2.         通过UART1向MCU发送关闭UART0接收中断命令“A”。3.         再次向UART0发送字符串“abcdef”,从串口助手接收到数据中可以看出UART0并没有回传数据,由此可以推断UART0并没有进入接收中断程序。并且此时UART0_S1寄存器的值变为了0XD8,OR标志位被置位。UART0接收数据有溢出。4.         通过UART1向MCU发送开启UART0接收中断命令“B”。此时可以看到UART0回传了一个字节数据‘a’。此现象是由于UART0_S1[RDRF]接收数据寄存器满标志并没有被清除(因为之前关闭了接收中断,所以没有读数据寄存器),当打开接收中断后就会进入接收中断回传数据。5.         通过UART0向MCU发送字符串“0123456789”,UART0并没有回传数据,因此可以推断UART0并没有进入接收中断程序。因为OR标志位置位,RXD引脚接收到的数据直接丢失。6.         根据MKL25用户手册我们可以得知(如图2.1 ),UART0清除OR的办法是写1清零。发送命令“C”清除UART0_S1寄存器OR标志位,随即可以从UART1回传的数据中得知UART0_S1寄存器的值变为了0XD0,这时再次通过UART0发送数据即可正常的得到返回(能够进入接收中断),UART0恢复正常接收接收状态。 2.jpg (14.06 KB, 下载次数: 0) 下载附件 2014-9-4 14:17 上传
图3 .2   UART0_S1[OR]标志位描述4. 参考资料[1]      KL25P80M48SF0RM      Rev. 3, September 2012[2]      FRDM-KL25Z_SCH
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。