2019-06-05
為什么寄存器版本中,串口初始化函數(shù)有兩個(gè)參數(shù),pclk2和bound,
而庫函數(shù)版中,只有bound一個(gè)參數(shù):
以下內(nèi)容整理自寄存器版的開發(fā)指南:
波特率計(jì)算公式
當(dāng)OVER8 = 0 時(shí)

- Tx / Rx 就是波特率?
- fPCLKx是串口時(shí)鐘
- PCLK1 用于 USART2~5
- PCLK2 用于 USART1 和USART6
- USARTDIV 是一個(gè)無符號定點(diǎn)數(shù)
波特率寄存器 USART_BRR
STM32F4 的每個(gè)串口都有波特率寄存器 USART_BRR,
32位,其中高16位保留

- mantissa是整數(shù)部分
- fraction是小數(shù)部分 * 16 (OVER8 = 0時(shí)乘16,OVER8 = 1 時(shí)乘不知道多少)
波特率計(jì)算舉例
假設(shè)串口 1 要設(shè)置為 115200 的波特率,而 PCLK2 的時(shí)鐘(即 APB2 總線時(shí)鐘頻率) 為 84M
求USARTDIV
USARTDIV
= fpCLK2 / 16 / 波特率
= 84000000/16/115200
= 45.572
故
整數(shù)部分為45,DIV_Mantissa = 45 = 0x2D
小數(shù)部分為0.572,DIV_Fraction = 0.572 * 16 =9.152 = 0x09
OVER8 位
接收器過采樣設(shè)置位: OVER8 位,
該位在USART_CR1 寄存器里面設(shè)置,
當(dāng) OVER8=0 的時(shí)候,采用 16 倍過采樣,可以增加接收器對時(shí)鐘的容差,精度高,容錯(cuò)性好。
當(dāng) OVER8=1 的時(shí)候,可以獲得更高的速度。
我們一般設(shè)置 OVER8=0,以得到更好的容錯(cuò)性,以下皆以 OVER8=0 進(jìn)行介紹。
關(guān)于 OVER8 的詳細(xì)介紹,請看《STM32F4xx 中文參考手冊》第 26.3.3 節(jié)。
結(jié)論
波特率是由plk和其他一些寄存器的值共同決定的
確切的說,波特率由USART_CR1 寄存器里的OVER8位,波特率寄存器 USART_BRR的值,和對應(yīng)的時(shí)鐘pclk頻率共同決定,公式在上方。
寄存器版中,將pclk的值作為參數(shù),傳進(jìn)來參與計(jì)算
而庫函數(shù)版中,可能是通過其他方式獲得了時(shí)鐘頻率,因此可以直接設(shè)置波特率
即
void uart_init(u32 bound) //庫函數(shù)版
void uart_init(u32 pclk2,u32 bound) //寄存器版
這兩個(gè)函數(shù)中,bound參數(shù)一樣時(shí),可以認(rèn)為效果是等價(jià)的