我们先来看一个STM32CubeL5固件包里预编译好的例子。这个例子是基于TZ环境下,因此有安全应用和非安全应用两个工程。安全世界里定义了三个数组,是下图右边的绿框部分;非安全世界定义了两个数组,是下图左边红框部分。例程使用了4个DMA通道,来对数据进行依次搬移,形成了一个数据流的链路,把5个数组挨个串了起来。
绿框表示的安全世界数组,都在安全存储区上,因此要能碰到这些地方的DMA通道,必须是安全通道。所以CH1、CH2、CH3都是安全通道。CH4负责非安全世界里的两个数组间的数据搬移,非安全通道即可。我们来看表格的前三行,CH1、CH2‘和CH3,它们都是安全通道,但是各自的Ssec和Dsec并不相同。
通道1,负责安全世界里两个数组间的搬移,Ssec和Dsec都是1,发起的是安全transaction。
通道2和通道3,负责安全存储区和非安全存储区之间的数据搬移,方向不一样而已。片上Flash和片上SRAM,在缺省模式下,是严格遵循TZ访问规则,即安全的地址只能被secure transaction触碰,非安全的地址只能被non secure transaction触碰。所以通道2和通道3的SSec和DSec,必须做相同安全属性的配置。‘
那么我们现在就来看一下STM32CubeL5软件包里基于Nucleo板子上的一个现现成的例子,在TrustZone环境下使用DMA做存储区之间的数据搬移。主要就是看看,在安全世界和非安全世界之间,如何使用DMA做数据搬移,在安全性方面要注意哪些问题。我们会着重考察例程里的通道2和通道3。
基于刚才这个参考例程,如果我们把通道2的一个参数:DSEC从Non secure改到Secure会怎样?
我们知道,通道2负载把安全世界里的数据搬移到非安全世界。它的下半场,write transaction,要触碰到非安全世界的SRAM,这个aDST_Buffer1是在非安全应用的堆栈空间,因此是位于片上SRAM的非安全区域。按照我们多次强调的,非安全SRAM区域只能被非安全transaction触碰。那么预测通道2的传输不会成功。我们把代码修改一下,运行一下看看。
那么第二个问题来了,如果DSEC就是设置成secure的情况下,怎能让这次DMA传输成功完成呢?我们来看看STM32L5 参考手册上的这一段话。它位于GTZC这一章的illegal access definition,非法访问的定义,这个章节里。
我们再看来看另外一个TrustZone环境下的DMA使用例程。
这里不再是M2M传输,而是更贴近实际应用的一个场景。通常加解密模块,Hash模块这些和密码学操作相关的硬件我们都把它们分配在安全世界,使得只有安全世界的代码才可以直接访问,利用TrustZone的先天具有的“硬件隔离”机制,对敏感的模块进行保护。而用户的业务应用通常运行在非安全世界。当需要对非安全世界的一段话或者一个消息进行Hash计算,就需要把这个非安全区域的消息,一个word一个word地送到Hash模块的DIN寄存器
。计算完成后,摘要值从Hash模块的HR寄存器组读出。非安全世界的应用,要启动一次填充Hash模块输入FIFO的DMA传输,必须也调用Secure API。例子里使用DMA2控制器的通道7来负责搬移。那么它的上半程,读操作应该是一个non secure的transaction,所以SSEC为非安全;而后半程的写操作,必须是一个secure的transaction。
了解了例程的用途,我们来看一下代码实现时需要的注意事项。
最后我们看一下DMAMUX。
DMA控制器负责在它的各个通道上进行数据传输,而提出传输请求这件事是由另外一个模块DMAMUX负责的。从胶片中的功能框图,可以看到DMAMUX的主体是右边的Request multiplexer,请求复用开关。这里面有16个独立的通道,分别连到DMA1和DMA2的对应输入通道。DMAMUX也是TZ aware的外设,和DMA控制器一样,每条通道要么被分配在安全世界,要么被分配到非安全世界。DMAMUX里通道的安全属性,由对应的DMA通道来决定。
DMAMUX每条通道的请求多路复用开关,它的输入有94条线可供选择。其中,90条来自外设事件,比如ADC,4条来自内部请求产生器。而内部产生器的触发输入又有22条,覆盖16条EXTI信号线、DMAMUX模块本身产生的事件,以及三个LPTIM的输出。这23条信号,位于框图的左下角,和框图左边90条外设信号,对于DMA传输请求复用开关的意义都是一样的,来自这些源头的事件,可以触发一次DMA主导的数据搬移。这23条信号线,还可以用来同步DMA传输请求的输出。
这些参数都可以在STM32CubeMX的图形界面中配置。需要强调,用户容易搞混淆的有一点:DMA传输的请求信号来源,和DMA请求传输的源地址和目的地址,是完全独立的。比如说我可以在在外部中断EXTI13的触发下,让DMA把数据从ADC1搬移到SRAM的数组里。这种使用场景,外部中断EXTI13就是DMA请求的信号源,需要DMAMUX来配置。而ADC1的DR数据寄存器和SRAM数组的地址,则是在DMA控制器对应通道的通道寄存器里配置。这些概念和使用方法和以往不带TrustZone安全特性的STM32 DMA和DMAMUX是一样的,这里不再累述。
关于STM32L5上DMA在TZ环境下的特点和使用注意事项,这一集就讲解完毕。
同步模式下,检测到了同步信号的边沿时,若有pending的request就会N次导到输出;
如果那个时刻,没有pending的request,后面来的request,不予理会,这个新的request,要到下次同步信号边沿到来时才处理;
同步模式下,没有检测到同步信号的边沿,即使有DMA请求输入,也不会导到输出
非同步模式下,有DMA请求就导到输出,只是每N次就会有一个事件产生
同步信号会可能产生overrun错误及中断;触发信号也可能产生overrun错误及中断;
由于DMAMUX按照通道来划分S和NS的资源,因此像状态寄存器、标志清零寄存器中,还有S和NS的位域混合在一起。
安全通道上的overrun 中断和非安全通道上的overrun中断,在NVIC输入上是两条不同的input line;在向量表中也是两个相邻的entry
|