本帖最后由 小恩GG 于 2020-6-30 20:40 编辑
【经验分享】基于IAR RT1064 FlexRAM重新配置
一,文档说明
之前有分享过基于MCUXPresso RT flexRAM重新配置的情况:
由于有些网友在使用IAR的时候,也遇到了写FlexRAM配置的问题,这里给出IAR版本的配置。
测试基于MIMXRT1064,SDK helloword, FlexRAM配置如下:
DTCM 256KB, OCRM128KB, ITCM 128KB
这里需要注意的是,RT106X和RT1050有些区别:
RT1050
RT106X:
注意,RT106X的OCRAM是分两块,一块OCRAM2 512KB,另外一块是OCRAM flexRAM,是用来和ITCM, DTCM一起共享的。所以本文涉及到的RT1064其实flexRAM用到的OCRAM区域是0X2028_0000 到202F_FFFF,共512KB,ITCM,DTCM共享512KB。
二,IAR下flexRAM分配操作步骤
IAR工程可以直接用SDK结合MCUXPresso config tool CFG工具生成一个单独的工程。
2.1 修改startup_MIMXRT1064.s
- __iomux_gpr14_adr EQU 0x400AC038
- __iomux_gpr16_adr EQU 0x400AC040
- __iomux_gpr17_adr EQU 0x400AC044
- __flexram_bank_cfg EQU 0x5AAFFAA5
- __flexram_itcm_size EQU 0x00000008
- __flexram_dtcm_size EQU 0x00000009
- Reset_Handler
- CPSID I ; Mask interrupts
- ;#ifdef FLEXRAM_CFG_ENABLE
- LDR R0,=__iomux_gpr17_adr ;load IOMUXC_GPR17 register address to R0
- MOV32 R1,__flexram_bank_cfg ;move FlexRAM configuration value to R1
- STR R1,[R0]
-
- LDR R0,=__iomux_gpr16_adr ;load IOMUXC_GPR16 register address to R0
- LDR R1,[R0] ;load IOMUXC_GPR16 register value to R1
- ORR R1,R1,#4 ;set corresponding FLEXRAM_BANK_CFG_SEL bit
- STR R1,[R0] ;store the value to IOMUXC_GPR16 (user defined FlexRAM cfg enabled)
- LDR R0,=__iomux_gpr14_adr ;load IOMUXC_GPR14 register address to R0
- LDR R1,[R0] ;load IOMUXC_GPR14 register value to R1
- MOVT R1,#0X0000 ;clear upper halfword of IOMUXC_GPR14 register
- MOV R2,#__flexram_itcm_size
- MOV R3,#__flexram_dtcm_size
- LSL R2,R2,#16
- LSL R3,R3,#20
- ORR R1,R2,R3
- STR R1,[R0] ;store the vale to IOMUXC_GPR14(disable DTCM)
- ;#endif ;end flexram_cfg_enable
- void SystemInit (void) {
-
- FLEXRAM->TCM_CTRL = 4;
- ...
- }
复制代码
2.2 修改BOARD_ConfigMPU()在board.c文件 - /* Region 4 setting: Memory with Normal type, not shareable, outer/inner write back */
- MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U);
- MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_128KB);
- /* Region 5 setting: Memory with Normal type, not shareable, outer/inner write back */
- MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U);
- MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB);
- /* Region 7 setting: Memory with Normal type, not shareable, outer/inner write back */
- MPU->RBAR = ARM_MPU_RBAR(7, 0x20280000U);
- MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_128KB);
复制代码
2.3 ld文件修改
因为DTCM变大,修改对应结束地址:
define symbol m_data_end = 0x2003FFFF;
三,测试结果
DTCM 256KB, OCRM128KB, ITCM 128KB
DTCM 地址范围:0X2000_0000-0X2003_FFFF
ITCM 地址范围:0X0000_0000-0X0001_FFFF
OCRAM地址范围:0X2028_0000-0X2029_FFFF ITCM:
DTCM:
OCRAM FlexRAM
虽然IAR memory不能读出来,但是代码还是能够读写对应OCRAM区域。
以上结果,说明已经分区成功。
|