簡介:
單片機(jī)IO口控制速度是指,在程序中對單片機(jī)的某個IO口操作,IO口需要多少時間才能真正的執(zhí)行,這個數(shù)值很重要,因為在某些場合,比如刷屏,如果IO口速度夠高,就能提高屏幕的刷新速度。有些場合,比如STC89C52單片機(jī)能不能驅(qū)動WS2812,這個也是要看WS2812的IO口操作速度的。下圖為被測雙方的合影留念。兩個PCB,一個是2022年10月的作品,一個是2020年4月的作品。
1,測試對象
本文使用51單片機(jī)和32單片機(jī)進(jìn)行比較。
51單片機(jī)選擇STC8H8K64U-LQFP48,使用內(nèi)部IRC時鐘,主頻設(shè)定為45MHz。
32單片機(jī)選擇STM32F103VET6-LQFP100,使用外部8MHz時鐘,內(nèi)部倍頻后主頻為72MHz。
2,測試方法
使用KEIL編寫代碼,程序主循環(huán)while(1)內(nèi),寫IO=1,IO=0;的翻轉(zhuǎn)程序,連續(xù)寫多個,降低while(1)執(zhí)行對程序的干擾。使用示波器測量IO口的波形,測得結(jié)果后分析代碼的匯編部分,,和測得結(jié)果對比分析,得出結(jié)論。
3,51單片機(jī)測試
使用STC8H8K64U單片機(jī),單片機(jī)初始化階段設(shè)置IO口為準(zhǔn)雙向,進(jìn)行一些必要的初始化后,單片機(jī)一直執(zhí)行while1的內(nèi)容,代碼如下。
測試引腳為P07引腳,代碼中連續(xù)寫了多個IO口翻轉(zhuǎn)賦值指令。大概20條指令,能讓IO口翻轉(zhuǎn)20次,周期計數(shù)為10。因為主循環(huán)是一直執(zhí)行的,所以一秒內(nèi)可以執(zhí)行很多次。
使用STC-ISP軟件,設(shè)定本次下載需要修改硬件選項,調(diào)整IRC頻率,手動輸入數(shù)字45即可,將代碼下載進(jìn)單片機(jī)。
代碼下載進(jìn)單片機(jī)后,使用示波器連接單片機(jī)P07口,讀取示波器的數(shù)據(jù)。測試結(jié)果如下圖,頻率22.5MHz(頻率一直變化,選取最大值),我們看到此時的波形,不是方波,也不是正弦,接近正弦,此時應(yīng)該是頻率太高導(dǎo)致的。不過信號頻率還是達(dá)到了主頻,也就是45M的一半。因為頻率計算,是高電平加低電平一起的倒數(shù),所以就是主頻的一半了。
當(dāng)前測試說明STC8H單片機(jī)的IO口操作速度是主頻。
4,51單片機(jī)測試分析
上述測試說明STC8單片機(jī)操作IO口的指令為但時鐘周期操作,這個也是可以通過KEIL調(diào)試驗證的,KEIL設(shè)置debug使用simulator,然后進(jìn)入debug模式,就能看到匯編代碼了。
因為單片機(jī)實際執(zhí)行的內(nèi)容就是機(jī)器語言,基本等于匯編,我們通過觀察匯編,就能知道單片機(jī)執(zhí)行了多少條指令,這個觀察C語言是看不出來的。
上圖截取的就是主循環(huán)的C代碼和匯編的混合顯示,C語言為我們實際編輯界面的內(nèi)容,匯編代碼則是編譯器將C語言編譯生成的。
While1的下面是沒有匯編代碼的,while1對應(yīng)的代碼是在最后一行,SJMP C:165B,這個匯編代碼就是讓CPU跳轉(zhuǎn)到0X165B的地址執(zhí)行程序,也就是循環(huán)的開始位置。
然后我們看到P07=0;P07=1;的C語言代碼,對應(yīng)的匯編代碼則是CLR P07,SETB,P07,這兩條執(zhí)行,都是單時鐘周期的指令。所以STC8H單片機(jī)IO口的操作速度和實際最高輸出速度可以達(dá)到主頻的速度。
5,32單片機(jī)測試
使用STM32F103VET6單片機(jī)進(jìn)行測試,因為32單片機(jī)我使用的不多,所以測試起來比51單片機(jī)內(nèi)容多不少,如果下文內(nèi)容有誤,感謝指出。
32單片機(jī)有庫函數(shù),寄存器開發(fā),我選的一個寄存器開發(fā)的閃爍LED程序進(jìn)行測試。首先就是IO口的初始化,我這里使用的PA0口進(jìn)行測試,設(shè)置PA0口推挽輸出,同時為高電平
然后是主函數(shù)部分,主循環(huán)部分,我測試了3種不同的賦值方式,
第一種是PAout(0)=0;PAout(0)=1;示波器測得頻率為6M,那說明32單片機(jī)使用此種方式操作IO口的速度是12M,也就是6個時鐘周期(72M/12M)
然后我又使用了初始化那里的賦值操作,GPIOA->ODR=1;GPIOA->ODR=0;這里應(yīng)該是對整個P口賦值,這個具體我沒有研究過,反正是PA0口肯定實現(xiàn)了0,1變換。此時示波器測得頻率18Mhz,此時的波形和方波比較,失真了不少,快變成正弦波了。那么操作IO口的速度則是36Mhz,也就是2個時鐘周期
第三種操作方法:GPIOA->BSRR=1;GPIOA->BRR=1;這個操作方法我不熟悉,示波器測試了一下速度,12M,那么操作IO口的速度是24M,也就是3個時鐘周期。
6,32單片機(jī)測試分析
32單片機(jī)比51單片機(jī)復(fù)雜不少,操作方式也很多,上邊測試,使用了3種代碼,速度都不一樣,那這里只分析速度最快的那個,也就是2個時鐘就能操作IO口的代碼。
首先看一下while1,這個while1有兩個,一個是C語言代碼中的位置,有兩條指令。
一個是B 0x080005A0,這個地址是循環(huán)結(jié)束位置的地址,
另一個是B 0x08000526,這個地址是循環(huán)開始的地址,這兩個應(yīng)該是成對出現(xiàn)的。
我們看一下IO口賦值部分,前6次賦值,對應(yīng)的是13條匯編指令,后邊的6次賦值,都是12條指令,多了一個LDR r1,[PC,#120];@0x080005A4,這條指令應(yīng)該是定位PA口的,之后對PA口操作,不需要再定位。這條指令執(zhí)行需要多少時鐘周期暫不清楚
每次IO口賦值,通用的兩個指令是
0x0800059C 2000MOVS r0,#0x00
0x0800059E 6008STR r0,[r1,#0x00]
第一個指令是給寄存器r0賦值,第二個指令應(yīng)該是把r0寄存器的內(nèi)容傳給r1對應(yīng)的位置,去實現(xiàn)IO口操作。這里暫時就這么理解了,暫時不想去研究STM32的內(nèi)容。
這兩個指令,應(yīng)該都是單時鐘周期指令(由實驗結(jié)果得出)。
所以STM32單片機(jī)操作的IO口速度能達(dá)到主頻速度的一半,但是又達(dá)不到,因為每次給IO口寫數(shù)據(jù),還需要先定位到IO口,(這個我不清楚是否可以直接操作IO口,像51單片機(jī)那樣)這個定位,也是需要時間的,一把情況下,我們可能會來回操作幾個IO口,不知道編譯器能否在操作其他IO口是,還保留r1,申請新的寄存器。因為不少程序,比如模擬SPI,是需要操作好幾個IO口的,時鐘引腳和數(shù)據(jù)引腳使用和切換的很頻繁。
目前暫定STM32單片機(jī)操作IO口速度最高為2個時鐘周期。
7,測試總結(jié)
STC8H8K64U單片機(jī),45M主頻,IO口翻轉(zhuǎn)速度可達(dá)22.5MHz,單片機(jī)操作IO口速度為45MHz。
STM32F103VET6單片機(jī),72M主頻,IO口翻轉(zhuǎn)速度可達(dá)18MHz,單片機(jī)操作IO口速度為36MHz。
這個頻率已經(jīng)很高了,目前輸出的波形已經(jīng)失真了。所以得出的結(jié)論是51操作IO口速度是和STM32相當(dāng)?shù)模ㄔ诒緶y試條件的情況下)
本測試條件是指:STC8H8K單片機(jī)45M頻率(基本是最高頻率),STM32F103,72M頻率,這個應(yīng)該是常用的頻率。
STC的51單片機(jī)呢,除了古老的STC89/STC90系列,基本都是單時鐘周期操作。(STC32G也是單時鐘周期)
STC89/90系列,在使用12M外置晶振的情況下,下載的時候設(shè)置雙倍速,操作IO口的速度為2M,使用更高頻率的外置晶振可以達(dá)到更高的IO口操作速度。
當(dāng)然了,51單片機(jī)也有主頻上百M的(某些廠家的某些型號),32單片機(jī)主頻上百M的更多。當(dāng)單片機(jī)主頻足夠高的時候,他們往往是為了提高運算速度,而非IO口的操作速度。當(dāng)然IO口的操作速度也會提升。
8,結(jié)語
本文好像寫了什么,又好像啥也沒寫,操作IO口最為一個基礎(chǔ)的指令,難道不就是一個時鐘就能完成嗎?我也是這么覺得的。但是實際測試結(jié)果,51單片機(jī)可以,32單片機(jī)不行。但是32單片機(jī)運行的頻率夠高,所以最終的速度相當(dāng)。
那么就有下一個問題了,既然速度相當(dāng),為啥不少人覺得51單片機(jī)太菜呢,這里的太菜應(yīng)該是指STC89C52,我也覺得他很菜,所以我也很少去用?,F(xiàn)在的51基本都可以單時鐘周期了,不少指令的執(zhí)行速度大大提升,性能比古老的51提高很多了。這也就是不少人還能接受和使用51單片機(jī)的一個原因。
那既然51單片機(jī)速度可以這么快了,那為啥還比不上32單片機(jī)呢?
51單片機(jī)的速度提升呢,他是在8位數(shù)據(jù)的范圍內(nèi),但實際情況,我們要操作16位數(shù)據(jù),32位數(shù)據(jù),去運算,這一點51單片機(jī)是不能直接運算的,是通過將這些運算轉(zhuǎn)換為8位的運算去計算的,這樣一個計算,就需要好多條指令才能完成。
如果你需要大量的計算,建議選位數(shù)多的32位單片機(jī)。
如果你就是操作IO口完成一些內(nèi)容,不需要大量的計算,51單片機(jī)可以完成。當(dāng)然了,基于慣性原因,使用32單片機(jī)的可能還是選擇32單片機(jī)(選擇一些低價,高性價比的)
-
單片機(jī)
+關(guān)注
關(guān)注
6040文章
44592瀏覽量
636812 -
示波器
+關(guān)注
關(guān)注
113文章
6269瀏覽量
185489 -
51單片機(jī)
+關(guān)注
關(guān)注
274文章
5705瀏覽量
123900 -
時鐘
+關(guān)注
關(guān)注
11文章
1739瀏覽量
131624 -
IO口
+關(guān)注
關(guān)注
3文章
170瀏覽量
24113
發(fā)布評論請先 登錄
相關(guān)推薦
評論