OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2231|回复: 2

有高手在STM32上同时使用过TIMER的编码器接口和USART吗?是否有遇到BUG,可以一起交流一下啊

[复制链接]

2

主题

5

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-12-28
在线时间
3 小时
发表于 2016-12-28 23:11:15 | 显示全部楼层 |阅读模式
1金钱
我最近在用32F4做一个全向轮底盘,在通信上遇到了一个大BUG,只要轮子一转(及编码器接口计数了),USART就会少读取1-2字节,不知道如何解决,请各位大神帮帮忙。
通信协议是交互式的,上位机发下一帧(22字节)命令,底盘收到命令后,进行处理,然后返回一帧数据。上位机只有收到反馈的数据帧后才会发送下一行命令。轮子的转速用编码器采集,通过timer的编码器接口计数。
现在交互通信可以连续不断的循环进行,但是一旦我转一下底盘的轮子,通信立马就停止了,即便强制性向底盘再发送一帧数据,最多通信几个循环过后还是会停止,而且返回的数据还不全。我不太清楚是不是timer编码器接口影响了通信,蛋疼的是这种状况我都不知道怎么调试,出错是随机的,不知道什么时候、在哪儿打断点。下面是我的部分程序:

/*发送数据帧的函数,接收到命令,处理过后调用*/
void Send_Frame(MSG *msg)
{
        uint8_t i;
        for(i=0;i<msg_length;i++)
        {
                USART_SendData(USART2, msg->data);//每次发送一个字节
                while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);//检查TC标识,看是否发送完成
        }
}

/*用接收中断接收数据帧*/
void USART2_IRQHandler(void)
{
        static uint8_t head_flag=0;//
        static uint8_t count = 0;//
        static uint8_t data[msg_length]={0};//
        static uint8_t flag=0;
        uint8_t ch;
         
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
        {
                ch = USART_ReceiveData(USART2);
                data[count] = ch;
                count = (count + 1) % msg_length;      
               
                if(count == 0 && head_flag == 1)
                {//接收完了一帧数据,将其保存
                        Save_Frame(data);
                        count = head_flag = flag = 0;
                        memset( data, 0, 22);   
                }
        }
}


还有更邪门儿的,这是我对于0x04类型的指令的处理程序
case 0x04:
/*速度计算*/
。。。。。。。。。。。。。。。。。。。。。
/*发送数据帧赋值*/
。。。。。。。。。。。。。。。。。。。。。
/*将上位机下发的数据处理后保存*/
coord.X=(double)(cmd_buffer[buf_tail].D1-2000000000)/10000;
coord.Y=(double)(cmd_buffer[buf_tail].D2-2000000000)/10000;
coord.Theta=(double)(cmd_buffer[buf_tail].D3-30000)/100/57.29578;//××××××××
/*回发数据帧*/
Send_Frame(&msg);
break;

××××××那行代码,我一旦加上,04指令就不能循环通信,注释掉就可以。。

本来就弱鸡,现在就跟无头苍蝇一样。请大家帮帮忙。。。。。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

21

主题

387

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1043
金钱
1043
注册时间
2016-9-8
在线时间
213 小时
发表于 2016-12-29 08:50:47 | 显示全部楼层
这有啥邪门的?少了句USART_ClearITPendingBit(USART2,USART_IT_RXNE);                                 //清中断标识
shop60994719.taobao.com
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-12-28
在线时间
3 小时
 楼主| 发表于 2016-12-29 21:10:41 | 显示全部楼层
密耳 发表于 2016-12-29 08:50
这有啥邪门的?少了句USART_ClearITPendingBit(USART2,USART_IT_RXNE);                                 //清中断标识

这个标志位不是是硬件自动清零?那怎么平时还都不出故障呢?
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 07:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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