【简介】
S32K314 内部集成了8KB 的L1 DCACHE ,DCACHE 设计时参数为4-way 64-set cacheline size 32B, 32B(cacheline)*64(set)*4(way) = 8192B(8KB),S32K314 芯片为CORTEX-M7内核对应的架构为ARMV7-M。
对应DCACHE ICACHE 信息如下
I-Cache L1: 8 KB, 128 Sets, 32 Bytes/Line, 2-Way D-Cache L1: 8 KB, 64 Sets, 32 Bytes/Line, 4-Way
【CACHE INIT】
以下接口为cache init 的代码内容
static INLINE void sys_m7_cache_init(void) { #ifdef D_CACHE_ENABLE uint32 ccsidr = 0U; uint32 sets = 0U; uint32 ways = 0U; /*init Data caches*/ S32_SCB->CSSELR = 0U; /* select Level 1 data cache */ ASM_KEYWORD("dsb"); ccsidr = S32_SCB->CCSIDR; sets = (uint32)(CCSIDR_SETS(ccsidr)); do { ways = (uint32)(CCSIDR_WAYS(ccsidr)); do { S32_SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); ASM_KEYWORD("dsb"); } while (ways-- != 0U); } while(sets-- != 0U); ASM_KEYWORD("dsb"); S32_SCB->CCR |= (uint32)SCB_CCR_DC_Msk; /* enable D-Cache */ ASM_KEYWORD("dsb"); ASM_KEYWORD("isb"); #endif /*D_CACHE_ENABLE*/ #ifdef I_CACHE_ENABLE /*init Code caches*/ ASM_KEYWORD("dsb"); ASM_KEYWORD("isb"); S32_SCB->ICIALLU = 0UL; /* invalidate I-Cache */ ASM_KEYWORD("dsb"); ASM_KEYWORD("isb"); S32_SCB->CCR |= (uint32)SCB_CCR_IC_Msk; /* enable I-Cache */ ASM_KEYWORD("dsb"); ASM_KEYWORD("isb"); #endif /*I_CACHE_ENABLE*/ }
对应如下代码选中要操作的CACHE 为L1 data cache
/*init Data caches*/ S32_SCB->CSSELR = 0U; /* select Level 1 data cache */ ASM_KEYWORD("dsb");
CSSELR 对应寄存器描述如下
ccsidr = S32_SCB->CCSIDR; sets = (uint32)(CCSIDR_SETS(ccsidr)); do { ways = (uint32)(CCSIDR_WAYS(ccsidr)); do { S32_SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); ASM_KEYWORD("dsb"); } while (ways-- != 0U); } while(sets-- != 0U); ASM_KEYWORD("dsb");
上述代码根据芯片设计时的way/set 信息通过DCISW 寄存器invalue 对应的cache line
上述代码按照set 遍历将对应的way 中的set cache line 无效。
可以使用DCISW/DCCSW/DCCISW 寄存器来操作cache
以下代码使能cache
S32_SCB->CCR |= (uint32)SCB_CCR_DC_Msk; /* enable D-Cache */ ASM_KEYWORD("dsb"); ASM_KEYWORD("isb");
以下是I CACHE 初始化处理,invalidate 后使能ICACHE
#ifdef I_CACHE_ENABLE /*init Code caches*/ ASM_KEYWORD("dsb"); ASM_KEYWORD("isb"); S32_SCB->ICIALLU = 0UL; /* invalidate I-Cache */ ASM_KEYWORD("dsb"); ASM_KEYWORD("isb"); S32_SCB->CCR |= (uint32)SCB_CCR_IC_Msk; /* enable I-Cache */ ASM_KEYWORD("dsb"); ASM_KEYWORD("isb"); #endif /*I_CACHE_ENABLE*/