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

STM32L5 入门课程系列(四) STM32CubeMX:支撑TZ应用

[复制链接]
gaosmile 发布时间:2020-5-27 17:47

STM32L5 入门课程系列(四)

STM32CubeMX:支撑TZ应用


$ g3 B3 t& J5 |

STM32L5入门课程(二) STM32L5的系统新架构

STM32L5入门课程(三) TrustZone环境下新的用户编程模型

0 g: j$ R1 s; x& A9 E/ ?

欢迎大家继续关注STM32L5入门课程(四):STM32CubeMX:支撑TZ应用。


7 b5 j8 u  {; E9 L

上一期,我们从STM32CubeL5固件包中,一个预先编译好的gpio toggle例程入手,使用STM32CubeProgrammer设置芯片的初始选项字节状态,具体来说就是flash的安全区域划分,然后使用IAR下载并单步调试这个Trustzone例程,从安全世界启动运行,系统初始化完毕和安全策略配置完成后,跳转到非安全世界运行。在非安全世界,CPU调用安全世界通过secure_nsclib.o暴露出来的接口函数,把用户应用环境下的fault和error处理回调函数给注册到安全世界里对应的SecureFault_ISR和GTZC_IRQ。因为在gpio toggle这里例子,所有中断和异常处理,都是用的默认配置,即target在安全世界的。所以当异常或者中断发生时,内核是去执行安全世界里中断向量表中的处理函数。而这个时候,需要做什么处理,实际是和用户应用紧耦合的。所以,才要在非安全应用中,去注册用户需要的异常和错误处理函数,到安全世界的ISR中。


$ \! C% @) b/ }# i7 |

在IAR的单步调试过程中,我们还体会到了,在项目从启动,到运行不同配置的每个环节,随着SAU配置生效,随着SRAM配置自身安全区域的生效,内核从不同视角/或者说从不同别名区,去看同一个物理地址,看到的内容是不一样的。这正是TrustZone应用和传统STM32应用,在学习过程中,调试的时候碰到的最大不同体验。


) ~. S  Q& b& y3 U2 r

这一期,我们设计一个小例程,通过它,尽可能多地用到前两节理论课介绍的和TrustZone安全应用有关的知识;并且,我们使用STM32CubeMX,从无到有的来创建项目,更贴近实际项目开发的过程。这也是我们STM32Cube生态系统,体现STM32平台差异化的一大利器。


- z9 L! u" ^) b' v9 v" ]. B. J1 K+ ^


. P5 o% _# g/ ~

: \3 ~+ h3 P8 M( d6 F( i


9 g, A4 J" C! v# o# ?

Demo的功能

6 G2 t4 [0 |6 ?" u  `0 h


3 L  r* \5 \2 k) |) z

这个小例子仍然跑在Nucleo-L5板子上。板子上有两个用户LED,分别由PC7控制黄色LED灯,PB7控制蓝色LED灯。我们让PC7工作在安全世界,PB7工作在非安全世界。
, k" H1 J& |5 D2 q- s


% u# `8 Q# A9 g

板子上有一个蓝色的用户按钮,由PC13控制。按下按钮,系统可以检测到,并可通过EXTI13产生外部输入中断。EXTI13中断,默认是target到安全世界的,即:当检测到用户按下按键,系统会去取安全世界里的中断向量表中EXTI13这个entry里的地址,跳转到那里去执行相应ISR。如果EXTI13中断被配置成target到非安全世界了,当检测到用户按下按键,系统会去取非安全世界里的中断向量表中EXTI13这个entry里的地址,跳转到那里去执行相应ISR。我们让在安全世界的EXTI13 ISR和非安全世界的EXTI13 ISR都执行一样的代码,翻转黄色LED和蓝色LED灯。我们可以想象,由于黄色LED灯,是由工作在安全世界的PC7控制的,那么在非安全世界执行时,是操作不了PC7的。就是说,在EXTI13的安全中断处理函数中,我们可以看到两个灯翻转;而在EXTI13的非安全中断处理函数中,虽然代码是写的一样,但是只能看到一个灯的翻转。


5 L0 p! t2 j, N

那么我们何时把EXTI13 retarget到非安全世界呢?Nucleo-L5板子上有一个虚拟串口,是由PG7和PG8通过LPUART1,和板载调试器stlink通信,然后通过stlink的USB转串口功能,和PC上位机的串口工具通信。我们可以使用它作为人机交互接口。


( F, w! x$ ]$ b) J, M* c# C" Y( u

通常这样的功能是工作在非安全世界的。我们使用LPUART1打印log信息,并接收用户的串口输入。我们输入1,就把EXTI13 target到NS世界;输入0,就把EXTI13 target到S世界。控制中断target到S还是NS世界,是通过内核寄存器NVIC完成,这个寄存器需要内核在安全状态才能操作。因此我们的LPUART1在非安全世界工作时,需要调整当前EXTI13 target的状态时,要调用Secure世界的API来完成配置。也就是说,我们需要在安全世界来根据用户输入参数进行设置NVIC,然后这个操作以Secure API的形式,暴露给非安全世界去调用。

4 z$ X" u* Y: W; c9 F& ?

$ X! L# T5 U/ m  M" B

/ Z8 m6 F4 z$ K$ b

. i' R' M$ p& a$ H1 ~2 `

知识回顾


2 V! d& C/ \4 x3 V$ ?  d


# X' |3 T7 d; [" g7 a0 ~% l( D

以上这样的demo设计,我们可以体会trustzone下对访问权限的管理。安全世界的代码,可以访问安全和非安全外设。所以会看到EXTI13的安全世界中断处理函数,可以自由翻转2个LED灯,虽然其中一个是由非安全世界的引脚控制的。而非安全世界的代码,不能访问安全世界的外设,所以我们会看到EXTI13的非安全世界中断处理函数,只能翻转其中一个LED灯,并且非安全世界的代码要对EXTI13的taget目标重新配置时,是不能直接在非安全世界完成的,需要通过secure gate进入到安全世界才能执行。这个概念和具体的代码执行,在前面三节课都有提到。


  z0 m/ v0 i3 D+ t5 F) R

除了GPIO的外设,包括这里的LPUART默认都是处于非安全世界;而所有gpio引脚都是默认工作在非安全世界。因此,如果不做任何配置,完全按照复位默认的样子,我们的串口是工作不起来的。这个规则在第四节课的9和11页有介绍,忘了的同学可以回看一下。


. U: F) T/ D' f  M' D" q1 e

4 @1 E* D$ @( Q+ k% [

4 m, a8 G3 [4 P7 h( b! r8 {9 u. w

) i1 U5 H' ^, l

Trustzone应用下,NVIC的最大的两个改变之一,就是有些系统异常,和全部用户中断,都可以自由配置,是target到安全世界,还是非安全世界。这个概念也在第三节和第四节课介绍过。

+ D% Y  \8 T. T

最后,这个小例子对存储区的划分,和STM32CubeL5软件包里大多数简单例程一样,都是:512K flash,对半分。前一半是安全的,后一半是非安全的。注意这里说得安全和不安全,不是从CPU看出来的安全、不安全;是flash本身作为TZ-aware的外设,给自己区域做的规划。SRAM1有192K,也是对半分,前面96K是安全的,后面96K不安全;SRAM2整个64K,都是不安全的。SRAM虽然不是TZ-aware的外设,但是GTZC作为芯片上,内核外的隔离总管,它挡在SRAM之前,替SRAM判断过来的寻址在SRAM上的transaction是否合法,合法的transaction会被放行,得以顺利访问到SRAM;不合法的transaction直接被GTZC给block掉。


0 v( L9 M5 `" a0 c2 S; \# W$ I

9 u$ n- l& y6 y, z. b. [% u- {2 c+ j

$ X  a$ l& \2 \, D" D

1 `' @  u( Y# N& {) i

操作步骤

1 a' O- d$ b- k6 E$ H) g. u7 x* _


9 L) y) [$ u/ N8 r% C


4 v6 `3 a( V, M

& M8 G5 B+ d; @

6 C2 ^' G0 I7 e7 |

9 t- g6 D! W' C9 w" A# v: `  L

现在,我们打开STM32CubeMX来生成初始的项目框架,通过CubeMX在图形界面中做初始配置。


# D# C4 Q% ~# B9 [. F! q6 F$ g6 C

, J! G( |$ V' M1 d! V( x6 d


4 O; [6 \% I3 e" [5 t% n7 {

2 N+ ^- d$ I5 N. p; G' E2 o


1 e# ?2 y- i& _1 [+ Z' ^; Z; v

0 o. E9 Z4 X* u1 d1 h6 ~3 F


4 T( X7 w5 D9 r6 x) S8 Q( |

, `5 @( [' m6 Q- P9 D* M' p

0 \# \- b0 _7 l' q

* o: L* q4 Q0 s7 J8 g

8 [, P+ Y3 V* t- W3 x) |4 H' Z. w


  y& E0 \& f9 @/ J4 T

4 h! \0 P/ |" U4 A+ S


( A5 i. R$ H; d7 ?( F  h+ b' V


1 K7 d. P) D9 j+ q7 N# `

5 N- M6 _1 x  p


) y* E$ B9 w) U; L0 M; a# h


* V( J8 |% f4 z4 y: E3 R* G' n


8 ^# B* ^1 V1 t2 ^

3 _( X5 T# T! {' `! @+ g& `


8 P5 G5 y% V( e1 I7 S, l


3 m1 ]/ k' ^: J2 z% d% w1 Y, J( P9 H5 ?

生成初始化项目,下载,运行

断点打在secure的it.c中的EXTI13_ISR,按下蓝色用户按键,程序可以在此停下来


$ c( m1 f$ o( O, z+ ?8 X9 t


3 e1 X' V7 H9 w0 t# u: y  a


0 H7 {+ H5 Y8 Z2 f0 t1 L! K


( i# g* |" W2 B+ y$ ]; q+ h


$ z8 ?9 [1 ^3 G

5 C  M  N0 B5 W1 F

9 W0 J6 r' Z0 S1 m% Y9 B" j; G
收藏 1 评论4 发布时间:2020-5-27 17:47

举报

4个回答
李康1202 回答时间:2020-5-28 08:46:08
谢谢分享
Logan 回答时间:2020-10-5 16:42:35
下载进去有问题,不能运行?跑不到外部中断13函数?是什么情况
Logan 回答时间:2020-10-5 16:48:41
贴上附件,不知道是不是配置有问题?希望楼主帮看看

GPIO_EXTI_LPUART.zip

下载

2.39 KB, 下载次数: 0

Logan 回答时间:2020-10-10 12:55:33
生成同样的工程Keil5为什么不能运行?
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版