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

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

[复制链接]
奇迹 发布时间:2021-10-14 18:15
首先需要使用STM32CubeProgrammer软件对芯片的模式进行配置。4 z4 S, d+ P9 ]2 ~. }
QQ截图20211009140413.png
% ^5 s0 \2 ]! Q连接上芯片后,选择OB选型卡,找到User Configuration7 c1 P& O/ J5 p

/ d% w( _1 Q; R9 r$ B将其中的TZEN选项打上对号,使用Apply写入到芯片。: \6 W+ x! f7 y0 i+ h9 t2 A3 {! Q
QQ截图20211009122748.png 4 M1 I' }+ N& G$ Q' z; U) U8 j
1 R1 C3 @$ b) {
如图所示配置Secure Area 1与Secure Area 2选项,使用Apply写入到芯片。, m/ c$ T, a5 g
QQ截图20211009130918.png
7 ]! k9 `3 l; o4 c* l- H1 y. V2 M6 }
打开STM32CubeMX,找到STM32U585AI,这一次就要选择第二项开启TrustZone了。9 i# M. y2 T. s6 c. l+ z
QQ截图20211009123049.png
/ X# q9 ?6 O# i4 M$ v# C/ y+ a# M$ b3 {
看看新的外设界面,嗯,与之前大大不同啊。
. \) V/ ^8 t# Y8 Y" B* E! r( @ QQ截图20211009123436.png
8 F1 ~' `& H# P9 X2 L" k; c4 @* \
简单配一下时钟。
+ Y% q' |1 I! p. I4 P; k QQ截图20211009144914.png ( f& Z7 w0 v" C* |5 l, U( G

: U! k& {3 k. A. X/ t8 h9 K* `配一下SWD,这里就让他使用安全区域那边的初始化。
1 {2 K+ x1 }7 E" g8 u, Q QQ截图20211009123445.png - J" X; y8 E+ T3 I2 w, x8 w6 k
3 x6 e" C: z. r' K7 G
配一下IO,就是板子上的两个小灯,一个配置到安全区域、一个配置到非安全区域。) P9 W0 `! u7 {2 k9 G% k% U
QQ截图20211009123622.png
" j9 C" @( R) R3 {/ I
4 s2 W* _, m0 }$ y生成代码,打开keil,嚯,两个工程啊(工程之间的区别以后再聊)。. P, v; S9 l7 T! y
QQ截图20211009123724.png
' i' J9 d8 H9 A3 U2 n9 A
8 w0 e2 ~3 @) J右键可以切换选中工程。
: J$ a* ~5 B6 o/ \: m6 W8 g QQ截图20211009145205.png 2 y+ K3 [" G. T$ R6 K

4 c: E  P  v# e看看代码6 z% v5 r7 O7 i4 ?2 p
安全区域的GPIO初始化
9 L* g6 W- N- ^& b4 U* f  g6 b
  1. void MX_GPIO_Init(void)- `0 b7 E; I. b& U+ H9 a, r2 j
  2. {
    2 ^& `6 M! U: v2 b7 @) ^

  3. - N" o1 X( C, U8 j
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    . B# c, S% _4 F

  5. # A  \+ t" S) j8 z: f, Y" M+ I
  6.   /* GPIO Ports Clock Enable */
    % p5 v/ _. R) j" o( p. i+ d. L
  7.   __HAL_RCC_GPIOA_CLK_ENABLE();* W6 r3 {& t  O& D; O' `
  8.   __HAL_RCC_GPIOH_CLK_ENABLE();& V$ Q' s6 {+ h
  9.   N/ i8 Y5 @1 A" D" o; h# t, F, H' d
  10.   /*Configure GPIO pin Output Level */$ {5 S& z9 e) \9 ~6 X" L
  11.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_RESET);* P5 g& r0 p2 }# ?/ r% Y& g/ E
  12. : ^$ ~0 j; b: T+ [* L
  13.   /*IO attributes management functions */
    * a  I, H8 s1 I' Z
  14.   HAL_GPIO_ConfigPinAttributes(GPIOH, GPIO_PIN_6, GPIO_PIN_NSEC);
    3 ?9 z# S0 j6 O3 a2 N

  15. * S6 @$ B* S. R! {
  16.   /*Configure GPIO pin : PH7 */
    8 h) ]" R  B& }6 y7 |
  17.   GPIO_InitStruct.Pin = GPIO_PIN_7;
    $ U4 _, U6 d; q: K; _: [/ v
  18.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;' P  f, A$ l0 [- r
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;8 i$ O2 y8 W1 E( `0 S7 n+ W/ X' A
  20.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;" V* @9 E  r5 b$ J0 S7 k3 e
  21.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);1 @: L& `3 z0 m& H, e: o
  22. 2 b1 \# y6 j8 T3 ?" S6 S. Q3 b
  23. }
复制代码

. ?! C9 d8 g8 ]; d' w9 K: @非安全区域的GPIO初始化
" x2 f9 B! C, J+ z" x: i/ Q1 }' m6 `
  1. void MX_GPIO_Init(void)+ W& R. K4 g# R; F  ]! w$ u
  2. {
    ; [: O! y9 t8 g; i
  3.   O+ g/ K" B9 A' v% t, B# T
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};" E! [* B/ V6 Y

  5. 2 [9 ]* `5 f  c# K: K% a9 n
  6.   /* GPIO Ports Clock Enable */9 P! D$ k  x9 a
  7.   __HAL_RCC_GPIOH_CLK_ENABLE();! {: a3 l! b7 l. O+ t1 Y

  8. # O# C0 c  f  C
  9.   /*Configure GPIO pin Output Level */
      O1 K. H* d- P( h6 l; ]" D
  10.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_6, GPIO_PIN_RESET);
    5 Q. b- u% G4 b# W
  11. : u8 o8 q) K) o/ ^" f& v/ @
  12.   /*Configure GPIO pin : PH6 */9 ?5 u+ d2 D- ^" k( }* b
  13.   GPIO_InitStruct.Pin = GPIO_PIN_6;+ u- H( W1 x  n
  14.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;' F' W" f- g+ \" }5 q
  15.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    3 t. @+ l6 M2 r' L
  16.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    7 F7 v  r% ], B& ]1 `( I' ^
  17.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);0 ]2 c9 j$ A& W8 T: V% l
  18. 7 S/ U$ H+ e) k- ^
  19. }
复制代码

) M/ L- s6 K3 F5 P6 a区分还是很明显的。
$ h+ n1 Z; t& b( ^$ Q  ]6 D8 p- {& v% s% k5 B
接下来写写代码看看
% l7 Q  S, H, M: k6 I安全区域/ w1 |1 U! G4 a# m
  1. while (1)1 l1 {" P' }) D' S) {3 }* b3 E* {
  2.   {9 w) Q. [! }1 x( \0 s* u
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_7);
      x& B& W- ]$ ~
  4.     HAL_Delay(1000);
    0 d" _7 a1 S2 W6 s
  5.     /* USER CODE END WHILE */( p5 F1 _6 B) D  C$ m

  6. ! X7 t, U9 Z) Q4 z: _) r
  7.     /* USER CODE BEGIN 3 */
    ' X$ Z- F" T9 o8 [6 K$ h& k; ^
  8.   }
复制代码
* @( ?1 n0 Z& Z
非安全区域2 y' W% x2 a8 j8 k5 A
  1. while (1)% k# C: I1 L7 [! c
  2.   {, n0 S" P$ l: H
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_6);
    ) B$ r# b7 e$ V) S8 ^
  4.     HAL_Delay(1000);
    . U( a- f; C) p, |. D; B+ p; _
  5.     /* USER CODE END WHILE */$ _6 B" ~3 V$ V+ K' l( K8 g

  6. : {/ |: r- ~8 O) j6 a* P! l/ S
  7.     /* USER CODE BEGIN 3 */% B5 ?- q4 V  Y. n# I
  8.   }
复制代码

7 X; X8 E, D7 Q1 X/ _写了两个闪灯的程序,各自是各自的。看看会发生什么。把两个代码都下载到芯片内部。7 ~3 Y- ?+ m4 d$ r7 D/ n$ U

/ n' X/ k% k0 C/ @结果是,非安全区的代码while(1)里面的代码正常执行,而安全区while(1)里面的代码没有正常执行。板卡红灯闪烁,而绿灯常亮(图片看不太出来)。! b4 M3 N) t+ j9 _- h: W# }
IMG_20211009_145539.jpg
) Z: i# Y) x! T) ~0 x: ?原因也很简单,安全区代码是上电之后优先执行的,然后运行到NonSecure_Init,把非安全区堆栈初始化好,然后调用非安全区的复位函数(具体调用方式与逻辑请关注后续文章)。然后代码就跳转到非安全区了。
$ ], G) ]- D/ R  u+ X/ X$ F
9 q7 ]7 ^$ S* h9 g5 W也就是说,两套代码,并不是真两个核,内部还是只有一个内核滴。
0 c6 v. F: `' ~2 l, g8 D+ F: O
: {  e/ T( K& Z* P2 e: M- m
收藏 1 评论16 发布时间:2021-10-14 18:15

举报

16个回答
奇迹 回答时间:2021-10-20 18:03:40
不咸不要钱 发表于 2021-10-20 10:49, _" u! ^3 s, i0 O" r5 {% }, L% D
M33就是两个核啊,可以仿真以下看看为啥只有一个灯闪

* h3 ~; t) p; O8 K( f9 X" m你有测试过吗?M33只是为了安全在NVIC、MPU、SYSTICK等资源提供了双份,本身控制还在在切换安全区与非安全区运行实现的。核心资源只会提供一份的。
6 M* a* I2 G$ Z7 Y
8 ^( l: g- ]. T3 O
不咸不要钱 回答时间: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就是两个核啊,可以仿真以下看看为啥只有一个灯闪
1 D# t- O4 d( M! a( I+ z
liuxingkeji 回答时间:2021-10-27 10:12:50
不错: ~- O9 A3 B: V
子曰好人2号 回答时间:2021-10-27 10:13:32
这里不太懂,安全区的代码为什么没执行: l; n6 J6 C! K" U; F; f
joshua天宇 回答时间:2021-10-27 10:24:32
不错,学习8 K" H: C3 N* l5 K, k
wudianjun2001 回答时间:2021-10-27 10:25:16
绝对666666               . l& a9 E* X& I* a
zhangt0713 回答时间:2021-10-27 10:35:12
谢谢分享
9 l, {9 L# j) F) q
QIANYING79 回答时间:2021-10-27 14:30:05
有意思,学习了  O& o' v8 z8 L/ K
moluxiyan 回答时间:2021-10-27 16:17:02
安全区的代码为什么没执行,得看下回分解了
8 F# `; V# b% S9 G. B6 {
3 m  q4 G$ b, k+ V+ j* q
orima 回答时间:2021-10-27 21:57:07
要动手操作一遍才行。。。, r) J  B, s7 t
qiangtech 回答时间:2021-10-28 09:48:32
一个时间还是只能运行一个程序的,谢谢分享。
0 V% H$ i7 @. q# j
EricCheng 回答时间:2021-10-28 22:30:46
不是很理解两个区域是怎样运行的* V5 w: p  D: F+ L
BEEE 回答时间:2021-10-28 23:45:09
想赶快使用ST新推出这款STM32U5系列产品,学习学习: ~& y# S2 f: R# u4 {. S5 M: N

8 h$ U" Z) r. q
朱贵和 回答时间:2021-10-30 09:47:34
绝对666666   

, K% m9 k* {: f7 v5 D
12下一页

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版