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  }

 

posted @ 2018-12-04 10:12  非正式码农  阅读(4149)  评论(0编辑  收藏  举报