大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是從功耗測試角度瞭解i.MXRTxxx系列片內SRAM分割區電源控制。
我們知道配合 MCU 一起工作的記憶體包含 ROM(Flash) 和 RAM 兩類,前者主要放 RO 程式碼和資料,後者放 RW 資料。MCU 可以沒有片內 ROM,但是一般都會包含片內 RAM,這個片內 RAM 功耗是 MCU 整體功耗的重要組成部分。
恩智浦 i.MXRT 四位數系列片內 RAM 主要由 FlexRAM 和 OCRAM 組成,痞子衡寫過一篇文章 《FlexRAM模組詳解》,裡面介紹了 FlexRAM 的電源控制策略。雖然 FlexRAM 也是由多個 Bank 組成,但是其無法做到任意開關每個 Bank,其受既定的組合策略控制(跟隨系統 Low Power 模式),而 OCRAM 則直接是整體開關。就這方面設計而言,i.MXRT 三位數系列片內 SRAM 電源控制則靈活得多,今天痞子衡就重點聊聊這個話題:
恩智浦 i.MXRT 三位數系列目前主要是 RT500 和 RT600 兩大型號,前者包含 5MB 片內 SRAM,後者包含 4.5MB 片內 SRAM。因為片內 RAM 夠大,所以為其設計的電源控制策略就更精細。
下圖是 RT500 上 AXI-to-RAM 架構圖,從圖裡我們知道 5MB SRAM 一共被分成了 32 塊(注意不是等分,有 32KB/64KB/128KB/256KB 四種不同大小)。
- RT500 一共 32 個 SRAM 分割區(SRAM0-31):
- RT600 一共 30 個 SRAM 分割區(SRAM0-29):
- 不同大小的 SRAM 分割區:
SRAM0-7 : 32KB
SRAM8-11 : 64KB
SRAM12-15 : 128KB
SRAM16-31 : 256KB
因為 RT500/600 都是基於 ARM Cortex-M33,所以片內 SRAM 在系統地址對映裡有 Secure 和 Non-Secure 兩個不同起始地址,再加上可以通過 Code 和 Data 兩個不同匯流排去存取,所以應用裡可以通過如下 4 個不同起始地址來存取到這同一塊物理 SRAM。
這些 SRAM 分割區除了大小不同之外,有一些還被賦予了特殊用途。比如 SRAM2,3 被 ROM API 徵用了,如果應用裡需要呼叫 ROM API,需要釋放 SRAM2,3 使用權。SRAM0 則更特殊,它是唯一的一個軟復位後依舊能保持內容的分割區(其它分割區復位後預設是Power down狀態,不過上電 BootROM 執行時會將全部分割區都開啟)。
-(適用RT500/600)The SRAM2,3 region [0x10000-0x1BFFF] is reserved for ROM code.
-(適用RT500/600)The SRAM0,3 region [0x0-0xFFFF], [0x1C000-0x1FFFF] are reserved for app-specific use cases.
-(適用RT500/600)The SRAM4-11 region [0x20000-0x7FFFF] is reserved for Non-cached shared memory between M33 and DSP.
-(適用RT500) The SRAM12-21 region [0x80000-0x27FFFF] is reserved for DSP code and data.
全部 SRAM 分割區的電源開關在 SYSCTL0->PDRUNCFG2,3暫存器中,其中 PDRUNCFG2 控制的是 SRAM 各分割區儲存媒介的電,PDRUNCFG3 控制的是 SRAM 各分割區外圍支援電路(線性驅動器、感測放大器)的電。如果我們想在保持 SRAM 中內容的情況下省電,可以僅操作 PDRUNCFG3 去關閉外圍。
功耗測量最簡單的辦法就是找一個萬用表,調節到電流測量模式,將其串到 VDDCORE 訊號上,MIMXRT595-EVK (Rev.D3) 板卡特地設計了 JS25 接頭,方便測量電流。
板子上電,應用程式載入執行後,便可以實時觀測到執行時電流。不過電流測量有幾個注意事項:
1. 不要掛載偵錯程式線上執行時測量電流,會導致結果偏大。
2. 應用程式裡如果有涉及模組電源開關程式碼,不要使能編譯器優化等級,防止程式碼優化影響結果(電源開關有順序要求)。
3. 如果是 CPU 高頻運算相關程式碼,不同編譯器下會導致結果不同,因為程式碼密度可能有差異。
4. 即使是單純 while (1) 執行(可以在前面按需要加多個 NOP() 改變 while(1) 指令地址),指令地址不同也可能導致結果不同。
最後痞子衡在 MIMXRT595-EVK (Rev.D3) 板上藉助 \SDK_2_13_1_EVK-MIMXRT595\boards\evkmimxrt595\demo_apps\hello_world\iar 模板例程(debug Build,需要修改 main 函數以及相應修改連結檔案),來測試程式碼在不同 SRAM 分割區下執行的電流情況:
void sram_power_cfg(void)
{
PRINTF("CPU Frequency %d\n", CLOCK_GetFreq(kCLOCK_CoreSysClk));
PRINTF("Main Clock %d\n", CLOCK_GetFreq(kCLOCK_BusClk));
// 控制 SRAM 分割區電源
SYSCTL0->PDRUNCFG2_SET = 0xFFFFFFFC;
SYSCTL0->PDRUNCFG3_SET = 0xFFFFFFFC;
PRINTF("PDRUNCFG 0x%x, 0x%x, 0x%x, 0x%x\n", SYSCTL0->PDRUNCFG0, SYSCTL0->PDRUNCFG1, SYSCTL0->PDRUNCFG2, SYSCTL0->PDRUNCFG3);
}
int main(void)
{
BOARD_InitPins();
BOARD_BootClockRUN();
BOARD_InitDebugConsole();
sram_power_cfg();
// 增減 nop 指令數量來控制 while(1) 指令地址
asm("nop");
//asm("nop");
//asm("nop");
//asm("nop");
while (1)
{
}
}
最終測試結果如下,不同大小的 SRAM 分割區功耗是有差異的,並且即使 SRAM 分割區大小相同,功耗也可能有差異。此外 while(1) 指令地址不同導致的執行功耗差異也不小:
RO section in SRAMx RW section in SRAM0 |
SYSCTL0->PDRUNCFG2,3值 | NOP數控制 while(1)指令地址 |
VDDCORE電流 |
---|---|---|---|
1 | 0xFFFFFFFC | 0xbe50/0xbe52/0xbe58/oxbe5a | 29.39 - 30.52mA |
1 | 0xFFFFFFFC | 0xbe54/0xbe56/0xbe5c/oxbe5e | 32.55 - 33.86mA |
8 | 0xFFFFFEFE | 0x43e50/0x43e52/0x43e58/ox43e5a | ~30.4mA |
8 | 0xFFFFFEFE | 0x43e54/0x43e56/0x43e5c/ox43e5e | ~34.3mA |
12 | 0xFFFFEFFE | 0x83e50/0x83e52/0x83e58/ox83e5a | ~31.97mA |
12 | 0xFFFFEFFE | 0x83e54/0x83e56/0x83e5c/ox83e5e | ~37.03mA |
16 | 0xFFFEFFFE | 0x103e50/0x103e52/0x103e58/ox103e5a | ~31.45mA |
16 | 0xFFFEFFFE | 0x103e54/0x103e56/0x103e5c/ox103e5e | ~34.7mA |
30 | 0xBFFFFFFE | 0x483e50/0x483e52/0x483e58/ox483e5a | ~34.66mA |
30 | 0xBFFFFFFE | 0x483e54/0x483e56/0x483e5c/ox483e5e | ~42.2mA |
至此,從功耗測試角度瞭解i.MXRTxxx系列片內SRAM分割區電源控制痞子衡便介紹完畢了,掌聲在哪裡~~~
文章會同時釋出到我的 部落格園主頁、CSDN主頁、知乎主頁、微信公眾號 平臺上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維條碼,就可以在手機上第一時間看了哦。
最後歡迎關注痞子衡個人微信公眾號【痞子衡嵌入式】,一個專注嵌入式技術的公眾號,跟著痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職於某知名外企半導體公司MCU系統部門,擔任嵌入式系統應用工程師。
專欄內所有文章的轉載請註明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或諮詢業務合作請發郵件至 https://www.cnblogs.com/henjay724/p/[email protected]
可以關注痞子衡的Github主頁 https://github.com/JayHeng,有很多好玩的嵌入式專案。
關於專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回覆免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。