GD32F305RE 串口连续发送卡死,求解决方法

[复制链接]
3417|15
手机看帖
扫描二维码
随时随地手机跟帖
ASCC|  楼主 | 2021-3-22 10:22 | 显示全部楼层 |阅读模式
本帖最后由 ASCC 于 2021-3-22 10:25 编辑

void Uart0_PutChar(unsigned char ch)
{         
                while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
                usart_data_transmit(USART0, (uint8_t)ch);
                while(RESET == usart_flag_get(USART0, USART_FLAG_TC));
               
}

int main(void)
{
while(1)
{
Uart0_PutChar(0xAA);
}
}

发送一段时间后会卡死在while(RESET == usart_flag_get(USART0, USART_FLAG_TC));这句,
有没有遇到过这样的问题大神,帮给个解决方案

使用特权

评论回复
zeshoufx| | 2021-3-22 11:44 | 显示全部楼层
后面加一句手动清除发送完成标志

使用特权

评论回复
ASCC|  楼主 | 2021-3-22 17:47 | 显示全部楼层
本帖最后由 ASCC 于 2021-3-22 18:06 编辑
zeshoufx 发表于 2021-3-22 11:44
后面加一句手动清除发送完成标志
不是要清掉标志位,而是要置位,
while(RESET == usart_flag_get(USART0, USART_FLAG_TC))
{

}卡在这句过不去


使用特权

评论回复
xdqfc| | 2021-3-22 18:08 | 显示全部楼层
ASCC 发表于 2021-3-22 17:47
不是要清掉标志位,而是要置位,
while(RESET == usart_flag_get(USART0, USART_FLAG_TC))
{

while(RESET == usart_flag_get(USART0, USART_FLAG_TC))
{
};
usart_flag_clear(USART0,USART_FLAG_TC);


我咋感觉到是不是应该这样写哈,是不是我记错了??

使用特权

评论回复
ASCC|  楼主 | 2021-3-22 18:19 | 显示全部楼层
xdqfc 发表于 2021-3-22 18:08
while(RESET == usart_flag_get(USART0, USART_FLAG_TC))
{
};

不行的 发送后USART_FLAG_TC发送完成标志位 未置位,一直在while循环中出不来啦

使用特权

评论回复
chcd007| | 2021-3-23 09:13 | 显示全部楼层
usart_data_transmit(USART0, (uint8_t)ch);
//加几个空指令试试
while(RESET == usart_flag_get(USART0, USART_FLAG_TC));
另外,接收一方会不会有硬件流控,通知发送方不能发送?

使用特权

评论回复
xdqfc| | 2021-3-23 09:39 | 显示全部楼层
实在不行就用发送中断吧,我几个项目都用GD的,串口接收跟发送都用的中断,从来没有遇到楼主所讲的问题,发送的数据量也很大。

使用特权

评论回复
ASCC|  楼主 | 2021-3-23 11:30 | 显示全部楼层
chcd007 发表于 2021-3-23 09:13
usart_data_transmit(USART0, (uint8_t)ch);
//加几个空指令试试
while(RESET == usart_flag_get(USART0, U ...

while(RESET == usart_flag_get(USART0, USART_FLAG_TC))
{
    delay_us(10);
}
这样延时还是会卡,没有硬件流控制的

使用特权

评论回复
ASCC|  楼主 | 2021-3-23 11:32 | 显示全部楼层
xdqfc 发表于 2021-3-23 09:39
实在不行就用发送中断吧,我几个项目都用GD的,串口接收跟发送都用的中断,从来没有遇到楼主所讲的问题,发 ...

串口用的是分时控制,用中断发送数据会混乱

使用特权

评论回复
ASCC|  楼主 | 2021-3-23 11:35 | 显示全部楼层
本帖最后由 ASCC 于 2021-3-23 11:41 编辑

void Uart2_PutChar(uint8_t ch)
{         
                uint16_t  limitTime;
               
                limitTime = 0;
        
    while(RESET == usart_flag_get(USART2, USART_FLAG_TBE));
                usart_data_transmit(USART2, (uint8_t)ch);
                while(RESET == usart_flag_get(USART2, USART_FLAG_TC))
                {
                        if(limitTime<0xff)
                        {
                                limitTime++;
                        }
                        else
                        {
//                                Beep();
                                break;
                        }
                }
}
目前采用这种方式处理的,115200波特率下while查询次数在0xee左右,
查询次数到0xff后直接跳出,可以继续发送。
希望GD技术能解决一下这个问题,这个问题虽然不大,查起来还是很费时间的。
支持国产芯片,希望能越做越好!!!

使用特权

评论回复
xdqfc| | 2021-3-24 09:28 | 显示全部楼层
仿真看一下状态寄存器各种标志位,看看正常发送时与不正常发送时,是不是有什么区别,芯片应该是没有问题的。

使用特权

评论回复
呐咯密密| | 2021-3-24 11:42 | 显示全部楼层
能贴一下usart_data_transmit(USART0, (uint8_t)ch);这个函数的原型吗?我用2.5M的比特率都没问题的。

使用特权

评论回复
ASCC|  楼主 | 2021-3-24 15:32 | 显示全部楼层
呐咯密密 发表于 2021-3-24 11:42
能贴一下usart_data_transmit(USART0, (uint8_t)ch);这个函数的原型吗?我用2.5M的比特率都没问题的。 ...

/*!
    \file  gd32f30x_usart.c
    \brief USART driver

    \version 2017-02-10, V1.0.0, firmware for GD32F30x
    \version 2018-10-10, V1.1.0, firmware for GD32F30x
    \version 2018-12-25, V2.0.0, firmware for GD32F30x
*/

/*
    Copyright (c) 2018, GigaDevice Semiconductor Inc.

    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice, this
       list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright notice,
       this list of conditions and the following disclaimer in the documentation
       and/or other materials provided with the distribution.
    3. Neither the name of the copyright holder nor the names of its contributors
       may be used to endorse or promote products derived from this software without
       specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
OF SUCH DAMAGE.
*/
/*!
    \brief      USART transmit data function
    \param[in]  usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4)
    \param[in]  data: data of transmission
    \param[out] none
    \retval     none
*/
void usart_data_transmit(uint32_t usart_periph, uint32_t data)
{
    USART_DATA(usart_periph) = ((uint16_t)USART_DATA_DATA & data);
}
我用的gd的库

使用特权

评论回复
ASCC|  楼主 | 2021-3-24 15:40 | 显示全部楼层
本帖最后由 ASCC 于 2021-3-24 15:47 编辑
xdqfc 发表于 2021-3-24 09:28
仿真看一下状态寄存器各种标志位,看看正常发送时与不正常发送时,是不是有什么区别,芯片应该是没有问题的 ...

状态标志位没有区别的
1616571546(1).jpg

使用特权

评论回复
lc1230| | 2021-4-26 08:26 | 显示全部楼层
我也碰到了这个问题,两个串口,一个DMA方式接收发送没有问题,另一个和楼主一样,同样出现了卡死在TC标志判断,在9600波特率比较容易出现,高波特率反而没有遇到。
不知道gd这个有什么差异

使用特权

评论回复
mutou126| | 2024-11-23 10:46 | 显示全部楼层
你好,这个问题你解决了吗,我也遇到了同样的问题,除了把while循环屏蔽掉还有别的办法吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

16

帖子

0

粉丝