查看: 2802|回复: 3

[求助] K60 UART FIFO的BUG

[复制链接]
  • TA的每日心情
    开心
    2018-8-30 16:02
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    36

    主题

    1065

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1851
    最后登录
    2019-11-19
    发表于 2015-9-14 23:50:02 | 显示全部楼层 |阅读模式
    本帖最后由 kingsings 于 2015-9-14 23:53 编辑

        今天做K60UART FIFO的实验。UART初始化是使能FIFO的,RX的FIFO深度为8(硬件决定),阈值采用默认的1。
        写了两个函数:

    1. void uart_getchar(UARTn_e uartn, char* ch)
    2. {
    3. while(!(UART_S1_REG(UARTN[uartn]) & UART_S1_RDRF_MASK));
    4. *ch = UART_D_REG(UARTN[uartn]);
    5. }


    6. char uart_query(UARTn_e uartn)
    7. {
    8.     if(UART_RCFIFO_REG(UARTN[uartn]))
    9.                 return 1;
    10.         else
    11.                 return 0;
    12. }
    复制代码

        然后在主函数中采用两种轮询方式获取字符。第一种如下:

    1. while(1)
    2.         {
    3.             if(uart_query(UART1e) != 0)
    4.                 {
    5.                     uart_getchar(UART1e,&charq);
    6.                         uart_putchar(UART1e,charq);
    7.                         
    8.                 }
    9.         };
    复制代码

        如果一直运行,那么上位机发送的字符可以立马被接收到并被返回,改变发送的字符后也会立马返回改变的字符。但如果是采用调试来一步步运行,断点设在 uart_getchar()函数的while循环后一句,只要停止断点处后再一直运行,那么发送的字符将无法立马被返回,改变字符后也无法立即改变。具体的就是发个a后,等待返回a,然后改变发送字符为c,这时仍然返回a,要发好几个c后才返回c,在这之前一直返回a。
        第二种如下:
    1. while(1)
    2.         {
    3.            
    4.                     uart_getchar(UART1e,&charq);
    5.                         uart_putchar(UART1e,charq);
    6.                         
    7.                
    8.         };
    复制代码

        直接采用uart_getchar()函数,不使用uart_query()。发现现象是差不多的,即一直运行不会出错,只要在 uart_getchar()函数的while循环那暂停一下(不使用断点,直接暂停),就会出现返回延迟的现象。
        不知道这是UART模块的BUG还是调试器的BUG。反正就是BUG。

    我知道答案 目前已有3人回答
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

    该用户从未签到

    124

    主题

    3600

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5781
    最后登录
    1970-1-1
    发表于 2015-9-15 09:31:29 | 显示全部楼层
    这倒是挺奇怪的,你可以边调试边看UART寄存器的状态变化如何
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-2-9 14:16
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    25

    主题

    1785

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2250
    最后登录
    2024-6-11
    发表于 2015-9-15 09:59:10 | 显示全部楼层
    注意观察寄存器状态
    freescaleic.org.png
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-8-30 16:02
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    36

    主题

    1065

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1851
    最后登录
    2019-11-19
     楼主| 发表于 2015-9-15 10:10:09 | 显示全部楼层
    FSL_TICS_ZP 发表于 2015-9-15 09:31
    这倒是挺奇怪的,你可以边调试边看UART寄存器的状态变化如何

    当上位机发送一个数据时,下位机收到并停止uart_getchar中while循环后的断点处,S[RDRF]=1,正常,D寄存器存的是发送的数据,但是RCFIFO寄存器却为0;然后接着运行一步,将D寄存器读走付给字符变量ch,这时S[RDRF] = 0,D寄存器变为0,RCFIFO仍然为0,但是ch却是0x00。这就奇怪了
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-28 17:34 , Processed in 0.093743 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表