打印
[STM32F1]

波特率自适应

[复制链接]
3571|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小风车|  楼主 | 2015-8-18 16:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
pi, gp, IO, GPIO, ni
u32  USART1_Baud(void)                                                                        
{
        u16 t1=0,t2,t=0;               
        u32 b1,b2;
        u32 i;
      TIMER3_Init();
        b1 = GPIO_ReadInputDataBit(GPIOA,10);            
        for(i=0;i<32;)                                   
        {
                b2 = GPIO_ReadInputDataBit(GPIOA,10);   
                if(b2 != b1)                   //程序一直死在这儿            
                {
                        t2 = TIM3->CNT;         
                        b1 = b2;                        
                        if((t1 == 0)&&(t==0))        
                        {
                                t1 = t2;                    
                        }
                        else                                 
                        {
                                if(t == 0)                  
                                {
                                        t = t2-t1;           
                                }
                                else                        
                                {
                                        if((t2-t1)< t)      
                                        {
                                                t = t2-t1;
                                        }
                                }
                                t1 = t2;                     
                        }
                        i++;                                 
                }
        }
         
        TIM_Close(TIM3);                              
        return ((u32)t*403/400);  

}
int main()
{
            GPIO_InitTypeDef GPIO_InitStructure;
            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
      GPIO_Init(GPIOA, &GPIO_InitStructure);  
            LED_Init();
            delay_init();
            while(1)
                        {
                                USART1_Baud();
                                LED0=!LED0;
                                delay_ms(100);
                        }
}
我给PA10发送数据了,但是B1和B2一直相等,产生死循环,求大神们帮忙指点一下!
沙发
734774645| | 2015-8-18 18:52 | 只看该作者
这个原理是什么?》楼主讲讲。

使用特权

评论回复
板凳
643757107| | 2015-8-18 18:55 | 只看该作者
自动波特率是需要一个握手信号不?

使用特权

评论回复
地板
mmuuss586| | 2015-8-18 19:31 | 只看该作者
前面先读,马上进行判断;
怎么能反映的过来呢;
除非碰巧的时候才会不进行循环;

使用特权

评论回复
5
稳稳の幸福| | 2015-8-18 19:33 | 只看该作者
哈哈,楼上版主说的对啊,这个能算瞎猫抓死耗子吗?
我觉得这个关于串口通信的应该有个国际标准的握手协议。

使用特权

评论回复
6
稳稳の幸福| | 2015-8-18 19:34 | 只看该作者
就是在通信上,收发双方,都要遵守一个见面协议,第一次连接,需要握手,一般主机发起,当有设备连接后,主机发起询问,从机连接后,等待正确的消息。反正就是这个意思。

使用特权

评论回复
7
huayuliang| | 2015-8-18 21:22 | 只看该作者
说个俺熟悉的:
ethernut 上的例程里有个自动识别波特率。我没细看源码,不过从操作上就能看出来。
它是要你按下空格,而后设备接收,必然会用多个标准波特率值适配,当接收到正确值时,也就得到了相应的波特率。

使用特权

评论回复
8
小风车|  楼主 | 2015-8-19 08:34 | 只看该作者
734774645 发表于 2015-8-18 18:52
这个原理是什么?》楼主讲讲。

RX引脚上有电平变化时,就会读取定时器里面的值,循环多次,取两次电平变化最快的时候,然后取定时器里面的差值,算波特率。

使用特权

评论回复
9
小风车|  楼主 | 2015-8-19 08:34 | 只看该作者
643757107 发表于 2015-8-18 18:55
自动波特率是需要一个握手信号不?

不需要吧

使用特权

评论回复
10
xxdcq| | 2015-8-19 11:33 | 只看该作者

没有握手信号那真就是爆牙齿咬虱子,瞎猫抓死耗子!

使用特权

评论回复
11
songchenping| | 2015-8-19 12:48 | 只看该作者
波特率自适应得有个判断的过程和时间吧。太急了点。

使用特权

评论回复
12
huangqi412| | 2015-8-19 13:38 | 只看该作者
额,楼主为何要用波特率自适应,   STC的下载好像是波特率自适应,那个是因为挂的晶振不一样吧。
开始得发个固定字节捕捉位宽计算波特率吧,你这怎么得到位宽,靠运气?

使用特权

评论回复
13
fanxsd| | 2015-8-19 13:42 | 只看该作者
你都不来个信号 匹配一下 就开始啦!

使用特权

评论回复
14
mcu5i51| | 2015-8-19 14:24 | 只看该作者
STC 中 主机先发个7f就知道一个字节的时间了

使用特权

评论回复
15
小风车|  楼主 | 2015-8-19 15:43 | 只看该作者
huangqi412 发表于 2015-8-19 13:38
额,楼主为何要用波特率自适应,   STC的下载好像是波特率自适应,那个是因为挂的晶振不一样吧。
开始得发 ...

我是这么想的:一直取RX上的电平值,当两次电平值不一样时,从定时器中读数,然后算出波特率。
我的i++是在两次电平不一样时才会执行,所以不需要知道位宽,一直循环32次,得到波特率。
所以我认为无论位宽多少,都会得到波特率的值。
大神,不知道这么想对不对?看一下i++位置。

使用特权

评论回复
16
huangqi412| | 2015-8-19 16:09 | 只看该作者
小风车 发表于 2015-8-19 15:43
我是这么想的:一直取RX上的电平值,当两次电平值不一样时,从定时器中读数,然后算出波特率。
我的i++是 ...

:L ,  起始位=0,停止位=1,数据位可0可1.     你仅仅连续读32个脉冲,能知道速度?   我发送几个0XF0   或者发送几个0x80,   两种情况你算算结果一样么。。。          固定发送一个字节,用外中断+定时器 或者 直接捕捉吧,别用这样读高低电平,糟蹋这么好的单片机了。。。
还是先说说为什么要做波特率自适应吧。

使用特权

评论回复
17
734774645| | 2015-8-27 09:50 | 只看该作者
小风车 发表于 2015-8-19 08:34
RX引脚上有电平变化时,就会读取定时器里面的值,循环多次,取两次电平变化最快的时候,然后取定时器里面 ...

好算法,哈哈,这个方法太好了,以前还真没想过这样做,我试试。

使用特权

评论回复
18
734774645| | 2015-8-27 09:51 | 只看该作者
我觉得在计算完波特率后,应该发送个什么握手信号,进行确认

使用特权

评论回复
19
FireRiver9| | 2015-8-27 11:51 | 只看该作者
波特率自适应需要时间吗,大概多少

使用特权

评论回复
20
冰河w| | 2015-8-27 15:33 | 只看该作者
然而楼主的问题该怎么解决呢

使用特权

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

本版积分规则

4

主题

37

帖子

0

粉丝