GD32串口很奇怪的问题

[复制链接]
8588|18
手机看帖
扫描二维码
随时随地手机跟帖
LinQian_Sun|  楼主 | 2016-4-19 10:03 | 显示全部楼层 |阅读模式
最近经常用GD片的串口,仿真时总自动进中断,赶工期没细找问题,把功能做好后,正常运行时,功能是看起来正常。试着找问题,也是不得解。常试着改各种标志位也效果不满意。断开外部信好串口也是仿真时自动进中断。
LinQian_Sun|  楼主 | 2016-4-19 14:30 | 显示全部楼层
if(USART_GetIntBitState(USART2, USART_INT_ORE) != RESET)  
        {       
        //USART_ClearBitState(USART2, USART_FLAG_ORE);
       USART_ClearIntBitState(USART2, USART_INT_ORE);
    }
    else if(USART_GetIntBitState(USART2, USART_INT_RBNE) != RESET)  
        {       
        TempData = USART_DataReceive(USART2);

        if(b_Usart2_Rxd_End)
        {

绿色断点一直不进,红色断点无数据也自动进

使用特权

评论回复
LinQian_Sun|  楼主 | 2016-8-5 17:49 | 显示全部楼层
void USART2_IRQHandler(void)               
{
    INT8U TempData;
   
    if(USART_GetIntBitState(USART2, USART_INT_RBNE) != RESET)  
        {       
        TempData = USART_DataReceive(USART2);
        
        if(b_Usart2_Rxd_End)
        {
            if(!b_Usart2_Rxd_Start)
            {
                b_Usart2_Rxd_Start = 1;
                b_Usart2_Rxd_Err = 0;
               
                Usart2_Rxd_Len =0;
                pUsart2_Rxd =Usart2_Rxd_Buf;
            }
            
            if(Usart2_Rxd_Len <USART2_RX_MAX)
            {
                *pUsart2_Rxd++ = TempData;
                Usart2_Rxd_Len++;
            }
            else
            {
                b_Usart2_Rxd_Err = 1;
            }
        }
        Usart2_Rxd_TimeCnt = 0;     
    }
    else if(USART_GetIntBitState(USART2, USART_INT_TC) != RESET)
    {
        if(Usart2_Txd_Len >0)
        {
            Usart2_Txd_Len--;
            USART_DataSend(USART2 , *pUsart2_Txd++ );
        }
        else
        {
            USART_INT_Set(USART2, USART_INT_TC, DISABLE);
        }
    }
   
    USART_ClearIntBitState(USART2, USART_INT_ORE);
}

总算好了

使用特权

评论回复
LinQian_Sun|  楼主 | 2016-8-5 17:51 | 显示全部楼层
GD32F130的串口中断标志很易出问题。这个中断代码搞恶好久才搞稳定。

使用特权

评论回复
GD代理商| | 2016-8-8 08:57 | 显示全部楼层
代理商飘过!~
联系请点我头像哦!么么哒!

使用特权

评论回复
firstblood| | 2016-8-13 21:18 | 显示全部楼层
这个还是慢慢的找下问题的吧

使用特权

评论回复
firstblood| | 2016-8-13 21:18 | 显示全部楼层
估计硬件上也有问题的,都一一排除的。

使用特权

评论回复
历史暴君| | 2016-8-18 09:46 | 显示全部楼层
是否有短路

使用特权

评论回复
wshm1127| | 2018-10-25 19:20 | 显示全部楼层
您好,请问您最后是怎么解决的。我也遇到一样的问题。

使用特权

评论回复
gaoke231| | 2018-10-25 22:18 | 显示全部楼层
清除硬件标志位,应该不是芯片的bug的

使用特权

评论回复
gaoke231| | 2018-10-25 22:18 | 显示全部楼层
GD32 跟stm32类似很稳定的。

使用特权

评论回复
SheryWang| | 2019-4-15 16:28 | 显示全部楼层
因为接收非空标志和溢出标志是同时被置一的,两者都能引发中断,接收非空标志在读取接收数据后自动清零了,溢出标致需要软件设置清零,试一下就不会反复进入中断了。手册上多看看就知道了。

使用特权

评论回复
lvben5d| | 2019-4-15 17:28 | 显示全部楼层
本帖最后由 lvben5d 于 2019-4-15 17:31 编辑

串口进中断,如果不处理好对应标志位,则会一直进入。 实战中,有概率会遇到 ORE  溢出中断,这个时候,你要读下串口寄存器来消除标志位。  正常接收过程中,不管数据要不要,都要【读接收寄存器】。 无论STM32还是GDF32设计的串口接收,只要读接收寄存器,就会清接收相关的中断标致。  GD32E103我的工程串口接收处理
   if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE))
{ 一定要读 接收寄存器}
   if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE))        {。。。。。}
   if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_ERR_ORERR))
    {
         usart_interrupt_flag_clear(USART0, USART_INT_FLAG_ERR_ORERR);    //清标致后  
         Sysinfo.Decode_year = usart_data_receive(USART0);                          //我也读接收寄存器
    }


使用特权

评论回复
lvben5d| | 2019-4-16 11:46 | 显示全部楼层
SheryWang 发表于 2019-4-15 16:28
因为接收非空标志和溢出标志是同时被置一的,两者都能引发中断,接收非空标志在读取接收数据后自动清零了, ...

我遇到过ORE中断,虽然我认为我的程序会在串口字节接收后,立即从串口接收寄存器取出数据,这样就不会产生ORE中断! 可能有其他因素没考虑仔细吧, 我的STM8芯片遇到这个串口字节溢出中断的时候,好像只会进溢出中断这边。 至于32位机的GD32, 我印象不深刻了,不过按照合理的编程风格,要对串口接收异常处理,否则程序肯定就当这里了。   大家实际应用中,如果不能及时从串口寄存器读出你的字符,说明串口中断优先级的安排就不好了,115200波特率下,大概是86Us进一次串口中断,你的程序其他地方不要阻塞那么久。 在合理可以保证通信速度下,降低串口波特率是明智的,9600是1.04ms 接收1个字符。

使用特权

评论回复
rurubudong| | 2020-3-18 16:44 | 显示全部楼层
你好,能给我发一下串口的程序么?

使用特权

评论回复
dxjian723| | 2020-3-29 23:15 | 显示全部楼层
我用GD32F130C8 代码大于一定量 usart就开始丢失数据
你的问题解决了吗

使用特权

评论回复
评论
yippeeeeeee 2021-3-5 11:30 回复TA
我现在做移植也出现了这个问题,也是GD32F130的;你有解决了吗 
便携手到老| | 2021-3-5 18:46 | 显示全部楼层
这种问题真的没有碰到过的。不知道究竟出现在什么地方。

使用特权

评论回复

使用特权

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

本版积分规则

1

主题

4

帖子

0

粉丝