i.MX RT1062筆記(1) ----Flex RAM 配置


簡介:

  i.MX.RT1062內置1MB OCRAM,其中512KB Flex RAM與ITCM/DTCM共享。OCRAM,ITCM,DTCM占的比例大小,可以根據具體應用來配置調整。

  OCRAM的頻率只有主頻的1/4,而ITCM和DTCM的頻率跟主頻一樣,為了獲取更好的性能,不同的數據需分配 到相應的RAM。

  • ITCM一般用來存放需要運行在RAM的函數代碼(大多情況下,開啟Cache,單純把函數從XIP(Flash)拷貝到ITCM運行,其速度未見明顯提高,因為cache的效果跟TCM差不多)
  • DTCM一般用來存放內核讀寫的變量數據,如堆棧,在處理大量數據時,比OCARM明顯快很多
  • OCRAM用於普通變量,外設讀寫的緩存(如攝像頭數據緩存,DMA讀寫緩存等)

應用舉例:

  Flex RAM配置為512KB OCRAM, 64KB ITCM, 448KB DTCM。

  Cortex M7要求TCM的大小必須是2的N次方,實際分配可以不受此限制,例如上面配置448KB,但設置時大小512KB,應用只需保證訪問不超出448KB就可以了。 

512KB Flex RAM,RT1062默認配置(由fuse決定)是256KB OCRAM,128KB ITCM,128KB DTCM。
Flex RAM應該在復位中斷進行配置,避免RAM未配置,訪問到非法內存。
需要配置的寄存器及功能如下:

  • IOMUXC_GPR_GPR17:配置OCRAM,ITCM,DTCM所占512KB Flex RAM的比例

     該寄存器每兩位表示一個bank(32KB),其中
     00表示未使用
     01表示配置為OCRAM
     10表示配置為DTCM
     11表示配置為ITCM

  • IOMUXC_GPR_GPR16:TCM使能控制,以及配置源選擇(選擇Flex RAM的配置是由fuse還是由FLEXRAM_BANK_CFG決定)
  • IOMUXC_GPR_GPR14:指明ITCM,DTCM的大小

源碼:

 1 __attribute__ ((section(".after_vectors.reset")))
 2 void ResetISR(void) {
 3 
 4     // Disable interrupts
 5     __asm volatile ("cpsid i");
 6 /*
 7  * GPR17 (32KB per bank, every two bits means one bank) 
 8  * 00   Not used
 9  * 01   OCRAM
10  * 10   DTCM
11  * 11    ITCM
12  */
13     /*64KB ITCM,  448KB DTCM, 0KB OCRAM*/
14     IOMUXC_GPR->GPR17 = 0xFAAAAAAA;
15 
16     IOMUXC_GPR->GPR16 &= ~IOMUXC_GPR_GPR16_INIT_ITCM_EN_MASK;
17     IOMUXC_GPR->GPR16 &= ~IOMUXC_GPR_GPR16_INIT_DTCM_EN_MASK;
18     /*
19      *  GPR14  bit23-bit20
20         0000 0 KB (No DTCM)
21         0011 4 KB
22         0100 8 KB
23         0101 16 KB
24         0110 32 KB
25         0111 64 KB
26         1000 128 KB
27         1001 256 KB
28         1010 512 KB
29      */
30     IOMUXC_GPR->GPR14 &= ~IOMUXC_GPR_GPR14_CM7_CFGDTCMSZ_MASK;
31     /*
32      * GPR17 set DTCM 448KB , but here sizes are 512KB
33      * see AN12077 Using the i.MX RT FlexRAM.pdf
34      * 3.1.3.2. Ignoring Cortex-M7 TCM size limitations
35      *
36      */
37     IOMUXC_GPR->GPR14 |= 10<<20u;
38     /*
39      *  GPR14  bit19-bit16
40         0000 0 KB (No ITCM)
41         0011 4 KB
42         0100 8 KB
43         0101 16 KB
44         0110 32 KB
45         0111 64 KB
46         1000 128 KB
47         1001 256 KB
48         1010 512 KB
49      */
50     IOMUXC_GPR->GPR14 &= ~IOMUXC_GPR_GPR14_CM7_CFGITCMSZ_MASK;
51     IOMUXC_GPR->GPR14 |= 7<<16u;
52     IOMUXC_GPR->GPR16 |= IOMUXC_GPR_GPR16_FLEXRAM_BANK_CFG_SEL_MASK |
53                          IOMUXC_GPR_GPR16_INIT_DTCM_EN_MASK |
54                          IOMUXC_GPR_GPR16_INIT_ITCM_EN_MASK;
55 
56     .......
57 
58     // Reenable interrupts
59     __asm volatile ("cpsie i");
60 
61     #if defined (__REDLIB__)
62         // Call the Redlib library, which in turn calls main()
63         __main();
64     #else
65         main();
66     #endif
67 
68     //
69     // main() shouldn't return, but if it does, we'll just enter an infinite loop
70     //
71     while (1) {
72         ;
73     }         
74  }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM