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

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

[复制链接]
奇迹 发布时间:2021-10-14 18:15
首先需要使用STM32CubeProgrammer软件对芯片的模式进行配置。
3 c5 v, w1 w- g& z# N QQ截图20211009140413.png 0 F. X# g4 I( b0 u
连接上芯片后,选择OB选型卡,找到User Configuration
4 U& j" b2 `* q. W+ B8 i: J
4 ^) V& L! H' ~将其中的TZEN选项打上对号,使用Apply写入到芯片。
: J* D5 m" t2 r$ ] QQ截图20211009122748.png 9 y# E' W0 {& K+ n/ m5 k

1 d0 s9 q) o  P/ V7 ?/ j3 p  }5 d如图所示配置Secure Area 1与Secure Area 2选项,使用Apply写入到芯片。
0 P; b# U) z! S) S QQ截图20211009130918.png
; [. I& v6 Y0 p6 I, H$ `
2 M5 m% O* I3 m" f+ p3 g  B4 N, W打开STM32CubeMX,找到STM32U585AI,这一次就要选择第二项开启TrustZone了。
  E" `3 d2 X, K. s) d QQ截图20211009123049.png
3 l7 t- a2 b2 r% J4 K. |& ^
8 p& M+ J5 t* g; C2 ^  z看看新的外设界面,嗯,与之前大大不同啊。
0 Q) r8 S, r1 ?  g0 f  K* J QQ截图20211009123436.png
( y: y8 m5 ^$ ?5 t; U
# S" ^1 M% L8 B简单配一下时钟。
& T- x, v' Q7 V. J- j+ E% ~ QQ截图20211009144914.png
2 M9 ~% R9 j. f7 P3 L/ M# S
. G: G- w. G2 o配一下SWD,这里就让他使用安全区域那边的初始化。
( v5 v# X3 q; i& b5 P QQ截图20211009123445.png 4 K# T" f9 h9 l: X$ ~& f

9 {' X+ B6 c5 b" ^8 E! l, [配一下IO,就是板子上的两个小灯,一个配置到安全区域、一个配置到非安全区域。
4 ?- G( p5 ]" i& P0 Y QQ截图20211009123622.png
9 n" Y, q/ W& o- `/ M; \" R% X  N- k, [
生成代码,打开keil,嚯,两个工程啊(工程之间的区别以后再聊)。
* A5 K! s7 r3 P% X8 q QQ截图20211009123724.png
# c: w( I9 v' |; w3 g  O. }, \+ L
$ M5 R* ]0 t7 ^" n4 T6 z右键可以切换选中工程。# y# u& b% r* a, x6 ]* c6 s, d
QQ截图20211009145205.png
6 R) L" Z% M: N1 b" E
6 f$ A# X5 M. n' z看看代码" R! O* `7 C5 r. Q; S
安全区域的GPIO初始化8 m, T0 V- ~( D& K( r" H# }
  1. void MX_GPIO_Init(void)9 E! D1 X! x$ D! K, B' Q
  2. {
    0 v( `1 d) `+ F5 g' c8 M
  3. ! B# R; c5 c5 O' t8 f) l
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    ! v0 s; U- L) S7 |
  5. : E& [3 T8 V6 ]2 W6 `
  6.   /* GPIO Ports Clock Enable */
    6 a! Q, o& ?& S$ g
  7.   __HAL_RCC_GPIOA_CLK_ENABLE();
    8 U: v, h; n% ]/ j
  8.   __HAL_RCC_GPIOH_CLK_ENABLE();
      Z- L0 {: v- |( Q6 v
  9.   t. D6 T$ ~9 g" F1 _# `
  10.   /*Configure GPIO pin Output Level */' w$ D* T# B2 B/ O2 `; c- P
  11.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_RESET);
    + x  T' ?" ]  @  w+ I6 Z

  12. 0 t. }6 r) |" F0 M; p- @6 }; o
  13.   /*IO attributes management functions */7 A. x- y# F- N0 `
  14.   HAL_GPIO_ConfigPinAttributes(GPIOH, GPIO_PIN_6, GPIO_PIN_NSEC);
    . s( r- O8 y3 V6 A4 H

  15. ( M. u% }; }6 i, {+ c$ w' M
  16.   /*Configure GPIO pin : PH7 */
    # I0 H  V$ Y* P# R+ T5 ~
  17.   GPIO_InitStruct.Pin = GPIO_PIN_7;$ g' m  _3 G: G* @1 c- N
  18.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      D8 _* `' l" I# [+ v
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;* m2 Y: L4 D& T" i. T+ C* H3 u
  20.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    ' g) O# m4 n/ ?' ~; J' J  A+ I/ e
  21.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
    + r4 X9 }4 T7 U* E' j) Z" L

  22. ( B" o0 X' q! i: [
  23. }
复制代码
6 U7 T" R; l% _
非安全区域的GPIO初始化9 ^7 g" i4 e; g% q" O. P6 ^3 e
  1. void MX_GPIO_Init(void)
      o. x7 Z# [8 G3 n, ?6 s
  2. {3 {3 L# O; k% O, v9 Q

  3. * r9 j" b7 S6 c0 G! T
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};# o$ n2 U) u7 z6 h
  5. " C* \3 M# N, J" p8 r- B' Z
  6.   /* GPIO Ports Clock Enable */! O# y! i) r# E# b9 o5 s
  7.   __HAL_RCC_GPIOH_CLK_ENABLE();
    4 j2 ~; o9 ^  y- a' q3 n. p

  8. 1 |0 r4 O: g! z# }
  9.   /*Configure GPIO pin Output Level */2 t0 ^* q; o! L2 }( s- p. I- \  ?
  10.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_6, GPIO_PIN_RESET);
    . H/ b) C  h: n% y
  11. 3 c! u! u2 O( _6 z% f$ W
  12.   /*Configure GPIO pin : PH6 */
    ) {+ w7 O7 e5 o6 t: b5 `2 F
  13.   GPIO_InitStruct.Pin = GPIO_PIN_6;' d5 m4 c' j, D, r% i
  14.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;* `( r' z0 J1 ?  v9 |
  15.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    # y( W" j, r8 {5 h- ]$ X
  16.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    - c5 x. X. T7 V3 L( Y
  17.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);8 N( @$ t6 E1 F- Y  R) R7 F; c
  18. # j+ G+ ~9 ?6 r# B5 u
  19. }
复制代码
! D9 ~1 N. k' Y, E+ N) e
区分还是很明显的。
6 i2 N& u2 N" H  f1 A
. X8 [5 m7 q7 A接下来写写代码看看
$ A/ c9 y4 u! V! Y4 k5 x安全区域
2 c, }, K( W7 Z2 g
  1. while (1)7 _3 W% y* s% N+ t3 B
  2.   {3 |! ?/ n, w# W! u9 d0 F( L& w6 h
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_7);6 ?0 ~. N. R2 M; n
  4.     HAL_Delay(1000);" M& @1 g# c% j$ ]' v
  5.     /* USER CODE END WHILE */
    . _2 g2 B( X% q2 A# S* K

  6. - T& q/ y: G7 I% c9 W* m* P
  7.     /* USER CODE BEGIN 3 */
    ) h  y# Y& V# z
  8.   }
复制代码

' ~7 A  _6 R8 e% C& J+ d% w+ @4 Z8 T非安全区域
- l) U0 T' o- i
  1. while (1)" I- X- v: t9 z+ `' u4 _3 i: C
  2.   {
    $ m# K9 Y6 E9 r# W1 Y3 r$ z
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_6);
    / j6 ], P$ t8 A2 v: |
  4.     HAL_Delay(1000);
    + K! @2 a3 e0 y0 E9 G+ X! _
  5.     /* USER CODE END WHILE */
    3 S" b) ]) c; A6 J. S8 ~
  6. * C: f' v7 a3 q( M. k( X4 n
  7.     /* USER CODE BEGIN 3 */% |% A6 }# `, V) ?8 J+ m
  8.   }
复制代码

& |% ~& _3 q2 i6 H$ p; r写了两个闪灯的程序,各自是各自的。看看会发生什么。把两个代码都下载到芯片内部。. U( a' E$ F# K$ C

0 t3 r& Q. X2 m. b结果是,非安全区的代码while(1)里面的代码正常执行,而安全区while(1)里面的代码没有正常执行。板卡红灯闪烁,而绿灯常亮(图片看不太出来)。5 j+ n) s# `1 l! W/ @% z
IMG_20211009_145539.jpg ) Y) T3 ~( j8 \6 x* A, f  A
原因也很简单,安全区代码是上电之后优先执行的,然后运行到NonSecure_Init,把非安全区堆栈初始化好,然后调用非安全区的复位函数(具体调用方式与逻辑请关注后续文章)。然后代码就跳转到非安全区了。
. b3 e3 G! L$ }: A7 Q0 U1 P9 B
% {' t$ _; Z7 k1 x$ l也就是说,两套代码,并不是真两个核,内部还是只有一个内核滴。& }) C7 L  A: o/ p; p2 |0 [- w, ?# _
4 C8 |1 {: m- P
赞 收藏 1 评论16 发布时间:2021-10-14 18:15

举报

16个回答
奇迹 回答时间:2021-10-20 18:03:40
不咸不要钱 发表于 2021-10-20 10:498 r% k8 a* ]7 ^7 f5 w& x" a" T
M33就是两个核啊,可以仿真以下看看为啥只有一个灯闪

' R+ C" i9 G+ D0 w. k& n你有测试过吗?M33只是为了安全在NVIC、MPU、SYSTICK等资源提供了双份,本身控制还在在切换安全区与非安全区运行实现的。核心资源只会提供一份的。8 e  m8 j# b9 @8 f# i+ ~+ v4 R% [

+ ~" ]# i: E+ _) K: E' t
不咸不要钱 回答时间:2021-11-9 11:20:26

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

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

<br /> <br />

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

不咸不要钱 回答时间:2021-10-20 10:49:07
M33就是两个核啊,可以仿真以下看看为啥只有一个灯闪
7 y# n; D/ s" P) V+ `/ _8 i
liuxingkeji 回答时间:2021-10-27 10:12:50
不错2 I/ [' R  W) v' {& i/ a1 \  g$ b# K
子曰好人2号 回答时间:2021-10-27 10:13:32
这里不太懂,安全区的代码为什么没执行
3 @+ S/ ]2 Z  T3 a
joshua天宇 回答时间:2021-10-27 10:24:32
不错,学习
5 R2 j8 u$ q0 j8 s" H
wudianjun2001 回答时间:2021-10-27 10:25:16
绝对666666               
3 X% |0 s& j! i
zhangt0713 回答时间:2021-10-27 10:35:12
谢谢分享
) g5 D6 l& y1 ?! k) M6 Y
QIANYING79 回答时间:2021-10-27 14:30:05
有意思,学习了
1 t5 C# a8 ?/ C, p; ~+ E
moluxiyan 回答时间:2021-10-27 16:17:02
安全区的代码为什么没执行,得看下回分解了
& D% l5 a6 _% z) t
: F8 S- S: l1 G9 h" z9 O
orima 回答时间:2021-10-27 21:57:07
要动手操作一遍才行。。。/ z. x5 p/ _6 p
qiangtech 回答时间:2021-10-28 09:48:32
一个时间还是只能运行一个程序的,谢谢分享。" I$ Z/ L  I' K1 [
VegardCheng 回答时间:2021-10-28 22:30:46
不是很理解两个区域是怎样运行的' {% O% M6 n' }
BEEE 回答时间:2021-10-28 23:45:09
想赶快使用ST新推出这款STM32U5系列产品,学习学习. O+ ^4 z5 m% [$ w
/ d( z- ?3 V7 ^1 h& R0 C: g/ h. i
朱贵和 回答时间:2021-10-30 09:47:34
绝对666666   

! p7 P: X/ {, Y) @: ^
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版