串口速率,我拿什么識別你?
芯片自識別法
本文引用地址:http://butianyuan.cn/article/234415.htmUART串口常常用來做為固件升級使用的接口,因此,其波特率要根據(jù)上位機(jī)的實際情況而定。如果環(huán)境較差時,就需要使用低波特率的通訊。這時,自動波特率識別的方法就誕生了。下面我們以TI Stellaris里bootloader里的串口波特率自動識別源程序為例進(jìn)行分析:
int UARTAutoBaud(unsigned long *pulRatio){
long lPulse, lValidPulses, lTemp, lTotal;
volatile long lDelay;
// 配置systick,將其值設(shè)定為最大值;
HWREG(NVIC_ST_RELOAD) = 0xffffffff;
HWREG(NVIC_ST_CTRL) = NVIC_ST_CTRL_CLK_SRC | NVIC_ST_CTRL_ENABLE;
// 打開引腳的邊沿觸發(fā)中斷
HWREG(GPIO_PORTA_BASE + GPIO_O_IBE) = UART_RX;
// 使能UART RXD引腳邊沿觸發(fā)中斷
HWREG(NVIC_EN0) = 1;
// 采集引腳邊沿中斷,兩個字節(jié)的邊沿
while(g_ulTickIndex < MIN_EDGE_COUNT)
{
}
// 計算systick采樣下來的值,對溢出進(jìn)行處理
for(lPulse = 0; lPulse < (MIN_EDGE_COUNT - 1); lPulse++){
lTemp = (((long)g_pulDataBuffer[lPulse] -
(long)g_pulDataBuffer[lPulse + 1]) & 0x00ffffff);
g_pulDataBuffer[lPulse] = lTemp;
}
// 此循環(huán)計算兩個連續(xù)脈沖之間的寬度
for(lPulse = 0; lPulse < (MIN_EDGE_COUNT - 1); lPulse++){
// 精確計算兩個連續(xù)脈沖之間的寬度
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) {
// 將最后一個脈沖加入計數(shù)器,并計算波特率
lTotal += (long)g_pulDataBuffer[lPulse];
*pulRatio = lTotal >> 1;
// 返回成功標(biāo)識
return(0);
}
}
// 檢測失敗
return(-1);
}
UART串口有著這樣或者那樣的優(yōu)點(diǎn),但新興的USB接口的USB DFU功能可以更加有效替代串口來完成固件升級;性能優(yōu)越的CAN總線,其硬件價格不斷下降,而且CAN總線的MAC接口更多集成在最新MCU芯片上;CAN2.0B接口正在擠壓著UART接口器件的市場;對于我們普通民眾,現(xiàn)在新型號電腦已經(jīng)沒有DB9串口座。在殘酷的現(xiàn)實下,多年后也許只有我們電子工程師才會記得曾經(jīng)的簡單、實用的UART串口。
評論