一、有关CCM访问地址的话题
有用过STM32F4系列部分芯片或STM32F334芯片的人,可能知道片内有个CCM【Core Coupled Memory】区域,从芯片系统框图结合文字说明,可以清晰知道这个区域仅能被CPU访问,常用来存放些对执行效率敏感的关键性的代码或数据。也就是说对于这两个系列的CCM区域,DMA是访问不了的。
下面截图分别来自STM32F42X/STM32F43X器件和STM32F334器件的参考手册。
到了STM32G4系列,里面依然也有CCM这个区域。见下面STM32G4系统框架图。
从框架图上看,这个CCM区域不仅可以被CPU访问,也可以被DMA访问。关于它的起始地址也有相关描述:
从上面描述来看,CCM的地址起始于0x1000 0000和SRAM2结尾的地方。至于SRAM2结尾的地址还跟STM32G4具体的子系列或型号有关,见下面截图资料:
那么这两个地址空间怎么用,或者说区别是什么呢?
当为了充分发挥CPU对这块区域的访问效能时就使用0x1000 0000开始的地址空间,此时CPU通过ICode总线访问这个区域。这块地址空间DMA是访问不了的,属CPU专访区。
若希望DMA访问这块物理区域,DMA要通过总线矩阵来访问,所用的空间则是0x20005800或0x20018000(视具体系列而定)开始的一段地址。此时,这个CCM区域在DMA眼里,不过是SRAM2区域延伸出来的一块别名区。当我们试图让DMA访问这个区域时,地址别给错了,不要使用CPU的专用地址,而要给0x20005800或0x20018000开始的地址。
也就是说同一个物理空间,不同的主体通过走不同的地址路线而实现不同的访问、执行性能。这样的设计更具灵活性,以满足五彩斑斓的实际应用需求。就像我们要到达某个地方完成某事,有人走正门,有人走侧门,甚至有人飞檐走壁,各用所便,各尽所能,各取所需。
当然,G4系列的CCM除了上面因访问主体不同采样不同地址空间的灵活特性外,还加强了很多安全特性,比方奇偶校验、读写保护等,有兴趣可以进一步阅读相关参考手册。
二、有关位带操作的话题
有人问起STM32G4系列是否支持位带操作方面的相关话题。
要问STM32某个系列是否支持位带操作,首先得看看相关STM32系列所用ARM内核是否支持位带操作。如果内核本身就不支持位带功能,STM32是不会支持该功能的。反之,如果相关ARM核支持位带操作,基于该核的STM32系列一般都会支持位带操作,而且在相关STM32参考手册里一定会明确说明。【其实,第三方芯片设计者在基于ARM核设计、集成芯片时,对于内核的部分功能或者核外设是有取舍权的。】
具体到STM32G4系列芯片,它属于cortex M4核,该核内置位带功能,STM32G4芯片也集成了该功能,在STM32G4参考手册上也有明确描述。【下图截取于STM32G4参考手册】
这里的位带区特指一段片内SRAM空间和外设寄存器空间。位带区的SRAM里的每一位或外设寄存器的每一位都可以通过访问相应的另外一段地址空间的一个字实现读写操作,这个另外一段地址空间就称之为位带区的别名区。
不过,在STM32参考手册里,针对位带操作的介绍相对比较简单,主要是因为ARM内核相关手册有较为详细的描述。STM32参考手册里主要就如何计算别名区的地址做了个演示,并提示阅读相关ARM 内核手册。
上图截取于STM32G4参考手册RM0440。有人纳闷示例中的0x2200,0000是从哪里来的?翻遍整个G4系列参考手册也不知它怎么冒出来的。其实,这个地址是在Arm cortex M4内核手册里明确的。见下图:
上图来自于Cortex -M4Devices Generic User Guide。
上图清晰了给出两块位带区【SRAM区和外设寄存器区】以及对应的别名区的地址边界和对应关系。图中浅紫色表示位带区,绿色表示别名区。显然,位带区字节地址为0x2000,0000的bit0对应别名区的字地址就是0x2200,0000;位带区字节地址为0x2000,0000的字节的bit1对应别名区的字地址就是0x2200,0004,这样依此类推。
关于位带操作的介绍,除了上面的Memory框图外,在内核手册里还有更多包括地址计算在内的详细介绍。下面三副截图均来自M4内核用户手册。
关于位带操作的介绍就聊到这里,顺便给几点提醒:
1、不是所有STM32系列都支持位带操作,是否支持终究由内核决定;
2、执行位带操作的主体只能是CPU,而不能是别的,比方DMA;
3、位带操作只支持针对数据,而不能针对指令;
上面主要分享了STM32G4系列中有关CCM和Bit Banding应用方面的话题,做了些提醒及分享,以供参考。