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

B-U585I-IOT02A--4.TrustZone点灯

[复制链接]
奇迹 发布时间:2021-10-14 18:15
首先需要使用STM32CubeProgrammer软件对芯片的模式进行配置。! f3 `: E4 a1 N3 ]  b$ _9 x& r
QQ截图20211009140413.png   s  r: z# e$ u/ U; {
连接上芯片后,选择OB选型卡,找到User Configuration2 y9 S  }; d7 w  @
9 N9 q3 b7 n3 _* x3 t& w
将其中的TZEN选项打上对号,使用Apply写入到芯片。
' R8 A+ d: v) w' W QQ截图20211009122748.png
! P* c$ T7 B5 S  j. p2 ?2 C: c: J
+ s, v8 I  E, W* N+ }* t如图所示配置Secure Area 1与Secure Area 2选项,使用Apply写入到芯片。: a+ r: K1 s% A4 w9 c! J, |5 K
QQ截图20211009130918.png
- A7 o2 ^7 A/ D0 Q  B% _" b7 F/ H! F. v5 N! C" r6 }' B6 H
打开STM32CubeMX,找到STM32U585AI,这一次就要选择第二项开启TrustZone了。
  X: j/ ^' }$ P( ]+ _* z, y QQ截图20211009123049.png & E* K  n$ `6 q, m

: @1 X. e& D0 V# q4 f$ U看看新的外设界面,嗯,与之前大大不同啊。
- u, K: ~% H2 U3 }# G+ {2 s QQ截图20211009123436.png 7 S; X1 ?6 i+ F. U( `

' Y9 s6 P5 Y% V2 L  K$ N简单配一下时钟。$ D+ I  K$ c4 B
QQ截图20211009144914.png
% `8 Q3 E2 k" e9 o4 k  B- C" p% h& _9 E0 A3 N  E
配一下SWD,这里就让他使用安全区域那边的初始化。
" a# K. t+ I7 T* O QQ截图20211009123445.png ; ]+ n7 k1 ~$ l2 y$ x: y
8 c% D0 E) `4 R) D) X2 `; [
配一下IO,就是板子上的两个小灯,一个配置到安全区域、一个配置到非安全区域。
, j9 P& S+ I3 B0 w QQ截图20211009123622.png
0 C% _* n) \2 b5 n" K; I. q( q3 V8 }, h
生成代码,打开keil,嚯,两个工程啊(工程之间的区别以后再聊)。2 d/ s# `; U+ s) R8 s7 j: c
QQ截图20211009123724.png : R/ f& L' h( g, Y$ F4 n) ]

2 b/ o, X* P# {- L2 C右键可以切换选中工程。% z' u0 c6 n! B; E+ T6 h( I( G3 B: v
QQ截图20211009145205.png
! ?* a* u" K5 k3 X
% ]+ x% |( @7 Z看看代码. T0 l; d0 t1 Q
安全区域的GPIO初始化5 T2 H6 ^6 r9 @: l
  1. void MX_GPIO_Init(void)
    6 c2 }2 r# ^) {; W0 _; f4 D3 r* N
  2. {
    8 s+ y$ r8 }2 _+ }
  3. * J8 V" Z/ s: i8 z7 {
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};: B9 Y+ s, c: j; f) x0 l( w: v
  5. 0 {( W2 j! K1 L% j# E  |- O
  6.   /* GPIO Ports Clock Enable */" Q4 C; N; p: c
  7.   __HAL_RCC_GPIOA_CLK_ENABLE();
    & N- j0 N; H9 `: y/ F! ~( y$ N8 x
  8.   __HAL_RCC_GPIOH_CLK_ENABLE();0 _* k9 d: P$ Z/ T% M+ C$ Z

  9. # a* U* ~, Y, `. m% A
  10.   /*Configure GPIO pin Output Level */) p4 A. g) J3 \1 |; }" X- I* Z0 ^) e
  11.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_RESET);
    # Z% C( X$ F+ z5 N6 m
  12. ; [0 R/ b% ]) `5 i; t7 ?
  13.   /*IO attributes management functions */
    2 @- l- i2 Z) x/ K2 E8 E- ?' A: g
  14.   HAL_GPIO_ConfigPinAttributes(GPIOH, GPIO_PIN_6, GPIO_PIN_NSEC);$ i" k( ^+ N: T! Q7 B" J) k
  15. % b& H' i! K8 b
  16.   /*Configure GPIO pin : PH7 */
    $ F; b$ s, N8 ^" O, ^5 v1 C' [1 Q
  17.   GPIO_InitStruct.Pin = GPIO_PIN_7;
      J2 P2 L! n- \* q
  18.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;! b/ J  s$ \5 v, z
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    2 v: ], R6 N4 I) g! N
  20.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    " Z& a) K& H& y! u# \6 p
  21.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
    ) U5 k' b5 w* y6 s7 Y1 E
  22. ' ?0 z" {6 Z5 d8 L, W& k
  23. }
复制代码
1 |; [" E, n) X% H
非安全区域的GPIO初始化
, h6 U$ b- Z! H' E# X6 y
  1. void MX_GPIO_Init(void)
    ; M; F9 z/ v3 F: r: [- t6 L+ f& k
  2. {+ O) |8 j: L0 L  {
  3. & y4 R0 n' ^; ?  J# X
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};3 H: }; ^* }+ a: W- y& `
  5. & X& K0 Q1 m4 c; w4 Z4 n/ ]- _
  6.   /* GPIO Ports Clock Enable */4 [4 r" v) N  b' j& x' I9 @; O0 N! i
  7.   __HAL_RCC_GPIOH_CLK_ENABLE();/ k! ?- z8 M  L4 _- w" f( O. V

  8. " z/ A. p$ ^' ~" K; T2 x0 m
  9.   /*Configure GPIO pin Output Level */
    0 n; Z( f2 ~: w
  10.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_6, GPIO_PIN_RESET);9 z5 ]8 v$ [! E" s3 m5 `
  11. 4 s3 Q. N, d- u5 P: K
  12.   /*Configure GPIO pin : PH6 */
    4 q/ h) v9 f# m6 _, c. o& x
  13.   GPIO_InitStruct.Pin = GPIO_PIN_6;
    8 \, P! [8 X: F( e* W
  14.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;+ j$ U5 F3 E, A( `: Q/ g$ i' l- z+ n
  15.   GPIO_InitStruct.Pull = GPIO_NOPULL;7 e( k7 a# r2 w& I6 [& C" {
  16.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;4 [. q" D3 _/ a8 j% t  X
  17.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
    3 g" R& k: B' @1 N2 K
  18.   }6 R5 }% x% m) z! \# t( j- S
  19. }
复制代码

/ n, J) Q# _) T# o8 Q) ~区分还是很明显的。: N/ L0 z. {3 r4 E. v

, C6 Z2 ^" B6 C$ l5 I. e接下来写写代码看看# S. |0 K7 F, C# |- R
安全区域6 L/ u& ?1 ]# M, W4 B7 n  D
  1. while (1)
    # A# M: p. \% b! s* L( @, J
  2.   {
    " n: z6 y! X8 q" W+ p7 y
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_7);) A3 i+ H4 U5 V! G$ _, N3 M. v6 G2 r
  4.     HAL_Delay(1000);2 o# H" m! s% Z% r$ r- A3 [3 u
  5.     /* USER CODE END WHILE */
    ' c8 E# x0 A  a; D* B9 b

  6. 0 b4 w( t, s+ D5 W* ?
  7.     /* USER CODE BEGIN 3 */; h# y- O. D; a3 H) P
  8.   }
复制代码
, z: L5 X! I3 `3 z! J  X' K! s; @0 l
非安全区域
: o% W8 ^7 U3 p
  1. while (1)
    ! o& c9 e3 n6 N/ |0 I
  2.   {$ p; h1 z9 K) z* w, P- a
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_6);
    - C0 u: k7 v+ t) y9 k* g, g- V
  4.     HAL_Delay(1000);0 z& \" t1 l+ r' S  N# T; T
  5.     /* USER CODE END WHILE */
    0 ?8 t) N3 E4 D7 i4 ^- D8 E5 |
  6. ! _) M  b8 {% e: O4 @; H* Q
  7.     /* USER CODE BEGIN 3 */2 I8 y5 @8 v' W) k$ I1 i0 G. o6 ^
  8.   }
复制代码
; @% t0 {1 c  c& V5 i- k* K! G8 ?
写了两个闪灯的程序,各自是各自的。看看会发生什么。把两个代码都下载到芯片内部。- m; O6 j: U* |2 e
9 @6 p6 B  M: P0 w/ |3 }
结果是,非安全区的代码while(1)里面的代码正常执行,而安全区while(1)里面的代码没有正常执行。板卡红灯闪烁,而绿灯常亮(图片看不太出来)。* a5 v  ^3 O2 i9 w- ^* M/ Z# {
IMG_20211009_145539.jpg . m( p7 F! F- e% F, R! _8 p
原因也很简单,安全区代码是上电之后优先执行的,然后运行到NonSecure_Init,把非安全区堆栈初始化好,然后调用非安全区的复位函数(具体调用方式与逻辑请关注后续文章)。然后代码就跳转到非安全区了。
: n% ?' r$ C3 x! O  g1 e% |; h4 J/ c1 Y. t4 t
也就是说,两套代码,并不是真两个核,内部还是只有一个内核滴。
" V: q0 W' r: Q6 Z
6 r1 n* T1 r6 g# u3 p
收藏 1 评论16 发布时间:2021-10-14 18:15

举报

16个回答
奇迹 回答时间:2021-10-20 18:03:40
不咸不要钱 发表于 2021-10-20 10:49
: u6 f1 y, J  b1 k4 ]+ W- Q5 l' kM33就是两个核啊,可以仿真以下看看为啥只有一个灯闪

5 @9 W+ v) n$ Z: [6 G7 e& q你有测试过吗?M33只是为了安全在NVIC、MPU、SYSTICK等资源提供了双份,本身控制还在在切换安全区与非安全区运行实现的。核心资源只会提供一份的。
; p! d$ a. R+ O
- E  T: h: e2 U# d5 `- \4 A
不咸不要钱 回答时间:2021-11-9 11:20:26

奇迹 发表于 2021-10-20 18:03
你有测试过吗?M33只是为了安全在NVIC、MPU、SYSTICK等资源提供了双份,本身控制还在在切换安全区与非安 ...

用过NXP的LPC55S69 里面有两个M33 ,理解错了

奇迹 回答时间:2021-11-11 17:56:52

不咸不要钱 发表于 2021-11-9 11:20</p>
<p>用过NXP的LPC55S69 里面有两个M33 ,理解错了

[md]嗯嗯,你说的这一颗芯片比较特殊,他虽然是双核M33,不过仅有第一个核是支持TrustZone的

不咸不要钱 回答时间:2021-10-20 10:49:07
M33就是两个核啊,可以仿真以下看看为啥只有一个灯闪
# O+ S  n/ K7 B$ I
liuxingkeji 回答时间:2021-10-27 10:12:50
不错3 N/ W# Z3 V# M( K
子曰好人2号 回答时间:2021-10-27 10:13:32
这里不太懂,安全区的代码为什么没执行
* a# W9 W0 ~& Q4 ~+ @. u% f
joshua天宇 回答时间:2021-10-27 10:24:32
不错,学习( w9 T, H4 b  L/ t1 n, G
wudianjun2001 回答时间:2021-10-27 10:25:16
绝对666666               & A. i- z6 n$ J# T5 K( Y( B" A
zhangt0713 回答时间:2021-10-27 10:35:12
谢谢分享4 `  a5 z) M* q3 K7 U: V
QIANYING79 回答时间:2021-10-27 14:30:05
有意思,学习了- a, A" ]9 W; {* R
moluxiyan 回答时间:2021-10-27 16:17:02
安全区的代码为什么没执行,得看下回分解了0 J4 ?3 _. L. @1 N/ p! `

' z* Z7 U3 l5 ?" C7 _' s
orima 回答时间:2021-10-27 21:57:07
要动手操作一遍才行。。。
1 R$ ^3 f, B1 K- F
qiangtech 回答时间:2021-10-28 09:48:32
一个时间还是只能运行一个程序的,谢谢分享。: C1 l2 Q/ u& V, J
VegardCheng 回答时间:2021-10-28 22:30:46
不是很理解两个区域是怎样运行的
2 o6 x3 K) n: [
BEEE 回答时间:2021-10-28 23:45:09
想赶快使用ST新推出这款STM32U5系列产品,学习学习9 s+ r1 ?- N7 i9 |: \% B

  P& ?( l% `  Q* j. _
朱贵和 回答时间:2021-10-30 09:47:34
绝对666666   

" P& |' W7 V& }2 V$ |- P
12下一页

所属标签

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