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 }