新闻中心

EEPW首页 > 嵌入式系统 > 牛人业话 > 串口速率,我拿什么识别你?

串口速率,我拿什么识别你?

作者:jobs时间:2014-03-10来源:电子产品世界收藏

  芯片自

本文引用地址:http://www.eepw.com.cn/article/234415.htm

  常常用来做为固件升级使用的接口,因此,其波特率要根据上位机的实际情况而定。如果环境较差时,就需要使用低波特率的通讯。这时,自动波特率的方法就诞生了。下面我们以TI Stellaris里bootloader里的波特率自动源程序为例进行分析:

  int AutoBaud(unsigned long *pulRatio){

  long lPulse, lValidPulses, lTemp, lTotal;

  volatile long lDelay;

  // 配置systick,将其值设定为最大值;

  HWREG(NVIC_ST_RELOAD) = 0xffffffff;

  HWREG(NVIC_ST_CTRL) = NVIC_ST_CTRL_CLK_SRC | NVIC_ST_CTRL_ENABLE;

  // 打开引脚的边沿触发中断

  HWREG(GPIO_PORTA_BASE + GPIO_O_IBE) = _RX;

  // 使能UART RXD引脚边沿触发中断

  HWREG(NVIC_EN0) = 1;

  // 采集引脚边沿中断,两个字节的边沿

  while(g_ulTickIndex < MIN_EDGE_COUNT)

  {

  }

  // 计算systick采样下来的值,对溢出进行处理

  for(lPulse = 0; lPulse < (MIN_EDGE_COUNT - 1); lPulse++){

  lTemp = (((long)g_pulDataBuffer[lPulse] -

  (long)g_pulDataBuffer[lPulse + 1]) & 0x00ffffff);

  g_pulDataBuffer[lPulse] = lTemp;

  }

  // 此循环计算两个连续脉冲之间的宽度

  for(lPulse = 0; lPulse < (MIN_EDGE_COUNT - 1); lPulse++){

  // 精确计算两个连续脉冲之间的宽度

  lTemp = (long)g_pulDataBuffer[lPulse];

  lTemp -= (long)g_pulDataBuffer[lPulse + 1];

  if(lTemp < 0) {

  lTemp *= -1;

  }

  // 验证两个边沿的脉宽是否正确,其算法如下:

  // abs(Pulse[n] - Pulse[n + 1]) < Pulse[n + 1] / PULSE_DETECTION_MULT

  // 或者

  // PULSE_DETECTION_MULT * abs(Pulse[n] - Pulse[n + 1]) < Pulse[n + 1]

  if((lTemp * PULSE_DETECTION_MULT) < (long)g_pulDataBuffer[lPulse + 1]) {

  lTotal += (long)g_pulDataBuffer[lPulse];

  lValidPulses++;

  }

  else{

  lValidPulses = 0;

  lTotal = 0;

  }

  // 7个有效脉冲,就可以计算UART速率

  if(lValidPulses == 7) {

  // 将最后一个脉冲加入计数器,并计算波特率

  lTotal += (long)g_pulDataBuffer[lPulse];

  *pulRatio = lTotal >> 1;

  // 返回成功标识

  return(0);

  }

  }

  // 检测失败

  return(-1);

  }

  UART串口有着这样或者那样的优点,但新兴的USB接口的USB DFU功能可以更加有效替代串口来完成固件升级;性能优越的CAN总线,其硬件价格不断下降,而且CAN总线的MAC接口更多集成在最新MCU芯片上;CAN2.0B接口正在挤压着UART接口器件的市场;对于我们普通民众,现在新型号电脑已经没有DB9串口座。在残酷的现实下,多年后也许只有我们电子工程师才会记得曾经的简单、实用的UART串口。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭