发一个自适应波特率的程序,看有没有人感兴趣

2020-02-02 09:20发布

搜了下好像坛子里还没人玩这个,个人觉得很有用,特别是产品比较开放的时候可以自动调节波特率,而且也不用愁晶振更换的问题了(例如12M、14M、10M都无所谓..)

点击此处下载 ourdev_630154BNSSDG.doc(文件大小:118K) (原文件名:单片机从机的波特率自适应设置.doc)

原理是测起始位宽度(第一位),并以此为标准设置波特率,呵呵,不是很难哈



(原文件名:串口 TTL电平规范,发送01 s所以低位在前.JPG)


(原文件名:串口 TTL电平规范,发送55.JPG)

注:此办法需要主机发送一个标准信号,例如01H,

我在想一个更好办法,就是多次捕获脉宽,然后取最小值(1B),然后平均~,应该也能实现~~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
65条回答
Ian11122840
2020-02-05 17:22
搞定,分享程序————用T2的时基(未用捕获引脚)来给Uart3做自适应波特率:

void Auto_baud(void)
{        u16 i,p,j,temp,n;
        u32 sum;                         
        const u16 tmplen=100;//捕获个数100字
        u16 ary[tmplen];         //捕获数组

        USART_InitTypeDef USART_InitStructure;
        TIM_TimeBaseInitTypeDef          TIM_TimeBaseStructure;       

//Timer2--72M: 捕获T3Rx用
         TIM_DeInit(TIM2);//复位TIM2定时器                 
         TIM_TimeBaseStructure.TIM_Period = 65535;                 //计数值max65535     
         TIM_TimeBaseStructure.TIM_Prescaler = 0;                //NO分频72M   
         TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; // 时钟分割  
         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //计数方向向上计数
         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

         TIM_Cmd(TIM2, ENABLE);        //开启时钟       


////////////
         while(U3RX==1)TIM2->CNT = 0;          //等第一个下降沿
         while(U3RX==0)TIM2->CNT = 0;          //等第一个下降沿
         while(U3RX==1)TIM2->CNT = 0;          //等第一个下降沿
         for(i=0;i<tmplen;i++){

                 while(U3RX==0);
               
                 ary = TIM2->CNT;
                 
                  while(U3RX==1)TIM2->CNT = 0;
                 }

         //发回数组
                 for(i=0;i<tmplen;i++){
                 printf("%d,",ary);
                 }

//从小到大排序
           n=tmplen;
           for(i=0;i<n-1;i++)
                   {        p=i;
                     for(j=i+1;j<n;j++)
                      if(ary[p]>ary[j])
                       p=j;
                      if(p!=i)
                       {temp=ary[p];ary[p]=ary;ary=temp;}
                   }   

                 for(i=0;i<tmplen;i++){
                 printf("%d,",ary);
                 }
//求最小宽度
           temp=ary[3];sum=0;j=0;
           for(i=0;i<tmplen;i++){
                           if((ary>temp*3/4) && (ary<temp*5/4)) { sum+=ary;j++;}
                                else if(ary>2*temp)break;
                   }
           temp = sum/j;//temp为目标1B
                 printf("your taget is %d,",temp);       
                temp =72000000ul/temp;                                          
                 printf("your taget baud is %d,",temp);       

//把捕获到的波特率给Uart3
    USART_InitStructure.USART_BaudRate = temp;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    USART_Init(USART3, &USART_InitStructure);
   
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
    USART_Cmd(USART3, ENABLE);

}


(原文件名:未命名.JPG)



大家用的时候把printf删掉就好

一周热门 更多>