本文主要結(jié)合STM32,講述UART和SPI有關(guān)速率相關(guān)的知識。
1.串口和SPI內(nèi)部時(shí)鐘 在回答上面問題之前,需要先了解STM32內(nèi)部時(shí)鐘的概念,尤其是串口和SPI的內(nèi)部時(shí)鐘。
STM32里包含有系統(tǒng)時(shí)鐘、AHB時(shí)鐘和APB時(shí)鐘。APB時(shí)鐘來源于AHB,AHB時(shí)鐘來源于系統(tǒng)時(shí)鐘。

從上圖中可以看出,時(shí)鐘就像流水一樣,從時(shí)鐘源匯聚到系統(tǒng)時(shí)鐘上,再從系統(tǒng)時(shí)鐘繼續(xù)分頻或者說是繼續(xù)分發(fā)到AHB、APB。
通常我們談?wù)摰?a target="_blank">MCU能跑到多少M(fèi)、主頻多少M(fèi),其實(shí)所指的就是系統(tǒng)時(shí)鐘。
這些時(shí)鐘在不同的STM32系列中是不一樣的,我們以STM32F401為例,手冊上說它的APB1的最高時(shí)鐘是42MHz,APB2的最高時(shí)鐘是84MHz,不同的外設(shè)因?yàn)閽煸诓煌目偩€上,所以速度就不太相同了。比如USART1掛在APB2上,所以它的時(shí)鐘最高就是84MHz, USART2是掛在APB1上,它的總線時(shí)鐘最快就是42MHz。當(dāng)我們配置串口的時(shí)候會發(fā)現(xiàn),USART2的baudrate最高是2.625Mbit/s,但是同樣配置的USART1卻可以達(dá)到5.25Mbit/s,這就是因?yàn)樗诘目偩€時(shí)鐘的不同而不同。
那我們怎么知道使用的USART1、USART2到底掛在哪條總線上呢?去從數(shù)據(jù)手冊里尋找,直接在手冊里搜索關(guān)鍵詞APB1或者APB2就可以快速找到列表。 2.串口的過采樣技術(shù)規(guī)范
比如說做數(shù)據(jù)的接收,我們可以看到串口是通過過采樣技術(shù)來實(shí)現(xiàn)對數(shù)據(jù)的接收,因?yàn)樗鼪]有時(shí)鐘線,只能通過高于波特率的16倍或者8倍對總線上的數(shù)據(jù)一個(gè)一個(gè)地進(jìn)行采集,根據(jù)最后采集到的情況來判斷信號的狀態(tài)。

舉個(gè)例子,當(dāng)我們采集START信號的時(shí)候,實(shí)際上它要求采集到1110 x0x0x0 000這樣固定的序列的時(shí)候才認(rèn)為是一個(gè)起始信號。START信號在串口里是一個(gè)bit的低電平信號,我們用16倍的速率進(jìn)行采樣,首先它在前面會做一個(gè)下降沿檢測,這個(gè)檢測是要在前面的4個(gè)bit能檢測到1110,硬件會對總線上的數(shù)據(jù)根據(jù)采樣點(diǎn)一直進(jìn)行檢測,這里的采樣點(diǎn)就是APB的時(shí)鐘,串口掛在不同的APB上用的時(shí)鐘不一樣。采樣的時(shí)候采集到1110就知道是一個(gè)下降沿,后面的x意思是任意的,后面的幾個(gè)位中至少需要檢測到三個(gè)0,而最后邊的三個(gè)位需要是連續(xù)的三個(gè)0,這樣才能被判定是一個(gè)起始位。其實(shí)只是判斷了3、5、7、8、9、10這六個(gè)點(diǎn),只要是0,就可以確認(rèn)了。這里我們是以START信號為例,其他信號也是這樣的。
可能有人會有疑問,x是任意的,不去檢測,如果0不滿足要求應(yīng)該怎么辦呢?
如果3、5、7、8、9、10這六個(gè)點(diǎn)都是0,那就可以認(rèn)為這是一個(gè)起始信號;如果在3、5、7和8、9、10這兩個(gè)階段都滿足至少有兩個(gè)bit是0的話,那就可以確認(rèn)它是起始信號,確認(rèn)的意思是說它里面的接收緩沖區(qū)非空,標(biāo)志位就已經(jīng)置上了,承認(rèn)這個(gè)信號,但是還要給一個(gè)NE的標(biāo)志位,因?yàn)殡m然承認(rèn)了這個(gè)信號,但里面是存在噪聲的。我們看串口的中斷標(biāo)志位的時(shí)候就可以看到,在它的錯(cuò)誤事件里就有一個(gè)NOISE FLAG,這個(gè)位就表示當(dāng)串口在接收的時(shí)候,在總線上檢測到的電平并不是一個(gè)標(biāo)準(zhǔn)的、完整的高電平或者低電平,會有錯(cuò)誤但不影響整個(gè)數(shù)據(jù)的接收,如果在接收的時(shí)候開啟了EIE位,錯(cuò)誤可以產(chǎn)生一個(gè)中斷,讓MCU對總線上的情況有一個(gè)了解。

如果前三個(gè)bit滿足條件,而后三個(gè)bit沒有滿足的話,那就說明這個(gè)數(shù)據(jù)是錯(cuò)誤的,就不會置標(biāo)志位了,只要在3、5、7和8、9、10這兩個(gè)階段中有一個(gè)階段不滿足條件,就不會置位,并且還會有噪聲的說明。
當(dāng)然了,這些都是在檢測下降沿沒有問題的情況下來說的,如果說在檢測下降沿1110都不完整或者是錯(cuò)誤的,直接就會回到ideal狀態(tài),重新等待下一個(gè)數(shù)據(jù)發(fā)送過來。
3.SPI的速度為什么這么快?
我們可以看一下SPI的時(shí)序圖,圖中上面兩根線是CLOCK線,它根據(jù)配置的不同而不同,在CPHA=0時(shí),即在第一個(gè)時(shí)鐘沿進(jìn)行采樣,CPOL表示的是時(shí)鐘的默認(rèn)電平是高電平(CPOL=1)還是低電平(CPOL=0),這里看到的每個(gè)時(shí)鐘都可以傳輸一個(gè)bit。

4.SPI速率是不是應(yīng)該和系統(tǒng)時(shí)鐘一樣? 其實(shí)不是,因?yàn)橄到y(tǒng)需要時(shí)間去獲取采集到的數(shù)據(jù),所以SPI的時(shí)鐘分頻系數(shù)最小是二分之一的分頻,那么就是說SPI的速度是系統(tǒng)時(shí)鐘的一半了。
有人覺得同步傳輸明顯優(yōu)于異步傳輸,因?yàn)橛袝r(shí)鐘線,傳輸速率會更高。
但其實(shí)這種說法并不是完全正確的,因?yàn)槊恳环N傳輸方式都有自己的優(yōu)勢。比如串口有自動波特率的功能,就是說在接收的時(shí)候并不知道主機(jī)是按照什么樣的波特率進(jìn)行傳輸?shù)?,那就只能等主機(jī)發(fā)一個(gè)特定字節(jié)的數(shù)據(jù)過來并且檢測數(shù)據(jù)的狀態(tài),然后自己硬件去設(shè)置波特率的寄存器,這樣就可以在下一次傳輸?shù)臅r(shí)候和主機(jī)使用相同的波特率。其次,在不同的溫度范圍內(nèi),內(nèi)部的RC振蕩器是有溫漂的并且很大,最標(biāo)準(zhǔn)的校準(zhǔn)方法是給它一個(gè)時(shí)鐘沿,但是很多時(shí)候并沒有這個(gè)時(shí)鐘沿,那我們就可以用自動波特率。每次通訊的時(shí)候都采用自動波特率,就是每次都先接收,接收之后BRR寄存器里面的值就會隨著溫度的變化發(fā)生改變,MCU就可以根據(jù)BRR的值來調(diào)節(jié)HSITRIM。這個(gè)方法的好處是不需要提供一個(gè)非常標(biāo)準(zhǔn)的時(shí)鐘,通過串口通訊這種異步的方式就可以把時(shí)鐘信息傳給單片機(jī)內(nèi)部。
-
STM32
+關(guān)注
關(guān)注
2310文章
11162瀏覽量
373518 -
波特率
+關(guān)注
關(guān)注
2文章
320瀏覽量
35572 -
spi模式、spi速率
+關(guān)注
關(guān)注
0文章
2瀏覽量
2386
發(fā)布評論請先 登錄
是否可以將 visionfive2 的 uart 配置為 1Mb 波特率?
碩博電子IO模塊修改波特率和節(jié)點(diǎn)ID操作步驟
FDCAN 數(shù)據(jù)段波特率增加后發(fā)送失敗的問題分析
支持小數(shù)波特率的意義是什么
請問支持小數(shù)波特率接收數(shù)據(jù)的意義在哪兒?
UART波特率計(jì)算及UART收發(fā)回顯實(shí)驗(yàn)
串口波特率設(shè)置1200用不了是怎么回事?
115200的波特率,為啥實(shí)際速度只有11KB/s?
波特率是什么
可編程電源的通信波特率應(yīng)如何設(shè)置?
基于瑞薩64位MPU RZ/G2L的uboot串口多波特率支持介紹
第十四章 USART——串口通訊
USART波特率與SPI速率對比
評論