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

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

[复制链接]
奇迹 发布时间:2021-10-14 18:15
首先需要使用STM32CubeProgrammer软件对芯片的模式进行配置。
: Z' H  o% H: C0 u8 A* g! r QQ截图20211009140413.png % A( M" n- K/ {7 i
连接上芯片后,选择OB选型卡,找到User Configuration
* _# U4 X- J8 i
3 f& n- F8 }6 I+ j  ^将其中的TZEN选项打上对号,使用Apply写入到芯片。
9 M- g" U! r% X QQ截图20211009122748.png
, b+ P: p6 l: J# ?9 P6 t7 Y+ F1 P# O6 d4 Y
如图所示配置Secure Area 1与Secure Area 2选项,使用Apply写入到芯片。. ~& w3 N/ I  L2 W) u
QQ截图20211009130918.png
* A! _: f4 ^/ x2 c) J! R2 h/ B/ l' F# }5 P$ B. B$ H9 `  J3 M* Y
打开STM32CubeMX,找到STM32U585AI,这一次就要选择第二项开启TrustZone了。
& W$ G& d- c3 y% s1 B QQ截图20211009123049.png
5 J& ~, G. Q# O7 \+ C1 u
7 z6 x. A' B8 L$ f2 i8 U看看新的外设界面,嗯,与之前大大不同啊。$ v6 r! n# i7 U% {, l
QQ截图20211009123436.png
( C, Z, J! Y& B8 J7 g  v( A3 a2 o$ K
4 U* Y8 P) J1 I! C" C简单配一下时钟。* k1 e6 P) r6 P8 @2 I6 z
QQ截图20211009144914.png 2 @4 V' Z3 i/ w7 q
+ \( Y* U6 @% K; n4 w
配一下SWD,这里就让他使用安全区域那边的初始化。
# y* ^0 [& A! e6 i QQ截图20211009123445.png # N: F, E, o8 o2 Q0 M" y) z! c

2 A) J! B; F! s- n配一下IO,就是板子上的两个小灯,一个配置到安全区域、一个配置到非安全区域。; G! ~  }* z; V. v# d
QQ截图20211009123622.png ' R$ p* o3 r% R
4 @$ z9 I9 n$ A$ v" F7 ~8 R3 y
生成代码,打开keil,嚯,两个工程啊(工程之间的区别以后再聊)。
' q/ W2 ^5 g/ C. m4 u QQ截图20211009123724.png ; x# ?$ h# ~: q5 l

! L5 [: W! S0 u: k* ~3 A. l& f右键可以切换选中工程。
: S& H+ z7 E7 p8 l! E. o QQ截图20211009145205.png
3 a3 w1 k) j, u. M( ]: u: ~: l1 `3 A
看看代码
0 k! m0 F& W% g6 M6 q" E0 [( r安全区域的GPIO初始化
) {7 E4 y, F$ t( _; L6 A
  1. void MX_GPIO_Init(void)4 ~' h) M5 _, N
  2. {6 \  |9 e8 x6 s6 Q* |
  3. 7 K: X3 E* v* q3 ~
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    6 P, W5 b3 ~  m2 h8 k8 r9 T/ c* t
  5. 1 D' L- [9 ?& X9 u  U' c; j
  6.   /* GPIO Ports Clock Enable */- e. n+ y1 S" Y# P3 N
  7.   __HAL_RCC_GPIOA_CLK_ENABLE();
    - m$ `0 n, X) `+ H) `/ l) _1 b2 D
  8.   __HAL_RCC_GPIOH_CLK_ENABLE();
    ' d1 B9 O6 U5 R. R6 i+ q( [0 U
  9. / |% U2 D7 f/ J! \2 F/ f0 @* S
  10.   /*Configure GPIO pin Output Level */. `3 e  e" D9 h  @
  11.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_RESET);& g) r" Q% X8 ]+ i4 Y

  12. ( g, v  j/ t) p5 M7 y- t7 O& f
  13.   /*IO attributes management functions *// K. V( y! ]5 X1 d
  14.   HAL_GPIO_ConfigPinAttributes(GPIOH, GPIO_PIN_6, GPIO_PIN_NSEC);
    1 G1 E5 O/ `; q: x
  15. ; n  Z# G; W; M1 h- K
  16.   /*Configure GPIO pin : PH7 */  E. e1 [$ t) v2 |/ K7 M
  17.   GPIO_InitStruct.Pin = GPIO_PIN_7;
    : A9 |+ j0 D$ P, f; J# m
  18.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;& D, \7 V7 g- A) I1 [4 f: i
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;! I0 c5 L0 E4 p* C: j3 z- K* o
  20.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;' g6 J: y7 ^4 H0 p9 u4 m6 J6 |9 p, k
  21.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
    6 g. U' e( P2 L# A2 s9 j! U
  22. % {' B( g8 S" ~5 U0 F( c
  23. }
复制代码

) u  F8 E. X# }& I非安全区域的GPIO初始化
( d% n+ l1 ^& [
  1. void MX_GPIO_Init(void)
    7 p/ @& G$ Z: o' b
  2. {  T& s/ R) E" {  a; @* L
  3. $ G' I8 Z( @0 v2 j
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    % [" s% J4 e$ V8 m- ~" Q
  5. - l7 t7 a0 X* F- z3 o) f% v
  6.   /* GPIO Ports Clock Enable */
    $ a1 l  y1 `9 f9 l9 N' o" c
  7.   __HAL_RCC_GPIOH_CLK_ENABLE();
    ) |: N( q7 s% A; ~1 {
  8. & L7 z" y# K8 r9 f
  9.   /*Configure GPIO pin Output Level *// W$ Q2 ?3 Q- H
  10.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_6, GPIO_PIN_RESET);+ M8 T6 j3 O+ f
  11. 5 H1 e/ C3 O# Q! ^/ J2 J* p" ?( I
  12.   /*Configure GPIO pin : PH6 */
    ) k9 W3 O9 [9 D' v
  13.   GPIO_InitStruct.Pin = GPIO_PIN_6;5 W! A  J( o0 G% ^6 |' w
  14.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;) p9 e* [9 L% n% p& O8 `" y
  15.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    8 F8 L8 y$ l* r( U, j/ y) o7 O) }
  16.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    5 d  F" B1 Q4 L7 `+ @4 K
  17.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
    # [! v( t4 S% h- E

  18. ; Y. x5 o4 G( f- O
  19. }
复制代码
: t2 _6 o9 x% |1 P% \' R# w
区分还是很明显的。
, K. [- M3 k7 W
' y9 w+ e" g! w& a! N/ H4 ]8 j接下来写写代码看看8 F( h' P3 W8 S+ s9 K
安全区域
; J) |' y5 j6 `7 ?3 X# B8 H& l
  1. while (1)- E0 q" D  W  F- Y
  2.   {9 Z. L  Q1 @9 ]9 Z
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_7);
    % ~8 B3 L( K4 v9 y( D. C
  4.     HAL_Delay(1000);
    7 j+ a9 r  u) ?/ M3 _
  5.     /* USER CODE END WHILE */
    / }0 Z1 t1 `' Y; e  @3 s

  6.   }0 y; ]" u$ ]0 L' Y4 ~
  7.     /* USER CODE BEGIN 3 */+ _  M" c- x* T1 @6 B
  8.   }
复制代码

: S8 o/ N7 e0 A! J: `1 w' F' u' |非安全区域
7 V- n% b4 l# n. P
  1. while (1)
    " a2 {6 A$ t$ e
  2.   {7 w/ b) t4 R( n% y# h, n* Q
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_6);. ^. o$ j1 ?3 a- g3 r# c
  4.     HAL_Delay(1000);" m8 s. }  g  U8 `  x6 C
  5.     /* USER CODE END WHILE */2 k) M# m( N6 ], g' K9 _8 L

  6. % o/ ]/ L9 z: ~& D) \* h: @
  7.     /* USER CODE BEGIN 3 */
    9 b/ m' ~) a2 Q# |% ]2 ?
  8.   }
复制代码
' P( r+ O9 J# n6 A; }4 ]8 E( l: r
写了两个闪灯的程序,各自是各自的。看看会发生什么。把两个代码都下载到芯片内部。1 d  X: G; j2 O3 ?/ p7 r

# x) k0 w9 J# _$ [结果是,非安全区的代码while(1)里面的代码正常执行,而安全区while(1)里面的代码没有正常执行。板卡红灯闪烁,而绿灯常亮(图片看不太出来)。6 j* O/ |' n4 O8 S% J# a
IMG_20211009_145539.jpg
1 {- z5 v3 t5 W* k: p8 `" U2 ~原因也很简单,安全区代码是上电之后优先执行的,然后运行到NonSecure_Init,把非安全区堆栈初始化好,然后调用非安全区的复位函数(具体调用方式与逻辑请关注后续文章)。然后代码就跳转到非安全区了。
7 M- x/ E% }- w6 r/ Q1 v2 @
" B, v2 P; D3 N- H" F也就是说,两套代码,并不是真两个核,内部还是只有一个内核滴。* a8 n3 p& _/ d

  |4 ]" ~6 E+ F4 E8 q
收藏 1 评论16 发布时间:2021-10-14 18:15

举报

16个回答
奇迹 回答时间:2021-10-20 18:03:40
不咸不要钱 发表于 2021-10-20 10:49
4 G+ Q: H0 d8 q5 j" V/ v8 |* Y6 QM33就是两个核啊,可以仿真以下看看为啥只有一个灯闪
1 [1 P1 S( ^0 s9 H" l, f
你有测试过吗?M33只是为了安全在NVIC、MPU、SYSTICK等资源提供了双份,本身控制还在在切换安全区与非安全区运行实现的。核心资源只会提供一份的。
0 w: f* I; M- {2 Z4 @$ m
" ]: g+ X8 b5 I0 h  I  m
不咸不要钱 回答时间: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就是两个核啊,可以仿真以下看看为啥只有一个灯闪
! \" }6 y. u  |$ N/ ?6 X# A
liuxingkeji 回答时间:2021-10-27 10:12:50
不错
, {/ X5 `0 [+ R8 f. Y$ I1 `
子曰好人2号 回答时间:2021-10-27 10:13:32
这里不太懂,安全区的代码为什么没执行
* L- [3 i& b! }7 A& M! [
joshua天宇 回答时间:2021-10-27 10:24:32
不错,学习! V! E* K8 _* j- L1 _
wudianjun2001 回答时间:2021-10-27 10:25:16
绝对666666               
- K- {2 K, x5 v! l8 ^8 ~. V
zhangt0713 回答时间:2021-10-27 10:35:12
谢谢分享
8 R. W" L. y! Q
QIANYING79 回答时间:2021-10-27 14:30:05
有意思,学习了: S$ _5 c! s3 B# B
moluxiyan 回答时间:2021-10-27 16:17:02
安全区的代码为什么没执行,得看下回分解了* `. L+ q( Z; |& w5 F) m: u/ D- M

6 w5 j; G) d  ?# E
orima 回答时间:2021-10-27 21:57:07
要动手操作一遍才行。。。
8 W2 ^9 K; R) g; p4 I
qiangtech 回答时间:2021-10-28 09:48:32
一个时间还是只能运行一个程序的,谢谢分享。- z* K6 Y8 ]8 p: }  p& g
EricCheng 回答时间:2021-10-28 22:30:46
不是很理解两个区域是怎样运行的# e0 Z  X2 B5 b1 [  k/ @, g: h: R
BEEE 回答时间:2021-10-28 23:45:09
想赶快使用ST新推出这款STM32U5系列产品,学习学习0 L  _+ W$ n0 ~* L* p3 B* \8 _

9 j+ g) \, [, d4 J; H
朱贵和 回答时间:2021-10-30 09:47:34
绝对666666   
  C; b- o1 ~1 p7 P
12下一页

所属标签

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