大家好,我是痞子衡,是正經搞技術的痞子,今天痞子衡給大家介紹的是i.MXRT1010上的普通GPIO與高速GPIO極限翻轉頻率,
上一篇文章 《聊聊i.MXRT1xxx上的普通GPIO與高速GPIO差異及其用法》,痞子衡從原理上介紹了 i.MXRT1xxx 系列里普通 GPIO 和 HSGPIO 差異,今天我們就來實測它們的極限翻轉頻率,看看它們實際表現差別到底有多大,本次選擇的測驗芯片是 i.MXRT1010,這顆芯片從功能上來說是目前 i.MXRT1xxx 系列里的小兄弟,但別小看它,因為是后面推出的型號,恩智浦的設計團隊為它在某些方面做了特殊的性能優化,包括 HSGPIO 性能,話不多說,開測:
一、測驗準備作業
1.1 測驗板卡及測驗點
選定的板卡是恩智浦官方 MIMXRT1010-EVK,板卡上連接 LED 燈的是 GPIO_11,翻看芯片參考手冊,這個 PAD 既可以配到普通 GPIO(GPIO1[11]) 也可以配到 HSGPIO(GPIO2[11]),正是理想的 PAD,我們就選擇這個 PAD 做測驗,此外,最終 I/O 輸出波形形態跟外圍驅動電路也有關聯,所以這里也有必要交待清楚:

1.2 I/O 翻轉測驗代碼
測驗工程我們可以直接在 \SDK_2.11.0_EVK-MIMXRT1010\boards\evkmimxrt1010\driver_examples\gpio\led_output 例程上修改,為了盡力展示 GPIO 極限性能,不受其他瓶頸因素干擾,這里選擇代碼執行性能最高的工程 build(即代碼段在 ITCM 里,資料段在 DTCM 里),
I/O 初始化代碼很簡單,在 《普通GPIO與高速GPIO差異及其用法》 文章里都介紹清楚了,這里僅有一點注意,為了統一最終 I/O 輸出效果,不管是用于普通 GPIO 還是 HSGPIO,我們都直接將測驗 PAD 配置到最快的 200MHz 運行頻率(PAD 支持的 50/100/150/200MHz 運行頻率配置不同有何影響,文章最后會交待):
void io_test_init(bool useNormalGpio)
{
gpio_pin_config_t led_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
CLOCK_EnableClock(kCLOCK_Iomuxc);
IOMUXC_SetPinMux(IOMUXC_GPIO_11_GPIOMUX_IO11, 0U);
// Fast Slew Rate, R0/6, 200MHz
IOMUXC_SetPinConfig(IOMUXC_GPIO_11_GPIOMUX_IO11, 0x70F9U);
if (useNormalGpio)
{
// GPIO1
IOMUXC_GPR->GPR26 &= ~(1u << 11);
GPIO_PinInit(GPIO1, 11, &led_config);
}
else
{
// GPIO2
IOMUXC_GPR->GPR26 |= (1u << 11);
GPIO_PinInit(GPIO2, 11, &led_config);
}
}
在 GPIO 模塊里跟電平輸出控制相關的暫存器有兩個,一個是 DR 暫存器,另一個是 DR_TOGGLE 暫存器,都可用于實作輸出電平翻轉,有如下代碼所示的三種常見電平翻轉方法,在低翻轉頻率情況下,這三種方法是等效的,但是在極限翻轉頻率情況下,這三種方法表現不完全一致,下一節實測結果會告訴你:
void io_test_run(void)
{
io_test_init(false);
while (1)
{
// 電平翻轉方法一:異或位操作
//GPIO2->DR ^= 0x800;
// 電平翻轉方法二:直接切換位
//GPIO2->DR = 0x800;
//GPIO2->DR = 0x000;
// 電平翻轉方法三:利用 TOGGLE 位
GPIO2->DR_TOGGLE = 0x800;
}
}
1.3 芯片系統時鐘配置
《普通GPIO與高速GPIO差異及其用法》 一文里講了,普通 GPIO 時鐘源是 IPG Bus,而 HSGPIO 時鐘源是 AHB Bus,因此測驗工程里 AHB/IPG 時鐘配置會影響最終 I/0 翻轉極限頻率,下圖是 i.MXRT1010 內核結構里的 HSGPIO 通路,它和 i.MXRT1060/1170 內核結構里 HSGPIO 通路其實有點小區別,這也是 i.MXRT1010 上的優化之處,

led_output 例程里的默認系統時鐘配置,AHB/Core 時鐘來自于 PLL6 - 500MHz,AHB_PODF 設 0 (即不分頻),而 IPG Bus 時鐘源固定來自于 AHB/Core,且只能在其基礎上做 1/2/3/4 分頻,我們知道 IPG Bus 最高僅支持 150MHz,因此在這種情況下 IPG_PODF 只能設 3(四分頻),IPG 時鐘實際是 125MHz,顯然 HSGPIO 訪問可以得到最優性能,但普通 GPIO 達不到最優性能,
為了測驗普通 GPIO 的最優性能,我們需要同時再測驗一種新的系統時鐘配置,AHB/Core 時鐘源選用 PLL2_PFD3,將這個源配置為 452.6 MHz,AHB_PODF 依舊設 0,這樣 IPG_PODF 設 2(三分頻)可以得到 150.8MHz 的 IPG 時鐘,這時普通 GPIO 訪問可以得到最優性能,不過 HSGPIO 訪問就要損失點性能了,

二、測驗波形結果
準備作業都做完了,現在就是示波器連上板卡開始實測了,根據組合,一共有時鐘配置(x2)* I/O 型別(x2)* 翻轉方法(x3)總計 12 個結果,這里僅貼出 HSGPIO 在 500MHz AHB/Core 時鐘頻率下的三種翻轉方法所得到的波形結果,全部測驗結果見最后一節,
首先是 GPIO->DR 暫存器異或位操作得到的波形結果,為了減少 while(1) 的執行對翻轉頻率的影響(畢竟這一句指令也是要消耗 CPU 周期的),我們在 while(1) 里加十次翻轉代碼,統計結果時也是取 10 個波形周期,最終得到翻轉頻率為 22.946 MHz,效果似乎一般,匯編視窗來看,這句 C 代碼異或操作被翻譯成了三條指令,先 LDR 指令讀出 GPIO->DR 暫存器當前值,然后 EOR 指令做異或操作,最后再 STR 指令寫入 GPIO->DR 暫存器,應該是 LDR 回讀指令耗時較長,

再來看 GPIO->DR_TOGGLE 置位操作和 GPIO->DR 的直接寫入操作結果,實測下來發現這兩種方法得到的翻轉頻率是一樣的(從匯編視窗來看兩種翻轉方法都是僅一條 STR 指令搞定),都是 250MHz,效果雖好,但有點過頭,因為波形里看到的不是標準幅值的方波,而是減半幅值的正弦波,這是因為 PAD 最大運行速度是 200MHz,它只能保證在低于 200MHz 的情況下有很好的電壓幅值回應表現,超過這個頻率,波形頻率值不受影響,但電壓幅值回應表現不能保證,

三、完整結果統計
現在我們來看一下全部的結果,因為三種 I/O 翻轉方法里有兩種效果是一樣的,所以我們省略了 GPIO->DR 直接寫入這種方法的結果,最終得到了 8 個結果,根據實測結果,我們得到了如下結論:
- 總結1: PAD配置里的運行頻率并不限制最終輸出翻轉頻率,只是無法保證超過設定頻率后的波形幅值回應表現
- 總結2: 置位 GPIO->DR_TOGGLE 暫存器可獲得最佳 I/O 翻轉性能
- 總結3: 普通 GPIO 最大翻轉頻率是 20.614MHz,約是時鐘源 IPG Bus 的 1/7.5
- 總結4: HSGPIO 最大翻轉頻率是 250MHz,約是時鐘源 AHB Bus 的 1/2
| AHB/Core時鐘頻率 | IPG總線時鐘頻率 | I/O PAD配置 | I/O翻轉方法 | 普通GPIO極限翻轉頻率 | 高速GPIO極限翻轉頻率 |
|---|---|---|---|---|---|
| 500MHz | 125MHz | Fast Slew, 200MHz | 異或GPIO->DR | 5.214MHz 標準幅度方波 |
22.946MHz 標準幅度方波 |
| 500MHz | 125MHz | Fast Slew, 200MHz | 置位GPIO->DR_TOGGLE | 15.533MHz 標準幅度方波 |
250MHz 減半幅度正弦波 |
| 452.6MHz | 150.8MHz | Fast Slew, 200MHz | 異或GPIO->DR | 6.309MHz 標準幅度方波 |
18.864MHz 標準幅度方波 |
| 452.6MHz | 150.8MHz | Fast Slew, 200MHz | 置位GPIO->DR_TOGGLE | 20.614MHz 標準幅度方波 |
226.244MHz 減半幅度正弦波 |
四、一個有趣的問題
最后再留一個開放問題,在痞子衡舊文 《以GPIO模塊為例談談中斷處理函式(IRQHandler)的標準流程》 里提到過 ARM Errata 838869 ,即在 Cortex-M4/7 上,如果 CPU 執行速度遠遠高于 GPIO 外設暫存器寫入速度,如果代碼邏輯里涉及 GPIO 暫存器回讀,一般需要在 GPIO 暫存器寫入操作后額外插入 DSB 指令來保證同步,
我們現在在 500MHz AHB/Core 時鐘頻率下 HSGPIO 翻轉代碼里額外插入 DSB 指令,看看有什么影響,結果翻轉頻率從 250MHz 一下子降到了 35.8MHz,

至此,i.MXRT1010上的普通GPIO與高速GPIO極限翻轉頻率痞子衡便介紹完畢了,掌聲在哪里~~~
歡迎訂閱
文章會同時發布到我的 博客園主頁、CSDN主頁、知乎主頁、微信公眾號 平臺上,
微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦,

最后歡迎關注痞子衡個人微信公眾號【痞子衡嵌入式】,一個專注嵌入式技術的公眾號,跟著痞子衡一起玩轉嵌入式,
衡杰(痞子衡),目前就職于恩智浦MCU系統部門,擔任嵌入式系統應用工程師,
專欄內所有文章的轉載請注明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]
可以關注痞子衡的Github主頁 https://github.com/JayHeng,有很多好玩的嵌入式專案,
關于專欄文章有任何疑問請直接在博客下面留言,痞子衡會及時回復免費(劃重點)答疑,
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/356220.html
標籤:嵌入式
上一篇:Ubuntu 18.04 LTS的網路經常變成問號導致網速很慢的解決辦法
下一篇:手機遠程連接服務器工具:RD client遠程桌面使用教程 手機怎么連接服務器遠程桌面?蘋果手機怎么連接服務器?




