加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

GPIO翻轉(zhuǎn)速度到底可以有多快?

01/03 11:10
138
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

最近一個工程師問我MCU的最高翻轉(zhuǎn)速度能夠到多少?這個話題我多年前就聽過,不過一直沒有實際去測試過,這次正好借此問題實際測試了一番,發(fā)現(xiàn)里面還藏了不少的知識。

本次測試選取了目前市面上性價比極高的3款32位ARM Cortex-M0/M0+內(nèi)核MCU,分別是靈動微MM32G0001、普冉PY32F002B、芯源CW32L010,價格都在5毛錢以內(nèi)!

首先測試的是靈動微的MM32G0001 MCU,該MCU基于ARM Cortex-M0內(nèi)核,最高工作頻率可達 48MHz。系統(tǒng)架構(gòu)圖如下:

可以看到GPIO模塊位于AHB 總線上,AHB總線的最高速率為48Mhz。GPIO翻轉(zhuǎn)就是高低電平變換,執(zhí)行一條電平控制的STR匯編指令是2個指令周期,所以理論上該MCU GPIO最大的翻轉(zhuǎn)速率是48Mhz/(2+2)=12Mhz。下面我們來看看實測情況,

測試代碼基于靈動微官網(wǎng)提供的:LibSamples_MM32G0001_V0.10.2SamplesLibSamplesGPIOGPIO_LED_Toggle例程。

該示例時鐘配置的就是48Mhz。我們進行以下幾個實驗:

實驗1:原始代碼做如下修改,注釋掉不相關(guān)代碼,while(1)里只保留一個GPIO翻轉(zhuǎn)函數(shù)。

測試結(jié)果只有289Khz。

實驗2:把優(yōu)化等級從0開到最高:

測試結(jié)果是333Khz。

以上2個實驗測出來的速率遠低于理論值,主要是和函數(shù)調(diào)用有關(guān)系,占用了很多額外的時間。

實驗3:這次直接改為操作寄存器的方式實現(xiàn),為保證測試一致性,優(yōu)化等級還是調(diào)整回0。

測出來的結(jié)果是4Mhz,速率明顯提升。

可是為什么低電平時間要比高電平時間多了那么多呢。經(jīng)過分析可知是while(1)循環(huán)占用了額外的時間。

實驗4:在實驗3的基礎(chǔ)上改進一下,while(1)多增加幾條重復(fù)的語句。

測試翻轉(zhuǎn)期間的速率為12Mhz,這樣就達到了理論上的最大速率。

第二個測試的是普冉的PY32F002B MCU,該MCU基于ARM Cortex-M0+內(nèi)核,最高主頻24MHz。系統(tǒng)架構(gòu)圖如下:

可以看到這個MCU的GPIO是直接掛到內(nèi)核上,它具備單周期快速翻轉(zhuǎn)的能力。單周期GPIO是ARM Cortex-M0+內(nèi)核所特有支持的一個功能,M0內(nèi)核MCU沒有此功能。所以該款MCU GPIO翻轉(zhuǎn)最大速率理論值為:24Mhz/(1+1)=12Mhz。下面我們來看下實際測試結(jié)果。

PY32F002B_Firmware_V1.1.0ProjectsPY32F002B-STKExample_LLGPIOGPIO_FastIO直接提供了測試例程,什么都不用改,下載進去就可以測試,

可以看到IO翻轉(zhuǎn)速率確實達到了12Mhz。

C:Userswangwx1Desktop普冉12Mhz.jpg

雖然PY32F002B最高主頻相比MM32G0001只有其一半,但是因為其直接掛在內(nèi)核上,具備單周期翻轉(zhuǎn)能力,所以兩者的最高IO翻轉(zhuǎn)速率都是12Mhz。

最后再來看芯源的CW32L010 MCU,這顆MCU也是Cortex-M0+內(nèi)核,但是其GPIO并沒有像PY32F002B直接掛在內(nèi)核上,而是掛在AHB總線上。該MCU最高主頻也是48Mhz。

有了上述測試基礎(chǔ),你是不是能夠猜到該MCU的最大翻轉(zhuǎn)速率了,你可能會認為和靈動微G0001一樣也是12Mhz。事實果真如此嗎?

我們基于CW32L010_StandardPeripheralLib_V1.0.2ExamplesGPIOgpio_blink做了簡單修改,該例子默認跑的是4Mhz主頻,將其修改為48Mhz

實際測試結(jié)果只有8Mhz,這是什么原因呢?我們可以看到低電平時間是2個指令周期,但是高電平時間卻是4個指令周期。

這是因為Flash讀等待所導(dǎo)致的,當主頻大于24Mhz之后,需要插入1個等待周期,所以無法保證每個翻轉(zhuǎn)都能達到2個指令周期。

我們可以再做一個測試,將其主頻降低為24Mhz,可以看到此時GPIO翻轉(zhuǎn)速率可以達到6Mhz,這是因為沒有flash讀等待周期了。

最后再做一個測試,把上述翻轉(zhuǎn)GPIO的代碼做一點修改,上述用了BSRR、BRR寄存器來實現(xiàn)置位和清零,如果使用ODR寄存器會有什么效果呢?

可以看到,翻轉(zhuǎn)速率直接只有4Mhz。

通過匯編代碼可以看到,多了一條MOVS指令,該指令需要1個指令周期,所有最高翻轉(zhuǎn)速率為24Mhz/(3+3)=4Mhz

除了置位/清零寄存器、輸出數(shù)據(jù)寄存器實現(xiàn)GPIO翻轉(zhuǎn)外,有的MCU還有翻轉(zhuǎn)寄存器,比如CW32L010有,MM32G0001和PY32F002B沒有,直接用這一個寄存器就可以實現(xiàn)IO翻轉(zhuǎn),實測這個效果和BSRR/BRR一樣。

由此可見,影響MCU GPIO翻轉(zhuǎn)速度的因素有很多,包括系統(tǒng)主頻、是否支持單周期翻轉(zhuǎn)、Flash讀等待、翻轉(zhuǎn)語句寫法、編譯器優(yōu)化等級等多個因素。

最后再留一個問題供大家思考,為什么芯源CW32L010和靈動微MM32G0001同樣都是跑48Mhz最高主頻,芯源CW32L010無法達到理論值12Mhz但是靈動微MM32G0001卻可以達到呢?歡迎評論區(qū)留言。

關(guān)注我們,掃碼加入嵌入式交流群:

 

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

TopSemic,讓芯片使用更簡單。 專注分享:嵌入式,單片機,STM32,ARM,RTOS,Linux, 軟硬件,半導(dǎo)體,電子技術(shù)等相關(guān)內(nèi)容。