zoukankan      html  css  js  c++  java
  • UART串口波特率自适应

    所需:串口rx引脚先初始化为浮空输入,检测输入数据高低电平变化,然后临时占用一个定时器,通过定时器检测时间变化来计算波特率。

    以下为代码以及方法思路:

     

    u32 USART1_Baud(void)
    {
      u16 t1=0,t2,t=0; // 定时器寄存器为16位
      u32 b1,b2;
      u32 i;

      GPIO_Init(GPIOA, 10, GPIO_IN_FLOAT); // GPIOA.10浮空输入
      TIM_Open(Tim3); // 开TIM3的时钟
      TIM_Enable(TIM3); // 开启TIM3
      b1 = GPIO_Pin_Get(GPIOA,10); // 读GPIOA.10的电平
      for(i=0;i<32;) // 连续检测GPIO.10引脚32次电平变化
       {
        b2 = GPIO_Pin_Get(GPIOA,10); // 读GPIOA.10的新值
        if(b2 != b1) // 如果有电平变化
          {
            t2 = TIM3->COUNT; // 读定时器中的值
            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++; // 电平变化数+1
          }
       }
      TIM_Close(Tim3); // 关闭TIM3的时钟
      return ((u32)t*403/400);
      // 修正波特率值(加上电平变化的斜率,大概为0.75%,经验值)
    }

     以上代码转载自:https://blog.csdn.net/linlingpeng_/article/details/8944993

  • 相关阅读:
    遇到项目上面有叉,但是找不到错误的原因
    遇到build的问题
    遇到scan configurtation CDT builder等的错误
    遇到attemp to invoke virtual method
    遇到looper之类关于消息循环的
    Linux与Windows信息交互快捷方法
    并行查询
    PostgreSQL 事务管理的MVCC
    Linux安装memcached
    Linux 安装 Redis
  • 原文地址:https://www.cnblogs.com/Gustavo-G/p/14011040.html
Copyright © 2011-2022 走看看