硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3105|回复: 2
收起左侧

armfly的STM32F4XX开发板配套的bsp_uart_fifo.c的bug

[复制链接]

1

主题

0

回帖

1

积分

新手上路

积分
1
发表于 2016-11-10 14:54:16 | 显示全部楼层 |阅读模式
这是最新的官方发布版本的代码:

static void UartSend(UART_T *_pUart, uint8_t *_ucaBuf, uint16_t _usLen)
{
    uint16_t i;

    for (i = 0; i < _usLen; i++)
    {
        /* 如果发送缓冲区已经满了,则等待缓冲区空 */
    #if 0
        /*
            在调试GPRS例程时,下面的代码出现死机,while 死循环
            原因: 发送第1个字节时 _pUart->usTxWrite = 1;_pUart->usTxRead = 0;
            将导致while(1) 无法退出
        */
        while (1)
        {
            uint16_t usRead;

            DISABLE_INT();
            usRead = _pUart->usTxRead;
            ENABLE_INT();

            if (++usRead >= _pUart->usTxBufSize)
            {
                usRead = 0;
            }

            if (usRead != _pUart->usTxWrite)
            {
                break;
            }
        }
    #else
        /* 当 _pUart->usTxBufSize == 1 时, 下面的函数会死掉(待完善) */
        while (1)
        {
            __IO uint16_t usCount;

            DISABLE_INT();
            usCount = _pUart->usTxCount;
            ENABLE_INT();

            if (usCount < _pUart->usTxBufSize)
            {
                break;
            }
        }
    #endif

        /* 将新数据填入发送缓冲区 */
        _pUart->pTxBuf[_pUart->usTxWrite] = _ucaBuf;

        DISABLE_INT();
        if (++_pUart->usTxWrite >= _pUart->usTxBufSize)
        {
            _pUart->usTxWrite = 0;
        }
        _pUart->usTxCount++;
        ENABLE_INT();
    }

    USART_ITConfig(_pUart->uart, USART_IT_TXE, ENABLE);
}


注释提示:  /* 当 _pUart->usTxBufSize == 1 时, 下面的函数会死掉(待完善) */,起始这里不止_pUart->usTxBufSize=1时会出现,只要第一次填入串口fifo中的数据长度等于或大于发送buf的
大小时,都会出现以上是循环的问题。
我们注意到串口发送中断使能位是在这段代码的最后才被使能的,也就是必须等到所有数据都填充完后才开始中断的自动发送,当第一次填入的数据大于或等于RxBufSize时,这个时候中断发送是无法开启的,导致数据阻塞在FIFO中,于是就出现死循环中无法跳出的尴尬。
个人觉得可以这样改:

            if (usCount < _pUart->usTxBufSize)
            {
                break;
            }
            else if(usCount == _pUart->usTxBufSize)//数据已填满缓冲区
            {
                if(!(_pUart->uart->CR1&(1<<7)))
                    USART_ITConfig(_pUart->uart, USART_IT_TXE, ENABLE);
            }

评分

参与人数 1 +5 收起 理由
eric2013 + 5

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2016-11-11 00:22:36 | 显示全部楼层
谢谢楼主分享解决办法。[s:142]
回复

使用道具 举报

2

主题

51

回帖

57

积分

初级会员

积分
57
发表于 2016-11-30 17:48:30 | 显示全部楼层
楼主的解决方法,应该还是跳不出循环,差一条break语句。这个bug只用调用comSendBuf()函数,才会出现,调用printf函数是不会出现的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-18 05:07 , Processed in 0.277538 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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