经验分享 KL25 UART接收OR标志位问题

2020-02-21 21:34发布

本帖最后由 FSL_TICS_Robin 于 2014-7-30 10:12 编辑

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恢复正常接收接收状态。
4.png (24.21 KB, 下载次数: 0) 下载附件 4 2014-7-7 22:28 上传
图3.2  UART0_S1[OR]标志位描述
4. 参考资料
[1]        KL25P80M48SF0RM      Rev. 3, September 2012
[2]        FRDM-KL25Z_SCH


注:这个就是笔者在工作中发现的一个小细节,现将其记录在此,以供参考!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。