新聞中心

        EEPW首頁 > 嵌入式系統 > 牛人業話 > 串口速率,我拿什么識別你?

        串口速率,我拿什么識別你?

        作者:jobs 時間:2014-03-10 來源:電子產品世界 收藏

          芯片自

        本文引用地址:http://www.104case.com/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 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 灵宝市| 武义县| 哈密市| 寿宁县| 瑞昌市| 金川县| 天祝| 万年县| 盈江县| 武邑县| 丽水市| 平昌县| 滦南县| 武义县| 大田县| 枝江市| 林芝县| 横山县| 太仓市| 大丰市| 安庆市| 土默特右旗| 乐业县| 衡南县| 韶关市| 石城县| 长治县| 鄯善县| 大埔县| 怀来县| 巧家县| 绍兴市| 大理市| 鹿泉市| 荥阳市| 泾阳县| 交城县| 上思县| 三台县| 富川| 开化县|