硬汉嵌入式论坛

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

[有问必答] bsp教程里的UartSend的一点疑惑,请指导,谢谢

[复制链接]

2

主题

2

回帖

8

积分

新手上路

积分
8
发表于 2022-9-13 21:21:21 | 显示全部楼层 |阅读模式
static void UartSend(UART_T *_pUart, uint8_t *_ucaBuf, uint16_t _usLen)
{
    uint16_t i;

    for (i = 0; i < _usLen; i++)
    {
        /* 如果发送缓冲区已经满了,则等待缓冲区空 */
        while (1)
        {
            __IO uint16_t usCount;

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

            if (usCount < _pUart->usTxBufSize)
            {
                break;
            }
            else if(usCount == _pUart->usTxBufSize)/* 数据已填满缓冲区 */
            {
                if((_pUart->uart->CR1 & USART_CR1_TXEIE) == 0)
                {
                    SET_BIT(_pUart->uart->CR1, USART_CR1_TXEIE);
                }  
            }
        }
        .......
}

如果超过了 FIFO 大小,就需要等待有空间可用,针对这种情况有个重要的知识点,就是当缓冲刚刚填满的时候要判断发送空中断是否开启了,
如果填满了还没有开启,就会卡死在 while 循环中,所以多了一个刚填满时的判断,填满了还没有开启发送空中断,要开启下。


if((_pUart->uart->CR1 & USART_CR1_TXEIE) == 0)  为什么要做这个判断了,直接 SET_BIT(_pUart->uart->CR1, USART_CR1_TXEIE); 不是还要少一个操作吗?
还是说读操作比写操作要快一些?



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2022-9-14 02:36:41 | 显示全部楼层
这个提议非常好,可以批量测试下试试,看看是否正常。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 17:17 , Processed in 0.236644 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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