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

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

[复制链接]
奇迹 发布时间:2021-10-14 18:15
首先需要使用STM32CubeProgrammer软件对芯片的模式进行配置。
: Z! p2 u8 K! y( Y; H QQ截图20211009140413.png # s% m* E2 w9 o$ R
连接上芯片后,选择OB选型卡,找到User Configuration
' \! L0 q: p- M9 E. _' [& J, l, D( V. Y0 d# r% r
将其中的TZEN选项打上对号,使用Apply写入到芯片。* R% c) ^4 |! B1 s9 z
QQ截图20211009122748.png * R7 ~0 t1 g' g
9 S0 P, g7 c2 U# h$ A- X! f( N
如图所示配置Secure Area 1与Secure Area 2选项,使用Apply写入到芯片。/ A* ~7 Q6 e6 A
QQ截图20211009130918.png $ Z3 T1 i1 l7 ~" o

$ B4 R5 \! u. h3 r1 V7 p- I打开STM32CubeMX,找到STM32U585AI,这一次就要选择第二项开启TrustZone了。7 K1 a+ e/ G8 V9 Z: z. E3 ?
QQ截图20211009123049.png % V# Q+ ?7 j% P# g3 R) f

2 r3 }3 J2 I0 [看看新的外设界面,嗯,与之前大大不同啊。
3 }; [7 r7 K" d' I. f9 Z QQ截图20211009123436.png
% z4 t: c, R: G$ B7 {: ^4 u8 {- k5 g' G5 ~3 d6 c- l
简单配一下时钟。9 _% \2 m3 w3 a! I
QQ截图20211009144914.png
$ M: G. P1 ~3 c& i! e
7 x: R) _) t' [: A* [2 M: }配一下SWD,这里就让他使用安全区域那边的初始化。
+ m7 w0 h+ F% y$ |, {, u7 [ QQ截图20211009123445.png
2 ^/ L4 C; s& m8 b  d# |& d
# C$ u2 E( Z- p1 i# y& x% I配一下IO,就是板子上的两个小灯,一个配置到安全区域、一个配置到非安全区域。
; e# I. k" l8 E5 h; K$ @ QQ截图20211009123622.png 7 x6 }- z# a1 `# b$ r6 K3 Q. D

/ E! A/ ^+ {9 ^5 F) K生成代码,打开keil,嚯,两个工程啊(工程之间的区别以后再聊)。$ d& U/ c  y: j: d1 p
QQ截图20211009123724.png
7 J, o& K6 ?4 Y0 X( g. @% a* x/ i& b, [. j2 F
右键可以切换选中工程。
% r- f- X, V* l/ B* y' N QQ截图20211009145205.png
& b. R* u) \  @, s' w9 \: F' E. A0 w
" h4 S( t8 k2 |: n1 @/ y看看代码
/ {1 }& f7 ~# X2 V1 h0 O8 T# [) t安全区域的GPIO初始化
0 \* q7 }4 }0 l- G2 K
  1. void MX_GPIO_Init(void)2 Q3 d: q# g- v: i9 z9 H, F
  2. {
    / p! _8 K1 f! p  |6 u
  3. 7 b* d" ?3 R: B! F% H1 y4 F" u. ?
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    - R! j* g. v& g- x! h

  5. ; |4 m9 \1 T8 ]0 _4 Y: ?1 u  d
  6.   /* GPIO Ports Clock Enable */
    : Z+ q9 `- P1 `0 t% J4 {- p
  7.   __HAL_RCC_GPIOA_CLK_ENABLE();6 m5 U! W" V$ i: D% i+ k
  8.   __HAL_RCC_GPIOH_CLK_ENABLE();
    / a" N, j3 Q# }# m; @) {

  9. + k( R% H! O  m4 j
  10.   /*Configure GPIO pin Output Level */
    2 ~$ a! H) o. {" H: _
  11.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_RESET);  x- E. G/ m  J6 H

  12. " V  |) u) p4 F9 I
  13.   /*IO attributes management functions */9 R9 }. z5 x  P7 ^5 O0 t( @
  14.   HAL_GPIO_ConfigPinAttributes(GPIOH, GPIO_PIN_6, GPIO_PIN_NSEC);
    & p' Z) r& Z2 I& z" h' i
  15. : D6 \. [* @+ y* p1 @2 m+ O
  16.   /*Configure GPIO pin : PH7 */1 ~6 c4 s8 k& j, b5 k
  17.   GPIO_InitStruct.Pin = GPIO_PIN_7;
    9 W& M# N- B* @6 m( S' P& n' d! c! _
  18.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;9 ^3 g/ c8 k) l% L) n# P" a2 Y* z
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    2 K; t; ^2 c' u3 s( A- W
  20.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    * k' |1 D$ \, R
  21.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);/ X  f; J* t" I+ \, \
  22. . M7 b6 y  B* v  r
  23. }
复制代码

7 R1 o0 P1 W7 \7 o3 h非安全区域的GPIO初始化
( ~* t: i3 Y" f1 i! L
  1. void MX_GPIO_Init(void)( Z  Z7 J  p4 d) x
  2. {
      n; o( b/ z% X
  3. 9 L. U  {( F5 ~3 h4 s' V
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    2 k0 {9 m  Q, l* o
  5. 4 o: @+ g& h5 |' n5 J) n" v. p
  6.   /* GPIO Ports Clock Enable */( Q7 ~# l; U+ P  a  w
  7.   __HAL_RCC_GPIOH_CLK_ENABLE();
    2 \& B1 m& p* J7 M% l! z. |$ }

  8. ; t+ m8 H) ~" M3 }
  9.   /*Configure GPIO pin Output Level */$ q, ]1 {/ E% E
  10.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_6, GPIO_PIN_RESET);
    % V/ \% b. Z/ Z, W0 K2 G+ v$ @

  11. + j' ^+ a4 f3 s+ o6 o
  12.   /*Configure GPIO pin : PH6 */
    ! U# v6 O7 |" c4 b' D  g
  13.   GPIO_InitStruct.Pin = GPIO_PIN_6;
    8 j  k9 A3 e& Z, T- T
  14.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      W% w& Q# W" q0 M: `( ?, H
  15.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    / @8 S4 K$ L8 H/ X( h8 o
  16.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;1 [+ S$ `- `# h; W3 b/ T- V- U; c
  17.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
      y* b7 S+ E$ ?/ I
  18. - q9 Q1 r$ O/ x: B5 {* O7 p
  19. }
复制代码
# n5 u5 I; Y# r1 i8 D
区分还是很明显的。
( P: \. ^7 f  I. q# Y7 U; V2 `' B' h2 @- U" m+ {3 [6 ~
接下来写写代码看看; q9 O8 W2 ?7 T0 u# z, [% [. x
安全区域: C' D9 @; V, K! b8 {
  1. while (1)& i! \5 h+ W% J+ }; L4 X8 v
  2.   {% N7 E/ k& f# T: h0 p# L
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_7);4 \7 b) L6 u, V- Z5 ], h" R
  4.     HAL_Delay(1000);
    ! r5 E+ q. |8 w" }4 e- q! g
  5.     /* USER CODE END WHILE */: f% }- [# i9 z2 t6 U- C" \

  6. : L' q. k$ F; K" @0 }* a0 L: s. b
  7.     /* USER CODE BEGIN 3 */5 e/ M' N0 E- q" c0 q+ P1 b' _
  8.   }
复制代码
7 C6 w3 Z: R- K: `2 l2 g( k' e
非安全区域
) |2 o; y  g5 w; W
  1. while (1)8 m2 D+ _" Y: N) m$ j" p- ~
  2.   {
    ) k7 \" S  }* Z- y4 G0 z
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_6);
    / _, b2 M3 d# n! A6 m3 c0 J* M7 m
  4.     HAL_Delay(1000);. D; i. [" Z7 Y  |4 E2 @
  5.     /* USER CODE END WHILE */$ t% Q, i6 K  q+ p1 n
  6. / z) P6 f2 Z1 C! [% n
  7.     /* USER CODE BEGIN 3 */
    ) H# C) t& r+ J' Y$ j8 ~
  8.   }
复制代码
3 X% d7 G' _$ U3 t
写了两个闪灯的程序,各自是各自的。看看会发生什么。把两个代码都下载到芯片内部。
' R1 s# z: F  S
& O; f: q, e' S结果是,非安全区的代码while(1)里面的代码正常执行,而安全区while(1)里面的代码没有正常执行。板卡红灯闪烁,而绿灯常亮(图片看不太出来)。
+ S7 q1 m! o9 |- n( Q9 V IMG_20211009_145539.jpg ! b# G) U* C3 e! u! ?
原因也很简单,安全区代码是上电之后优先执行的,然后运行到NonSecure_Init,把非安全区堆栈初始化好,然后调用非安全区的复位函数(具体调用方式与逻辑请关注后续文章)。然后代码就跳转到非安全区了。1 v/ K3 h$ W) {
; O4 M% z8 s) k" {) y
也就是说,两套代码,并不是真两个核,内部还是只有一个内核滴。4 i' D. n# J0 t6 ]- y

$ I) `" b/ e3 N( o- E# d
收藏 1 评论16 发布时间:2021-10-14 18:15

举报

16个回答
奇迹 回答时间:2021-10-20 18:03:40
不咸不要钱 发表于 2021-10-20 10:49' h/ W, m' _- L4 |1 l# ~8 ~
M33就是两个核啊,可以仿真以下看看为啥只有一个灯闪
, y* N" k- U. `# t: }9 t
你有测试过吗?M33只是为了安全在NVIC、MPU、SYSTICK等资源提供了双份,本身控制还在在切换安全区与非安全区运行实现的。核心资源只会提供一份的。
3 |! t3 M1 a" ^4 s4 h
6 r9 S- U, V& C  b( j
不咸不要钱 回答时间: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就是两个核啊,可以仿真以下看看为啥只有一个灯闪
% ?+ w% y! M  I# \5 G- d
liuxingkeji 回答时间:2021-10-27 10:12:50
不错, k  g6 I+ H1 l' b
子曰好人2号 回答时间:2021-10-27 10:13:32
这里不太懂,安全区的代码为什么没执行5 y) P0 L9 r+ A9 G
joshua天宇 回答时间:2021-10-27 10:24:32
不错,学习
2 {* ?3 i  s: X9 i
wudianjun2001 回答时间:2021-10-27 10:25:16
绝对666666               
0 M6 U" H! q: R2 O; _* I: a* g8 I2 |$ U
zhangt0713 回答时间:2021-10-27 10:35:12
谢谢分享3 w9 D! w% f: |
QIANYING79 回答时间:2021-10-27 14:30:05
有意思,学习了7 S# V) V' b( \* w9 s& j. ~  P: R
moluxiyan 回答时间:2021-10-27 16:17:02
安全区的代码为什么没执行,得看下回分解了
( q7 b) ?& L) q# v4 r% g3 H' J7 D1 }5 @3 k
orima 回答时间:2021-10-27 21:57:07
要动手操作一遍才行。。。
* @, H- ~3 [/ f. `5 E- H5 }; L: b
qiangtech 回答时间:2021-10-28 09:48:32
一个时间还是只能运行一个程序的,谢谢分享。
/ r8 ~: H3 T+ C; N4 N# ?
EricCheng 回答时间:2021-10-28 22:30:46
不是很理解两个区域是怎样运行的1 P, u4 P; X4 ]# \+ r
BEEE 回答时间:2021-10-28 23:45:09
想赶快使用ST新推出这款STM32U5系列产品,学习学习! @$ _2 A0 _0 |: N" j
; K; o. |; k* ^+ Q
朱贵和 回答时间:2021-10-30 09:47:34
绝对666666   
- z: F. d' w2 ^4 o( L$ D
12下一页

所属标签

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