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

posted @   Gustavo_G  阅读(1517)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 5. Nginx 负载均衡配置案例(附有详细截图说明++)
点击右上角即可分享
微信分享提示