STM32WB55 与众不同,除了集成无线功能以外,它还是少有的一颗双核的MCU. 双核的好处大家都想得出不少,不过MCU使用双核多核的并不常见。STM32WB55 在此多加了一个 Cortex-m0+ CPU的用意,显然在于分担无线部分的工作,让 Cortex-m4 的主CPU的计算能力集中在应用上。今年处玩过NXP Rapid-IoT Kit, 它用了两颗MCU,其中一颗是
无线专用的;那两颗MCU之间通过SPI接口进行交互。STM32WB55 在一颗MCU上集成两个核,信息交互和资源共享就要顺畅得多。
从参考手册中总线矩阵的图大致看一下是这样:两个CPU是平级的,可以访问公用的SRAM等其它片上资源。
不过我也留意到这两个CPU的总线连接并不完全一样,比如 AHB5 总线只有 CPU2 (M0+核)能访问,但 CPU2 又不能访问 QSPI. 这款的Flash和其它M4的STM32不同之处是它有三个总线端口,CPU2 另外独占一个。在对 STM32WB55 的介绍中,对所含 M0+ 这个CPU的描述是为实时处理无线协议层的“专用”的CPU。由此推断,M4 的CPU不能用来单独包揽所有的事情,和硬件打交道的活它还干不了——访问被限制了。片上的一些无线相关设备是属于 CPU2 的私有总线的,这一点可以从手册中找到线索。手册还提到这里一个特点是
异步总线操作,也就是说这部分设备单独用自己的处理时钟工作,可以和系统 CPU 频率无关。
既然除了无线部分的硬件外,CPU1 和 CPU2 都可以使用总线上的资源,它们对总线的争用就要交给总线仲裁器去处理了。好在这个总线结构挺复杂,只要两个CPU的代码和数据不在同一块 SRAM 上存取,应该影响不大。Flash是带有加速器的,可以两个CPU同时运行程序,基本不相干扰。
在我印象中,STM32的Cortex-m0/m3/m4系列里面,CPU和SRAM、FLASH都是以同一频率运行的,CPU存取SRAM总是无等待。在读 WB55 文档的时候,发现加了一个核引起的差异真不少。不仅两个 CPU 可以不同频率,连 CPU 和内存的频率也可以不一样,见时钟树图:
从基础的 SYSCLK 频率分频出来,可以有不同分频系数派生的 HCLK1, HCLK2, HCLK4. 其中 HCLK2 是 CPU2 单独使用的,最高限制32MHz. HCLK1 是 CPU1 和 SRAM1 以及 AHB1/2/3 上众多设备使用,但 SRAM2 和 Flash 却在用 HCLK4 时钟。我还不清楚如果 CPU 频率比 SRAM 频率高或者低会怎样。APB1 和 APB2 是接在 AHB1 上的,所以 PCLK1, PCLK2 时钟要从 HCLK1 分频出来。至于 HCLK5, 上面提到过了,它是与 HCLK1/2/4 异步的所以频率没有相关性。我猜想是可以从功耗优化角度出发,让不同的 CPU、内存运行在不同的频率。
再看看中断系统。因为每个ARM Cortex-m系的核都包含了NVIC中断控制器,所以两个CPU的中断响应是各自独立的,各有各的中断向量表、中断优先级等等。从下面这个图可以了解个大概:片上硬件有的是可以同时作为 CPU1 和 CPU2 的中断源的,有的则只能被其中一个CPU用作中断源。在这其中还有一类情况,是中断先经过 SYSCFG 中的 CxIMRn 屏蔽寄存器屏蔽,再接到 CPUx 的 NVIC. 也就是说中间还多了一级屏蔽。
为何多此一举呢?我猜测主要原因是 CPU2 的IRQ号不够多,于是在一个IRQ上对应了多个中断源,需要详细的配置屏蔽。不能在设备上直接屏蔽中断,是因为这个中断又可能被 CPU1 用到了,于是需要加一级屏蔽机制。例如:
还有一种特殊的中断来辅助两个CPU协同工作,用于CPU之间的执行同步——来自 IPCC 与 HSEM 两个片上设备的中断。IPCC是处理器之间的通信控制器,HSEM是硬件信号灯。就好像操作系统管理下的任务用队列来传送消息、用信号灯来等待资源一样,两个CPU也需要在某些时候交替工作,相互唤醒。WB55 里面这两个硬件就起到 CPU 之间相互等待、唤醒的功能。
双核的存在也使低功耗模式变得更加复杂了,从下面这个图可见一斑。只要有一个 CPU 是活动或SLEEP的,支持它的总线(时钟)也就得是活动的,那么整个MCU就不能降到很低功耗的状态去。所以前面提到,分开来 HCLK1/2/4 这几个时钟,就为了让活动的总线变少,也降低了一部分功耗。整个MCU要进入STOP模式,必须CPU1, CPU2 都处于STOP模式。
此内容由EEWORLD论坛网友cruelfox原创,如需转载或用于商业用途需征得作者同意并注明出处