本文分別通過操作寄存器和調(diào)用庫函數(shù)的方式,對比測試STM32讀寫IO時間。
硬件環(huán)境
主控芯片:STM32F103ZET6
外部晶振:8MHZ
系統(tǒng)主頻:72MHZ
1.操作寄存器的方式讀取IO
軟件在線調(diào)試界面
示波器輸出波形
分析:在while(1)中循環(huán)翻轉(zhuǎn)PA3輸出電平。
通過在線調(diào)試的方式,可以看出1條C語句:GPIOA -> BSRR = 1<<3;//PA3輸出高電平
對應(yīng)3條匯編指令:MOVS r0,#0x08 ;把立即數(shù)0x08傳送給寄存器r0
LDRr1,[PC,#8] ;從地址(PC+8)處讀取一個字到寄存器r1
STRr0,[r1,#0x00] ;把r0中的低字節(jié)存儲到地址(r1+0)處
由于Cortex-M3的大部分匯編指令均為單周期指令,理論上PA3輸出高電平為3個時鐘周期,
即3*(1/72)us = 42ns,經(jīng)示波器實測輸出高電平時間約為:42ns左右。
注意:示波器實測輸出低電平時間明顯比輸出高電平時間長,原因每一次循環(huán)結(jié)束,都要進(jìn)行新一次while循環(huán)判斷,即while(1)判斷也要浪費時間的,差不多8個指令周期左右。
2.調(diào)用庫函數(shù)的方式讀取IO
軟件在線調(diào)試界面
示波器輸出波形
分析:在while(1)中循環(huán)翻轉(zhuǎn)PA3輸出電平。
通過在線調(diào)試的方式,可以看出1條C語句:GPIO_SetBits(GPIOA , GPIO_Pin_3);//PA3 = 1
對應(yīng)的匯編指令為:MOVSr1,#0x08
LDRr0,[pc,#12]
BL.WGPIO_SetBits(0x080002FE)
其中第3條匯編指令為跳轉(zhuǎn)指令,即跳轉(zhuǎn)到函數(shù)GPIO_SetBits()的地址處繼續(xù)執(zhí)行。
執(zhí)行GPIO_SetBits(GPIOA , GPIO_Pin_3);//PA3 = 1所用的時間通過示波器可以測出來。
從示波器輸出波形來看,波形周期為708ns,減去while(1)循環(huán)跳轉(zhuǎn)指令110ns,則通過調(diào)用庫函數(shù)輸出高低電平用時約為300ns,為21個時鐘周期,比直接操作寄存器多用時約260ns。
3.STM32中斷時間測試
使能滴答定時器Systick,配置每1us產(chǎn)生一次中斷,中斷服務(wù)函數(shù)為空,測試從產(chǎn)生中斷、保護(hù)現(xiàn)場、進(jìn)入中斷服務(wù)函數(shù)、到恢復(fù)現(xiàn)場所用時間。
軟件在線調(diào)試界面
示波器輸出波形
由示波器輸出波形可以計算出保存現(xiàn)場、進(jìn)入中斷服務(wù)函數(shù)、恢復(fù)現(xiàn)場的時間為(475-195)約280ns,約為20個時鐘周期。配置滴答定時器不同中斷周期,經(jīng)實測最小周期為1us時,即計數(shù)72個,能夠正常進(jìn)入中斷,程序正常。若定時周期小于1us,則定時時間不準(zhǔn)確,定時周期接近于1us,原因分析為定時時間太短,內(nèi)核來不及響應(yīng)中斷。