<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      痞子衡嵌入式:實(shí)測i.MXRT1010上的普通GPIO與高速GPIO極限翻轉(zhuǎn)頻率


        大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是i.MXRT1010上的普通GPIO與高速GPIO極限翻轉(zhuǎn)頻率

        上一篇文章 《聊聊i.MXRT1xxx上的普通GPIO與高速GPIO差異及其用法》,痞子衡從原理上介紹了 i.MXRT1xxx 系列里普通 GPIO 和 HSGPIO 差異,今天我們就來實(shí)測它們的極限翻轉(zhuǎn)頻率,看看它們實(shí)際表現(xiàn)差別到底有多大。本次選擇的測試芯片是 i.MXRT1010,這顆芯片從功能上來說是目前 i.MXRT1xxx 系列里的小兄弟,但別小看它,因?yàn)槭呛竺嫱瞥龅男吞?hào),恩智浦的設(shè)計(jì)團(tuán)隊(duì)為它在某些方面做了特殊的性能優(yōu)化,包括 HSGPIO 性能。話不多說,開測:

      一、測試準(zhǔn)備工作

      1.1 測試板卡及測試點(diǎn)

        選定的板卡是恩智浦官方 MIMXRT1010-EVK,板卡上連接 LED 燈的是 GPIO_11,翻看芯片參考手冊(cè),這個(gè) PAD 既可以配到普通 GPIO(GPIO1[11]) 也可以配到 HSGPIO(GPIO2[11]),正是理想的 PAD,我們就選擇這個(gè) PAD 做測試。此外,最終 I/O 輸出波形形態(tài)跟外圍驅(qū)動(dòng)電路也有關(guān)聯(lián),所以這里也有必要交待清楚:

      • Note: 所用示波器型號(hào)是 Tektronix MDO3024, 帶寬 200MHz, 采樣率 2.5GS/s

      1.2 I/O 翻轉(zhuǎn)測試代碼

        測試工程我們可以直接在 \SDK_2.11.0_EVK-MIMXRT1010\boards\evkmimxrt1010\driver_examples\gpio\led_output 例程上修改,為了盡力展示 GPIO 極限性能,不受其他瓶頸因素干擾,這里選擇代碼執(zhí)行性能最高的工程 build(即代碼段在 ITCM 里,數(shù)據(jù)段在 DTCM 里)。

        I/O 初始化代碼很簡單,在 《普通GPIO與高速GPIO差異及其用法》 文章里都介紹清楚了。這里僅有一點(diǎn)注意,為了統(tǒng)一最終 I/O 輸出效果,不管是用于普通 GPIO 還是 HSGPIO,我們都直接將測試 PAD 配置到最快的 200MHz 運(yùn)行頻率(PAD 支持的 50/100/150/200MHz 運(yùn)行頻率配置不同主要是對(duì)信號(hào)幅值響應(yīng)表現(xiàn)有影響,不過痞子衡實(shí)測這四種速度配置對(duì)于 100MHz 的 I/O 翻轉(zhuǎn)信號(hào)輸出效果是一樣的(僅示波器端觀測波形角度而言),看到的都是標(biāo)準(zhǔn)幅度的正弦波):

      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/7, 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 模塊里跟電平輸出控制相關(guān)的寄存器有兩個(gè),一個(gè)是 DR 寄存器,另一個(gè)是 DR_TOGGLE 寄存器,都可用于實(shí)現(xiàn)輸出電平翻轉(zhuǎn)。有如下代碼所示的三種常見電平翻轉(zhuǎn)方法,在低翻轉(zhuǎn)頻率情況下,這三種方法是等效的,但是在極限翻轉(zhuǎn)頻率情況下,這三種方法表現(xiàn)不完全一致,下一節(jié)實(shí)測結(jié)果會(huì)告訴你:

      void io_test_run(void)
      {
          io_test_init(false);
          while (1)
          {
              // 電平翻轉(zhuǎn)方法一:異或位操作
              //GPIO2->DR ^= 0x800;
      
              // 電平翻轉(zhuǎn)方法二:直接賦值切換位
              //GPIO2->DR = 0x800;
              //GPIO2->DR = 0x000;
      
              // 電平翻轉(zhuǎn)方法三:利用 TOGGLE 位
              GPIO2->DR_TOGGLE = 0x800;
          }
      }
      

      1.3 芯片系統(tǒng)時(shí)鐘配置

        《普通GPIO與高速GPIO差異及其用法》 一文里講了,普通 GPIO 時(shí)鐘源是 IPG Bus,而 HSGPIO 時(shí)鐘源是 AHB Bus,因此測試工程里 AHB/IPG 時(shí)鐘配置會(huì)影響最終 I/O 翻轉(zhuǎn)極限頻率。下圖是 i.MXRT1010 內(nèi)核結(jié)構(gòu)里的 HSGPIO 通路,它和 i.MXRT1060/1170 內(nèi)核結(jié)構(gòu)里 HSGPIO 通路其實(shí)有點(diǎn)小區(qū)別,這也是 i.MXRT1010 上的優(yōu)化之處。

        led_output 例程里的默認(rèn)系統(tǒng)時(shí)鐘配置,AHB/Core 時(shí)鐘來自于 PLL6 - 500MHz,AHB_PODF 設(shè) 0 (即不分頻),而 IPG Bus 時(shí)鐘源固定來自于 AHB/Core,且只能在其基礎(chǔ)上做 1/2/3/4 分頻,我們知道 IPG Bus 最高僅支持 150MHz,因此在這種情況下 IPG_PODF 只能設(shè) 3(四分頻),IPG 時(shí)鐘實(shí)際是 125MHz,顯然 HSGPIO 訪問可以得到最優(yōu)性能,但普通 GPIO 達(dá)不到最優(yōu)性能。

      PLL6, CCM_ANALOG->PLL_ENET[ENET_500M_REF_EN] = 1'b1,固定 500MHz
      CCM->CBCMR[PRE_PERIPH_CLK_SEL] = 2'b11,derive clock from PLL6
      CCM->CBCDR[PERIPH_CLK_SEL] = 1'b0,derive clock selected by CCM->CBCMR[PRE_PERIPH_CLK_SEL]
      CCM->CBCDR[AHB_PODF] = 3'b000,divide by 1
      CCM->CBCDR[IPG_PODF] = 2'b11,divide by 4
      

        為了測試普通 GPIO 的最優(yōu)性能,我們需要同時(shí)再測試一種新的系統(tǒng)時(shí)鐘配置,AHB/Core 時(shí)鐘源選用 PLL2_PFD3,將這個(gè)源配置為 452.6 MHz,AHB_PODF 依舊設(shè) 0,這樣 IPG_PODF 設(shè) 2(三分頻)可以得到 150.8MHz 的 IPG 時(shí)鐘,這時(shí)普通 GPIO 訪問可以得到最優(yōu)性能,不過 HSGPIO 訪問就要損失點(diǎn)性能了。

      PLL2,CCM_ANALOG->PFD_528[PFD3_FRAC] = 21,即 528MHz*18/PFD3_FRAC = 452.57MHz
      CCM->CBCMR[PRE_PERIPH_CLK_SEL] = 2'b10,derive clock from PLL2 PFD3
      CCM->CBCDR[PERIPH_CLK_SEL] = 1'b0,derive clock selected by CCM->CBCMR[PRE_PERIPH_CLK_SEL]
      CCM->CBCDR[AHB_PODF] = 3'b000,divide by 1
      CCM->CBCDR[IPG_PODF] = 2'b10,divide by 3
      

      二、測試波形結(jié)果

        準(zhǔn)備工作都做完了,現(xiàn)在就是示波器連上板卡開始實(shí)測了,根據(jù)組合,一共有時(shí)鐘配置(x2)* I/O 類型(x2)* 翻轉(zhuǎn)方法(x3)總計(jì) 12 個(gè)結(jié)果,這里僅貼出 HSGPIO 在 500MHz AHB/Core 時(shí)鐘頻率下的三種翻轉(zhuǎn)方法所得到的波形結(jié)果,全部測試結(jié)果見最后一節(jié)。

        首先是 GPIO->DR 寄存器異或位操作得到的波形結(jié)果,為了減少 while(1) 的執(zhí)行對(duì)翻轉(zhuǎn)頻率的影響(畢竟這一句 B.N 跳轉(zhuǎn)指令也是要消耗 CPU 周期的),我們?cè)?while(1) 里加十次翻轉(zhuǎn)代碼,統(tǒng)計(jì)結(jié)果時(shí)取 5/10 個(gè)波形周期求平均,最終得到翻轉(zhuǎn)頻率為 22.946 MHz,效果似乎一般。匯編窗口來看,這句 C 代碼異或操作被翻譯成了三條指令,先 LDR 指令讀出 GPIO->DR 寄存器當(dāng)前值,然后 EOR 指令做異或操作,最后再 STR 指令寫入 GPIO->DR 寄存器,應(yīng)該是 LDR 回讀指令耗時(shí)較長。

        再來看 GPIO->DR_TOGGLE 置位操作和 GPIO->DR 的直接寫入操作結(jié)果,實(shí)測下來發(fā)現(xiàn)這兩種方法得到的翻轉(zhuǎn)頻率是一樣的(從匯編窗口來看兩種翻轉(zhuǎn)方法都是僅一條 STR 指令搞定),都是 250MHz,效果雖好,但有點(diǎn)過頭,因?yàn)椴ㄐ卫锟吹降牟皇菢?biāo)準(zhǔn)幅值 3.3V 的方波(暫不確定是不是 200MHz 帶寬的示波器瓶頸),而是減半幅值(約 1.6V )的正弦波,也不排除 PAD 最大運(yùn)行速度是 200MHz,它只能保證在低于 200MHz 的情況下有很好的電壓幅值響應(yīng)表現(xiàn)(包括翻轉(zhuǎn)斜率),超過這個(gè)頻率,波形頻率值不受影響,但電壓幅值響應(yīng)表現(xiàn)不能保證。

        為了驗(yàn)證是不是示波器瓶頸,痞子衡找了臺(tái)更高性能的 Tektronix MSO5204(帶寬 2GHz, 采樣率 10GS/s),復(fù)測了一下這個(gè) 250MHz 的信號(hào),得到結(jié)果略有改善,但幅度一樣有衰減(2.34V),還是 PAD 本身限制。

      三、完整結(jié)果統(tǒng)計(jì)

        現(xiàn)在我們來看一下全部的結(jié)果,因?yàn)槿N I/O 翻轉(zhuǎn)方法里有兩種效果是一樣的,所以我們省略了 GPIO->DR 直接寫入這種方法的結(jié)果,最終得到了 8 個(gè)結(jié)果。根據(jù)實(shí)測結(jié)果,我們得到了如下結(jié)論:

      • 總結(jié)1: PAD配置里的運(yùn)行頻率并不限制最終輸出翻轉(zhuǎn)頻率,只是無法保證超過設(shè)置頻率后的波形幅值響應(yīng)表現(xiàn)(包括翻轉(zhuǎn)斜率)
      • 總結(jié)2: 置位 GPIO->DR_TOGGLE 寄存器可獲得最佳 I/O 翻轉(zhuǎn)性能
      • 總結(jié)3: 普通 GPIO 翻轉(zhuǎn)頻率約是時(shí)鐘源 IPG Bus 的 1/7.5,極限翻轉(zhuǎn)頻率是 20.614MHz
      • 總結(jié)4: HSGPIO 翻轉(zhuǎn)頻率約是時(shí)鐘源 AHB Bus 的 1/2,極限翻轉(zhuǎn)頻率是 250MHz
      AHB/Core時(shí)鐘頻率 IPG總線時(shí)鐘頻率 I/O PAD配置 I/O翻轉(zhuǎn)方法 普通GPIO極限翻轉(zhuǎn)頻率 高速GPIO極限翻轉(zhuǎn)頻率
      500MHz 125MHz Fast Slew, 200MHz 異或GPIO->DR 5.214MHz
      標(biāo)準(zhǔn)幅度方波
      22.946MHz
      標(biāo)準(zhǔn)幅度方波
      500MHz 125MHz Fast Slew, 200MHz 置位GPIO->DR_TOGGLE 15.533MHz
      標(biāo)準(zhǔn)幅度方波
      250MHz
      減半幅度正弦波
      452.6MHz 150.8MHz Fast Slew, 200MHz 異或GPIO->DR 6.309MHz
      標(biāo)準(zhǔn)幅度方波
      18.864MHz
      標(biāo)準(zhǔn)幅度方波
      452.6MHz 150.8MHz Fast Slew, 200MHz 置位GPIO->DR_TOGGLE 20.614MHz
      標(biāo)準(zhǔn)幅度方波
      226.244MHz
      減半幅度正弦波

      四、一個(gè)有趣的問題

        最后再留一個(gè)開放問題,在痞子衡舊文 《以GPIO模塊為例談?wù)勚袛嗵幚砗瘮?shù)(IRQHandler)的標(biāo)準(zhǔn)流程》 里提到過 ARM Errata 838869 ,即在 Cortex-M4/7 上,如果 CPU 執(zhí)行速度遠(yuǎn)遠(yuǎn)高于 GPIO 外設(shè)寄存器寫入速度,如果代碼邏輯里涉及 GPIO 寄存器回讀,一般需要在 GPIO 寄存器寫入操作后額外插入 DSB 指令來保證同步。

        我們現(xiàn)在在 500MHz AHB/Core 時(shí)鐘頻率下 HSGPIO 翻轉(zhuǎn)代碼里額外插入 DSB 指令,看看有什么影響,結(jié)果翻轉(zhuǎn)頻率從 250MHz 一下子降到了 35.8MHz。

        至此,i.MXRT1010上的普通GPIO與高速GPIO極限翻轉(zhuǎn)頻率痞子衡便介紹完畢了,掌聲在哪里~~~

      歡迎訂閱

      文章會(huì)同時(shí)發(fā)布到我的 博客園主頁、CSDN主頁知乎主頁微信公眾號(hào) 平臺(tái)上。

      微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機(jī)上第一時(shí)間看了哦。

      posted @ 2021-11-11 23:29  痞子衡  閱讀(734)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 亚洲男人第一无码av网| 2019亚洲午夜无码天堂| 亚洲avav天堂av在线网爱情| 老色鬼在线精品视频| 亚洲a∨无码无在线观看| 国产精品综合色区在线观| 国产精品免费重口又黄又粗| 在线无码中文字幕一区| 男女一级国产片免费视频| 大理市| 麻豆蜜桃伦理一区二区三区| 欧洲精品色在线观看| 国产成人精品一区二区无| 美女禁区a级全片免费观看| 亚洲大尺度无码专区尤物| 久久精品波多野结衣| 国产在线观看码高清视频| 国产精品视频露脸| 国内自拍av在线免费| 熟妇的奶头又大又长奶水视频| 狠狠色丁香婷婷综合| 日韩精品人妻黄色一级片| 欧洲亚洲精品免费二区| 日韩中文字幕av有码| 肉大捧一进一出免费视频| 成人无码潮喷在线观看| 欧美激情一区二区| 国内精品无码一区二区三区| 国产精品一区二区三区四区| 少妇一边呻吟一边说使劲视频| 黑人巨大亚洲一区二区久| 桑日县| 亚洲精品麻豆一二三区| 国产在线啪| 久久久这里只有精品10| 国产成人夜色高潮福利app| 精品无码人妻一区二区三区| 久久久av男人的天堂| 无码精品人妻一区二区三区湄公河| 亚洲精品一区二区三区不| 国产成人午夜福利精品|