cache stm32h7_【STM32H7教程】第24章 STM32H7的Cache解读(非常重要)

本文详细介绍了STM32H7微控制器中关于指令Cache(ICache)和数据Cache(DCache)的管理,包括启用、禁用和清空操作,如SCB_EnableICache、SCB_DisableICache、SCB_InvalidateICache、SCB_EnableDCache、SCB_DisableDCache、SCB_InvalidateDCache以及SCB_CleanDCache等功能,强调了__DSB、__ISB和__DMB指令的重要作用。
摘要由CSDN通过智能技术生成

_CleanDCache和SCB_InvalidateDCache是对整个Cache的操作,所以比最后的三个函数SCB_InvalidateDCache_by_Addr,SCB_CleanDCache_by_Addr和SCB_CleanInvalidateDCache_by_Addr要耗时,当然,如果用户操作的存储器超过了数据Cache的大小,即16KB,那么就跟前三个函数没有区别了。

24.6.1 函数SCB_EnableICache

函数原型:

__STATIC_INLINE void SCB_EnableICache (void)

{

#if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)

__DSB();

__ISB();

SCB->ICIALLU = 0UL;                     /* invalidate I-Cache */

__DSB();

__ISB();

SCB->CCR |=  (uint32_t)SCB_CCR_IC_Msk;  /* enable I-Cache */

__DSB();

__ISB();

#endif

}

函数描述:

此函数用于使能指令Cache,系统上电后优先初始化即可。

注意事项:

__STATIC_INLINE:

表示内联函数,这种类型函数的作用就是将函数直接嵌入到调用此函数的代码中,从而降低调用此函数所占用的时间。

__DMB指令:

Data Memory Barrier(数据存储器隔离),DMB 指令保证所有在它前面的存储器访问操作都执行完毕后,才提交在它后面的存储器访问操作。

__DSB指令:

Data Synchronization Barrier(数据同步隔离),比DMB严格,当所有在它前面的存储器访问操作都执行完毕后,才执行在它后面的指令。

__ISB指令:

Instruction Synchronization Barrier(指令同步隔离),它会清洗流水线,以保证所有它前面的指令都执行完毕之后,才执行它后面的指令。

24.6.2 函数SCB_DisableICache

函数原型:

__STATIC_INLINE void SCB_DisableICache (void)

{

#if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)

__DSB();

__ISB();

SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk;  /* disable I-Cache */

SCB->ICIALLU = 0UL;                     /* invalidate I-Cache */

__DSB();

__ISB();

#endif

}

函数描述:

此函数用于禁止指令Cache。

注意事项:

__STATIC_INLINE,__DMB,__DSB和__ISB的作用看本章24.6.1小节的说明。

24.6.3 函数SCB_InvalidateICache

函数原型:

__STATIC_INLINE void SCB_InvalidateICache (void)

{

#if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)

__DSB();

__ISB();

SCB->ICIALLU = 0UL;

__DSB();

__ISB();

#endif

}

函数描述:

此函数用于将指令Cache无效化,无效化的意思是将Cache Line标记为无效,等同于删除操作。这样Cache空间就都腾出来了,可以加载新的指令。

注意事项:

__STATIC_INLINE,__DMB,__DSB和__ISB的作用看本章24.6.1小节的说明。

24.6.4 函数SCB_EnableDCache

函数原型:

__STATIC_INLINE void SCB_EnableDCache (void)

{

#if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)

uint32_t ccsidr;

uint32_t sets;

uint32_t ways;

SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/  /* Level 1 data cache */

__DSB();

ccsidr = SCB->CCSIDR;

/* invalidate D-Cache */

sets = (uint32_t)(CCSIDR_SETS(ccsidr));

do {

ways = (uint32_t)(CCSIDR_WAYS(ccsidr));

do {

SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) |

((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk)  );

#if defined ( __CC_ARM )

__schedule_barrier();

#endif

} while (ways-- != 0U);

} while(sets-- != 0U);

__DSB();

SCB->CCR |=  (uint32_t)SCB_CCR_DC_Msk;  /* enable D-Cache */

__DSB();

__ISB();

#endif

}

函数描述:

此函数用于使能数据Cache,系统上电后优先初始化即可。

注意事项:

__STATIC_INLINE,__DMB,__DSB和__ISB的作用看本章24.6.1小节的说明。

24.6.5 函数SCB_DisableDCache

函数原型:

__STATIC_INLINE void SCB_DisableDCache (void)

{

#if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)

register uint32_t ccsidr;

register uint32_t sets;

register uint32_t ways;

SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/  /* Level 1 data cache */

__DSB();

SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk;  /* disable D-Cache */

__DSB();

ccsidr = SCB->CCSIDR;

/* clean & invalidate D-Cache */

sets = (uint32_t)(CCSIDR_SETS(ccsidr));

do {

ways = (uint32_t)(CCSIDR_WAYS(ccsidr));

do {

SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) |

((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk)  );

#if defined ( __CC_ARM )

__schedule_barrier();

#endif

} while (ways-- != 0U);

} while(sets-- != 0U);

__DSB();

__ISB();

#endif

}

函数描述:

此函数用于禁止数据Cache。

注意事项:

__STATIC_INLINE,__DMB,__DSB和__ISB的作用看本章24.6.1小节的说明

24.6.6 函数SCB_InvalidateDCache

函数原型:

__STATIC_INLINE void SCB_CleanDCache (void)

{

#if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)

uint32_t ccsidr;

uint32_t sets;

uint32_t ways;

SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/  /* Level 1 data cache */

__DSB();

ccsidr = SCB->CCSIDR;

/* clean D-Cache */

sets = (uint32_t)(CCSIDR_SETS(ccsidr));

do {

ways = (uint32_t)(CCSIDR_WAYS(ccsidr));

do {

SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) |

((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk)  );

#if defined ( __CC_ARM )

__schedule_barrier();

#endif

} while (ways-- != 0U);

} while(sets-- != 0U);

__DSB();

__ISB();

#endif

}

函数描述:

此函数用于将数据Cache无效化,无效化的意思是将Cache Line标记为无效,等同于删除操作。这样Cache空间就都腾出来了,可以加载新的数据。

注意事项:

__STATIC_INLINE,__DMB,__DSB和__ISB的作用看本章24.6.1小节的说明。

24.6.7 函数SCB_CleanDCache

函数原型:

__STATIC_INLINE void SCB_CleanDCache (void)

{

#if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)

uint32_t ccsidr;

uint32_t sets;

uint32_t ways;

SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/  /* Level 1 data cache */

__DSB();

ccsidr = SCB->CCSIDR;

/* clean D-Cache */

sets = (uint32_t)(CCSIDR_SETS(ccsidr));

do {

ways = (uint32_t)(CCSIDR_WAYS(ccsidr));

do {

SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) |

((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk)  );

#if defined ( __CC_ARM )

__schedule_barrier();

#endif

} while (ways-- != 0U);

} while(sets-- != 0U);

__DSB();

__ISB();

#endif

}

函数描述:

此函数用于将数据Cache清除,清除的意思是将Cache Line中标记为dirty的数据写入到相应的存储区。

注意事项:

__STATIC_INLINE,__DMB,__DSB和__ISB的作用看本章24.6.1小节的说明。

24.6.8 函数SCB_CleanInvalidateDCache

函数原型:

__STATIC_INLINE void SCB_CleanInvalidateDCache (void)

{

#if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)

uint32_t ccsidr;

uint32_t sets;

uint32_t ways;

SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/  /* Level 1 data cache */

__DSB();

ccsidr = SCB->CCSIDR;

/* clean & invalidate D-Cache */

sets = (uint32_t)(CCSIDR_SETS(ccsidr));

do {

ways = (uint32_t)(CCSID

[1] [2] [3]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值