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

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

[复制链接]
奇迹 发布时间:2021-10-14 18:15
首先需要使用STM32CubeProgrammer软件对芯片的模式进行配置。
3 h4 B- f1 v7 Q; k QQ截图20211009140413.png 1 B! O1 ?) x6 x8 V; `
连接上芯片后,选择OB选型卡,找到User Configuration
) M  g9 N4 @2 b
( K) B) f  }" p* V将其中的TZEN选项打上对号,使用Apply写入到芯片。3 t0 w# u& b& e% v/ ?6 I# \
QQ截图20211009122748.png ' G! `' P8 U% H) N
: g6 g0 f/ y( a: l) n
如图所示配置Secure Area 1与Secure Area 2选项,使用Apply写入到芯片。5 r. j! ?, f9 F# ]0 H
QQ截图20211009130918.png % [7 q) I' F; W4 Q+ I; Q

: A( h9 \! i9 f7 l: R& D3 K; L0 m打开STM32CubeMX,找到STM32U585AI,这一次就要选择第二项开启TrustZone了。
6 M% N& m! M+ v/ o2 o0 r QQ截图20211009123049.png
7 }* k( W5 I+ j/ [3 E. ~6 b' Y+ I. @- I/ d( H0 j
看看新的外设界面,嗯,与之前大大不同啊。
+ C" _5 ]8 d% n5 j QQ截图20211009123436.png ' {9 e5 @& V* ^) |: e$ C

( I: {, u2 Q% g# T1 E简单配一下时钟。
8 I2 i! \9 L# u* L" L) H" g QQ截图20211009144914.png
  f& H8 d! k# e( M9 A: D' m) ~% t( j
配一下SWD,这里就让他使用安全区域那边的初始化。
3 v$ e: o/ ?  u/ y QQ截图20211009123445.png
: [4 v+ r+ l2 a1 g5 C0 C' b# V- G
: W4 ^, s9 }8 }" ^0 I3 n配一下IO,就是板子上的两个小灯,一个配置到安全区域、一个配置到非安全区域。/ @+ \' h( k1 q$ I
QQ截图20211009123622.png 7 a% j) _1 W; Q  ^0 T

8 @1 P$ \: s; N8 s生成代码,打开keil,嚯,两个工程啊(工程之间的区别以后再聊)。6 I2 l3 I: g5 \: I4 q
QQ截图20211009123724.png
0 w' ^. b: Z5 y+ S6 B( c& X& Y: K  z! V0 f1 }& j
右键可以切换选中工程。
' W3 u/ f+ P$ N QQ截图20211009145205.png
. i( I9 [2 R# w! q: Q4 f  x) K& Z9 Q3 j5 q4 A) z" S3 d
看看代码
/ e1 P* i7 \, @2 O$ Z/ s( F  H$ A安全区域的GPIO初始化
) L' w. V. E6 Z( O1 H
  1. void MX_GPIO_Init(void)' Y3 v8 M$ R7 V* V
  2. {
    & c- S9 p8 F% r& Q& `" }3 ]& X
  3. # z- F2 g) c, V1 o$ m+ K4 e) {4 f$ @
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};" m: H6 r1 [. O% O" \+ ]- E
  5. 9 t6 U$ q9 M& G! j- O" f
  6.   /* GPIO Ports Clock Enable */
    ) R) @( D3 o/ N& }* n! B' V
  7.   __HAL_RCC_GPIOA_CLK_ENABLE();
    " h8 [6 p( y- p$ N7 l" @$ q# q( k# B
  8.   __HAL_RCC_GPIOH_CLK_ENABLE();9 n+ {. V& p0 E
  9. 3 p6 ]7 U9 G4 @- F
  10.   /*Configure GPIO pin Output Level */+ F& d7 N* q  v% Z# v; ~
  11.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_RESET);
    6 b4 \; C) M! v) i

  12. 8 o0 m+ D- `6 Y- B2 i$ a
  13.   /*IO attributes management functions */
    $ P( {* H, a4 A: {6 x% Z' h
  14.   HAL_GPIO_ConfigPinAttributes(GPIOH, GPIO_PIN_6, GPIO_PIN_NSEC);
    ! W/ o9 f5 n+ q. O! V) g' i9 |0 J

  15. % l' y. U( {2 M8 P& k4 d3 C. K
  16.   /*Configure GPIO pin : PH7 */5 n- f+ ^, }& A7 [; P
  17.   GPIO_InitStruct.Pin = GPIO_PIN_7;
    - z. e2 X% V; K9 j4 y
  18.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    2 J' h9 Q! H- v  o$ {* D+ M: P
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    4 h0 V' b+ {/ V; G4 m3 Q* ~  I
  20.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    + Y$ v0 j, N  D& y" k
  21.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
    7 m+ @' @) j6 _, y* u

  22.   ~' d! k( e9 E* x
  23. }
复制代码

1 U. C9 J: |# R4 Y- G5 A) ~7 A% v* g非安全区域的GPIO初始化4 Q* k' I. l, f2 l2 T: _
  1. void MX_GPIO_Init(void)- b! A9 J6 ?3 H) @( S8 g6 H
  2. {
    $ ]5 j, r! C- V2 Q* N: s- R0 {

  3. % V$ u1 W: i2 b# h3 N7 p
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};; e- Y, }! ]# E' Y- Z6 c, g

  5. ) u3 K3 c0 O5 {6 U
  6.   /* GPIO Ports Clock Enable */
    $ U' T/ r/ d) z8 i, r- o' M8 {. @
  7.   __HAL_RCC_GPIOH_CLK_ENABLE();
    0 e# \- k) G. G8 d/ X. |/ H% }

  8. ' q" H; O+ P# w; b: z- ^4 E
  9.   /*Configure GPIO pin Output Level */  R5 G8 s! |$ Z: g; a
  10.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_6, GPIO_PIN_RESET);
    3 d8 a9 g6 J3 G2 o
  11. ; O) r3 D3 m  e+ {8 N% R
  12.   /*Configure GPIO pin : PH6 */8 q  \. o! ]7 i, I$ v
  13.   GPIO_InitStruct.Pin = GPIO_PIN_6;
    - [" B) a- Z9 d2 ]6 F) J0 O: l
  14.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;1 n5 Z0 h" U4 g/ `& v
  15.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    ! S6 c! U0 Q1 _6 y2 x
  16.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    2 z7 B' f$ w$ Z1 S* ^7 s% @( m2 L5 ]
  17.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
    ( E) |5 D  l7 Z; s' }$ e2 \

  18. ( [: E+ c$ ~2 c  t( T6 H1 k
  19. }
复制代码

" {' u4 F" R3 p* W区分还是很明显的。6 I1 Q) U: |2 z7 ]2 g4 F+ y" w

% M/ e) R# b: W接下来写写代码看看
; v( r1 O" S0 u安全区域! a+ [, p$ s+ S+ o( P
  1. while (1)# \# L% g8 r: ]
  2.   {7 D$ n( e) I1 h; h1 d
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_7);, Y  S8 Y0 a5 b0 R
  4.     HAL_Delay(1000);7 V% O# h- ?( s5 S
  5.     /* USER CODE END WHILE */
    % Z# q3 Q8 J0 ^2 V. H8 I- v

  6. , k% c4 i. G3 z8 G/ W6 R+ D1 D0 K
  7.     /* USER CODE BEGIN 3 */
    1 @$ s( ?1 u! o9 ~2 Z* B+ l
  8.   }
复制代码
+ `; U  d2 O" Q
非安全区域3 N. e& X- j' J, \0 p3 T
  1. while (1)! L+ m' E5 [& [9 i* x
  2.   {
    1 Z7 o# A2 ~( o8 G( Y9 h6 x
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_6);
    7 o) G# }( s0 l# i4 j8 q1 w
  4.     HAL_Delay(1000);9 i- G" j5 g. K4 k
  5.     /* USER CODE END WHILE */
    * J+ _" b5 r3 o
  6. 0 {7 ^1 o& O! g4 U
  7.     /* USER CODE BEGIN 3 */
    2 z7 u, F8 |) b) d# B* y
  8.   }
复制代码

5 D* B0 S$ S) a- h' Q, J1 M写了两个闪灯的程序,各自是各自的。看看会发生什么。把两个代码都下载到芯片内部。
/ a0 P+ S1 }; R  g; C3 z8 `
% ]# w3 a' K5 U3 ?" s: `结果是,非安全区的代码while(1)里面的代码正常执行,而安全区while(1)里面的代码没有正常执行。板卡红灯闪烁,而绿灯常亮(图片看不太出来)。
( |# q) F( [: v: ^ IMG_20211009_145539.jpg ( h& r6 I4 o( p
原因也很简单,安全区代码是上电之后优先执行的,然后运行到NonSecure_Init,把非安全区堆栈初始化好,然后调用非安全区的复位函数(具体调用方式与逻辑请关注后续文章)。然后代码就跳转到非安全区了。/ P* }$ }  K6 E
4 Y+ ~) S8 R3 b/ {
也就是说,两套代码,并不是真两个核,内部还是只有一个内核滴。) I3 O6 n& ^3 V# J7 ^
0 m6 S( M$ R# R1 p0 }8 t2 G# v
收藏 1 评论16 发布时间:2021-10-14 18:15

举报

16个回答
奇迹 回答时间:2021-10-20 18:03:40
不咸不要钱 发表于 2021-10-20 10:49
9 s& u  Q0 ^/ I" E! \1 n8 I" Z& G2 qM33就是两个核啊,可以仿真以下看看为啥只有一个灯闪

0 n- v9 m! n6 M$ c3 v& W: Q你有测试过吗?M33只是为了安全在NVIC、MPU、SYSTICK等资源提供了双份,本身控制还在在切换安全区与非安全区运行实现的。核心资源只会提供一份的。
2 ~( y! q4 o# d( X4 X) D% d- `9 |- m. c2 A% 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就是两个核啊,可以仿真以下看看为啥只有一个灯闪
. g( f  d* T0 s& [/ C
liuxingkeji 回答时间:2021-10-27 10:12:50
不错
$ M# R% R8 K: B7 U- }* W8 N; U
子曰好人2号 回答时间:2021-10-27 10:13:32
这里不太懂,安全区的代码为什么没执行3 P# D6 C0 L6 Q
joshua天宇 回答时间:2021-10-27 10:24:32
不错,学习
" n, P2 K5 ?8 Y" Z; s) j% H
wudianjun2001 回答时间:2021-10-27 10:25:16
绝对666666               
2 F% n/ w5 n# A7 V* D- |( o% ?
zhangt0713 回答时间:2021-10-27 10:35:12
谢谢分享
: y% J* Z5 N. ?; I7 C
QIANYING79 回答时间:2021-10-27 14:30:05
有意思,学习了' R5 ~% d2 I- u9 Z+ K7 o5 w
moluxiyan 回答时间:2021-10-27 16:17:02
安全区的代码为什么没执行,得看下回分解了! ^6 c+ Q3 M; k3 c  e

4 e3 l5 s5 O0 h9 e8 |
orima 回答时间:2021-10-27 21:57:07
要动手操作一遍才行。。。
5 i& n9 O7 R4 D; l4 y% ^. o
qiangtech 回答时间:2021-10-28 09:48:32
一个时间还是只能运行一个程序的,谢谢分享。
+ |: @+ |! ~4 i+ ]7 F+ j
EricCheng 回答时间:2021-10-28 22:30:46
不是很理解两个区域是怎样运行的
0 ~0 X& V9 x( C( D
BEEE 回答时间:2021-10-28 23:45:09
想赶快使用ST新推出这款STM32U5系列产品,学习学习6 [2 t) r0 z' Z) b: K

! f: k& x8 S6 ^2 D; s" G. z
朱贵和 回答时间:2021-10-30 09:47:34
绝对666666   
/ B/ v+ a1 }6 \, p$ |; x; D
12下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版