你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【实战经验】STM32H7的FMC外设在DCACHE使能时运行不正常

[复制链接]
zero99 发布时间:2017-11-7 15:15
STM32H7的FMC外设在DCACHE使能时运行不正常
1 R4 N2 I9 c; q- _; X9 G
前言# k" K! B' R, x
前段时间接到一个客户的问题。客户描述在使用STM32H7的FMC时,如果使能了DCACHE,就运行不正常。数据没有写到FMC外部的存储器里,测量FMC接口也没有波形跳变。而不使能DCACHE工作就是正常的。
$ Y1 N; z- G" {; u1 q其实对于这个问题,如果了解STM32H7的架构的话,就很容易理解了。下面我们就来看一看到底是什么原因让客户觉得使能DCACHE后FMC就工作不正常了。
3 l$ m) J3 ^! Z5 E/ d% [
9 Q; ?1 V1 L: ^2 j; USTM32H7的架构( x! K& Q$ [% A9 G
下面是STM32H7架构图中和FMC相关的部分。从图中可以看到,STM32H7是基于Cortex-M7内核,在内部的Cortex-M7内核里带有一个16KB的DCACHE和一个16KB的ICACHE。内核通过AXIM总线连接到的64位的AXI总线矩阵,通过这个总线矩阵连接到FMC接口。也就是说,当DCACHE使能的时候,对FMC接口上的存储器的操作是经过内核的缓存(CACHE)的。
4 N7 J; J# {% e0 b6 I5 ^ 11.jpg
7 l, k/ _! l  j* ?' t! e3 g# y: {: _' A7 M. @
使能了CACHE的好处就是可以提高内核访问存储器的速度。为什么使用缓存能提高速度呢?是因为在操作可以被缓存的存储器的时候,内核不是每次都去直接操作这些存储器,而是从缓存里读取数据,或者将数据先写到缓存里。看到这里,是不是觉得和前面客户说的现象有点联系了。
* S& i; F! o+ x3 E1 A8 V1 Y( O: H7 s
Cache的操作
5 M- E: j* G6 V4 U1 B+ C. t* W& c简单的说缓存工作时有两种方式:回写和透写。
& v" H1 g1 J. }/ r; `  E 12.jpg 2 ?) F, U( V* N% W" R) C2 b
回写就是数据只写到缓存中,等以后再同步到下一级存储器中。
" l8 ^. N4 Y/ p  c透写就是数据每次都同时写到缓存和下一级存储器中。这种方式可以解决数据不一致的问题,但同时也会消耗更多的总线访问。
& v) t5 _  Q* Q, K2 y1 v缓存的操作方式,在启用缓存后有一个默认的设置 。也就是下面这张表:
( X7 T5 _9 W8 p  i. e& i& G, \$ r0 u 13.jpg
4 q3 J+ l3 \5 a  t; y' T; m. k请参考AN4839了解更多的关于Cache的使用说明。& J; P' A  L$ t5 U1 K/ K1 @5 O
9 z7 @4 a! P, H  V& C' U6 O
问题分析及解决5 w' W) V% H$ o1 ~& Y# _4 y( B
客户是通过FMC的NOR存储控制器外接一个FPGA。映射的地址范围是0x60000000~0x7FFFFFFF。从上图可以看到,它默认的缓存操作方式是WBWA(回写写分配)。也就是说,当打开DCACHE后,所有对该地址范围的操作都会先到缓存。这也解释了为什么客户发现数据没有真正写到外部存储器中。客户的数据需要实时写到FPGA中进行计算。所以对这个应用场景,回写的设置就不合适了。' R7 T7 D) l: _4 k: F; w! j$ W
对于客户的这个应用,可以通过MPU来进行配置,将0x60000000~0x7FFFFFFF范围地址的CACHE设置为透写的方式,这样数据就会实时的写到FPGA中去了。( o) _4 ]2 D& ]# Y3 d& F
针对这种情况,我们可以通过MPU来解决这个问题。4 G% E- n3 @  t/ o. q
通过MPU,可以配置不同存储器空间的访问权限和Cache策略。HAL库里面提供了对应的函数和例程,参照例程用下面这段代码就可以解决客户的问题了。数据每次都是直接写到FPGA中,而不是缓存到内核的DCACHE中。7 E8 [$ B2 G0 c" W
14.jpg
3 w+ D0 o# B  `+ ?  C+ n* Q5 n+ J3 b$ V5 a" T
总结
7 Z2 z. u: r0 D; vCACHE的使用可以帮我们提高程序运行的性能,但也会带来缓存和二级存储器数据不一致和缓冲不击中带来的程序执行的时间不确定的情况,需要客户根据实际的应用来进行选择。对于实时性要求高的数据,可以像前面一样使用MPU配置成透写的方式,或者将数据放到DTCM RAM中。另外,在本文中只用MPU配置了FMC映射的部分存储区域。在实际使用中,应该对所有用到的存储空间(比如Flash, SRAM区)的属性根据实际情况进行配置,以免引起其他的问题。详情请参考AN4838.8 O; _$ U2 F" G3 E+ Q3 Q

$ e; O+ a8 ~* S# ]9 J: e% u* Z/ l6 g7 E; V/ _" w4 c
文档下载1>>         文档下载2>>       更多实战经验>>    9 h* `1 u0 c& c$ y4 A
- U7 Q: @/ U; b' N" g0 M
收藏 1 评论1 发布时间:2017-11-7 15:15

举报

1个回答
creep 回答时间:2017-11-7 15:50:38
都用上H7做项目了。

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版