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

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

[复制链接]
奇迹 发布时间:2021-10-14 18:15
首先需要使用STM32CubeProgrammer软件对芯片的模式进行配置。1 P/ G" a5 u* ]
QQ截图20211009140413.png 6 y% m3 R% P$ g, m' a( Z4 h8 n
连接上芯片后,选择OB选型卡,找到User Configuration6 {' `" }0 r: I. [: @

& J) _0 N) l3 U! N4 o! m- u: a3 k. P将其中的TZEN选项打上对号,使用Apply写入到芯片。4 X6 t  ~9 P) J4 L( A- \1 D& Q
QQ截图20211009122748.png , d7 o! e1 ^' w" Y& a& c
. _8 ^  A% E) i4 f. t
如图所示配置Secure Area 1与Secure Area 2选项,使用Apply写入到芯片。3 v6 A3 R  n! T+ X: a7 t$ x
QQ截图20211009130918.png ) A3 A4 u9 O  {2 ~8 h

2 n# ]; I) E3 F打开STM32CubeMX,找到STM32U585AI,这一次就要选择第二项开启TrustZone了。. I5 l9 i6 I' F  L' ]0 l  `! Q
QQ截图20211009123049.png 5 f/ H& t: V5 Q4 R; R

) t6 |0 U8 D. c6 n看看新的外设界面,嗯,与之前大大不同啊。
8 V' u/ l1 _% M3 C% }- k QQ截图20211009123436.png 9 Q7 a1 R. D& t( [% ?3 k9 q

- @* w' b5 n9 z: Q$ U简单配一下时钟。( f/ E% M$ Q5 Q! R  I) A' E  _- n/ F
QQ截图20211009144914.png - M4 O7 C1 ~/ P

. s. l9 @! K  A5 r  u配一下SWD,这里就让他使用安全区域那边的初始化。# t3 X' B7 t* ^
QQ截图20211009123445.png
0 D' H3 |3 w# F, X/ ]
9 c! A1 z. G6 N7 m" f1 }& g配一下IO,就是板子上的两个小灯,一个配置到安全区域、一个配置到非安全区域。
5 }3 L  `! N; {* J0 U1 e+ P; O QQ截图20211009123622.png
6 n6 y% `! E: \+ R" }4 r& ^" a4 h) d6 n8 c- C' P
生成代码,打开keil,嚯,两个工程啊(工程之间的区别以后再聊)。
% B+ t  x" s% C0 z1 U8 |8 a QQ截图20211009123724.png
) ?' _- C! R% T! K# K
& q4 y  A. @7 d0 n* V; p7 c右键可以切换选中工程。4 C" {- s5 Y% {$ v6 r8 q
QQ截图20211009145205.png
( g7 [# x0 G0 z" n/ i' H  t$ N) ]$ u, o8 C
看看代码
+ D; _, V+ w3 U安全区域的GPIO初始化& W( |7 o0 F7 s' L$ ?# g
  1. void MX_GPIO_Init(void)1 T! O% c) P- Y! q
  2. {
    2 E+ q# m. }9 J7 V

  3.   H7 B2 @/ e* O, x- c: U7 L  m
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};0 O' B  r( ~7 H  l5 |

  5. & E% O* ?1 G; N3 m  a' @0 G
  6.   /* GPIO Ports Clock Enable */
    ( [- t6 ^) d% b, e9 _
  7.   __HAL_RCC_GPIOA_CLK_ENABLE();
    + y- l+ [! Q" p* i5 M6 H* \. q. H
  8.   __HAL_RCC_GPIOH_CLK_ENABLE();
    ) E  M6 Q0 C) z6 v! N( t- ]

  9. ( _  c* f) \/ X: g. q
  10.   /*Configure GPIO pin Output Level */2 }. c* T5 {, u" x1 z% Y, e( s& z
  11.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_RESET);' D7 {- F- y1 M: l' b
  12. $ i6 M/ o$ W7 l: C
  13.   /*IO attributes management functions */
    ' n' @. T, K$ n
  14.   HAL_GPIO_ConfigPinAttributes(GPIOH, GPIO_PIN_6, GPIO_PIN_NSEC);
    6 @, R+ P* E5 q2 {3 F2 u" a( T

  15. 8 Y2 G9 V) \& x4 u; k9 `: g
  16.   /*Configure GPIO pin : PH7 */5 Q' l5 [) Y7 p3 N
  17.   GPIO_InitStruct.Pin = GPIO_PIN_7;4 z. ~7 c, b5 u* a
  18.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    3 X) j) G2 g) i# L5 b
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    4 c- t7 n  S0 E4 I4 \4 x# S! M
  20.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    ) B7 J! J1 i" S
  21.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
    2 w# R. H4 V2 X; @8 `* A

  22. 3 i) q& D7 ?) N
  23. }
复制代码

$ S4 E! Z! h3 L5 ^- _3 `非安全区域的GPIO初始化! |( _: t/ U- p0 I2 e% B3 t
  1. void MX_GPIO_Init(void)% e4 r/ Q- B1 [2 l, g: f
  2. {0 c* |; i: }' K4 K7 ?. X& P( `
  3. - E% B3 n7 \4 b4 V+ n+ z8 v8 X
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};4 T* ~7 E# f' l4 L, u

  5. 2 ?  u: T) z$ Y/ a
  6.   /* GPIO Ports Clock Enable */5 c  Z7 W! {1 z! ^1 h
  7.   __HAL_RCC_GPIOH_CLK_ENABLE();9 j( ?( V3 z7 D+ X- _% m

  8. + `; L% c) \: [, b) L9 m
  9.   /*Configure GPIO pin Output Level */& E. }3 u& {5 ~1 e
  10.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_6, GPIO_PIN_RESET);* C/ r5 N$ b" k. K8 {. D6 ]
  11. 1 [+ Z- U9 C( [6 I( E7 X8 s4 l& i
  12.   /*Configure GPIO pin : PH6 */5 `7 ]- M  u& ?
  13.   GPIO_InitStruct.Pin = GPIO_PIN_6;1 e7 }. q. z- f6 k. O; p
  14.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      n! B! r! r) Z; Y7 n! m
  15.   GPIO_InitStruct.Pull = GPIO_NOPULL;+ N3 N' T5 X' p! j- W: {, E5 P0 h
  16.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    . `$ p$ {! T/ m1 L; d/ V
  17.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);6 ]. `3 R* B. x5 E* q6 ^3 ~

  18. 1 Q+ |' |# M/ {  X7 k0 e
  19. }
复制代码
' Q6 _" T5 ~* h+ @% B4 U# b
区分还是很明显的。) X, \/ w6 g0 W1 O6 ]7 S
' j' }. b$ a4 w5 d5 _: R
接下来写写代码看看
7 I' U& a) A* G) P, ~安全区域) h; @# I7 @. l3 P5 L
  1. while (1)
    4 f* _4 L4 E/ [! L
  2.   {
    " s1 v# s1 j. i! w) a; J
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_7);
    " |# Z9 o! r, q0 @
  4.     HAL_Delay(1000);: S% W7 w& `* W4 w2 K9 a( {: u
  5.     /* USER CODE END WHILE */, P) p! f( B: t  t0 t" Y% D
  6. ' O, F; V4 {# M% Y  A4 a5 {, X
  7.     /* USER CODE BEGIN 3 */
    0 F! y3 [; X  b1 }
  8.   }
复制代码

8 F" N4 D6 I% K5 ~0 L& d: [3 S非安全区域
; q+ t; l. D" `# o) F5 U: `
  1. while (1)  T: Z, `& w! z1 }0 I# I
  2.   {% `0 |6 U5 u9 ]( j/ Y1 K" n
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_6);
    / Y. H" {2 H1 ?: _
  4.     HAL_Delay(1000);8 p) {; ?/ L, v8 Q
  5.     /* USER CODE END WHILE */' [! S6 s0 {3 {5 Q+ ^

  6. . o' n& P" z8 L/ q; p  i/ n
  7.     /* USER CODE BEGIN 3 */: s$ g6 w1 {7 \# a
  8.   }
复制代码

" P7 q3 K# e. m" U& Q7 s' x' C4 Y写了两个闪灯的程序,各自是各自的。看看会发生什么。把两个代码都下载到芯片内部。
& d4 x/ h2 ]7 z8 C* Y$ {8 g9 C7 {5 [+ G
结果是,非安全区的代码while(1)里面的代码正常执行,而安全区while(1)里面的代码没有正常执行。板卡红灯闪烁,而绿灯常亮(图片看不太出来)。
+ ^: _7 l4 [. V3 i8 M+ ?& y( k IMG_20211009_145539.jpg
. L" }8 C5 J( V6 |原因也很简单,安全区代码是上电之后优先执行的,然后运行到NonSecure_Init,把非安全区堆栈初始化好,然后调用非安全区的复位函数(具体调用方式与逻辑请关注后续文章)。然后代码就跳转到非安全区了。
% J  X; P/ p6 q1 Y" l) J3 x5 y! B( M7 v1 }' h! R. ]7 [4 p
也就是说,两套代码,并不是真两个核,内部还是只有一个内核滴。% v8 f0 Q, q: X$ @5 Q4 e
* n, x. p4 O$ \& H2 ~
收藏 1 评论16 发布时间:2021-10-14 18:15

举报

16个回答
奇迹 回答时间:2021-10-20 18:03:40
不咸不要钱 发表于 2021-10-20 10:49
+ j% m( c7 o* M0 j$ mM33就是两个核啊,可以仿真以下看看为啥只有一个灯闪
! O3 N  c  R) E
你有测试过吗?M33只是为了安全在NVIC、MPU、SYSTICK等资源提供了双份,本身控制还在在切换安全区与非安全区运行实现的。核心资源只会提供一份的。
$ I9 g& D! K/ S3 \( Q% A6 f, P; G. D: E0 {3 }! M6 y3 M# c
不咸不要钱 回答时间: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就是两个核啊,可以仿真以下看看为啥只有一个灯闪) y6 H/ h! V& l- o& z6 G
liuxingkeji 回答时间:2021-10-27 10:12:50
不错6 L/ z6 e+ D+ C1 m) C
子曰好人2号 回答时间:2021-10-27 10:13:32
这里不太懂,安全区的代码为什么没执行6 |6 Y2 P6 w/ ~# l
joshua天宇 回答时间:2021-10-27 10:24:32
不错,学习- @4 Z% U9 |& m& q7 k0 H
wudianjun2001 回答时间:2021-10-27 10:25:16
绝对666666               
3 f. Q: n6 R4 \9 S; c' {
zhangt0713 回答时间:2021-10-27 10:35:12
谢谢分享- {( X: f6 o6 Q2 x$ j8 w, |
QIANYING79 回答时间:2021-10-27 14:30:05
有意思,学习了
$ L- z/ O4 n- A' R! g  u6 m
moluxiyan 回答时间:2021-10-27 16:17:02
安全区的代码为什么没执行,得看下回分解了
! u+ g9 q& |0 d. r  e# f# Q; D8 v, r2 ]) R+ _2 I
orima 回答时间:2021-10-27 21:57:07
要动手操作一遍才行。。。
- R. v, \; p) `) w* B. z+ ~" P! Z" V
qiangtech 回答时间:2021-10-28 09:48:32
一个时间还是只能运行一个程序的,谢谢分享。% B) X/ a7 `2 D- }7 [) }
EricCheng 回答时间:2021-10-28 22:30:46
不是很理解两个区域是怎样运行的+ S1 i- x  e! g4 J- A3 `0 f+ f" t
BEEE 回答时间:2021-10-28 23:45:09
想赶快使用ST新推出这款STM32U5系列产品,学习学习
: m/ ~  s) E& W" D9 Z9 ?' Y! R8 r9 X5 k5 s- G; H
朱贵和 回答时间:2021-10-30 09:47:34
绝对666666   
! b, f# i, W1 t  g- v" G3 I5 H0 g
12下一页

所属标签

相似分享

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