1.1 波特率結構框圖
1.2 波特率寄存器示意圖
1.3 波特率計算公式示意圖
兩圖看出,串口波特率寄存器是一個32位,只用低16位,低16位又划分,低4位用來裝小數,其他用來裝整數。
波特率計算公式:Tx/Rx 波特率 = fCK/(8*(2- OVER8 )* USARTDIV)
USARTDIV = fCK/8*(2- OVER8 )/TxRx 波特率
Tx/Rx 波特率已知值 //就是我們我們平常說設置的115200Hz.
fCK是已知值 //串口時鍾84MHz
OVER8通過CR1寄存器設置
USARTDIV的值是寫入到BRR寄存器,需要計算的值。
如下列:
void Usart1_Init(u32 baudRate)//假設baudRate=115200Hz { float USARTDIV; u16 Mantissa; /****設置波特率***/ //USARTDIV = fCK/8*(2- OVER8 )/TxRx 波特率 //USARTDIV= Mantissa+(Fraction/8*(2-OVER8 )) USARTDIV = (float)84000000/8/baudRate;//設OVER8 =1;fck=84000000Hz Mantissa = (int)USARTDIV;//取整數部分 Fraction = (u8)((USARTDIV-Mantissa)*16);//把小數部分整成16位整數 USART1->BRR = Mantissa<<4 | Fraction; }