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

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

  芯片自识别法

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

  int UARTAutoBaud(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) = UART_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

关键词: UART 串口 通信协议 调度 识别

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版