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

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

[复制链接]
奇迹 发布时间:2021-10-14 18:15
首先需要使用STM32CubeProgrammer软件对芯片的模式进行配置。
  `1 O, v0 }1 Z QQ截图20211009140413.png ) ?4 _: p2 [7 E1 B$ B) `
连接上芯片后,选择OB选型卡,找到User Configuration% j# I* O4 A. Q3 n: u
2 [4 w8 E1 M$ [
将其中的TZEN选项打上对号,使用Apply写入到芯片。* y8 H) L: u. ]) J; b9 A5 T& X
QQ截图20211009122748.png 8 K& w- a8 g5 j  X
- c/ C6 F# Z% ~: f, g+ S* J
如图所示配置Secure Area 1与Secure Area 2选项,使用Apply写入到芯片。
* W: o, w( t& O QQ截图20211009130918.png
. q. \5 C5 Y2 r0 Z3 p; n! D2 @0 ^; D0 G& b. k7 y: G
打开STM32CubeMX,找到STM32U585AI,这一次就要选择第二项开启TrustZone了。
7 w& A) A& i# ~" j$ t( K8 v QQ截图20211009123049.png
' E8 w: r8 \3 O! p7 |7 f. V4 g- Z8 o; b7 W3 m
看看新的外设界面,嗯,与之前大大不同啊。
: O% k5 p+ g5 H" u) D+ _ QQ截图20211009123436.png
1 V8 \8 W; y, u# k
1 ^" m) n1 T  f  O% Q& G9 w简单配一下时钟。
% S: N  d, T+ \8 w1 O QQ截图20211009144914.png : a: H2 W5 p# U& ?

& s" P4 Z" i5 r* b* G3 ]7 W- C配一下SWD,这里就让他使用安全区域那边的初始化。
- e" R+ V3 O) q QQ截图20211009123445.png 4 U0 c1 J- C" I: H. s( I

" B3 |4 t8 R0 P& Y$ U3 |4 Y& A配一下IO,就是板子上的两个小灯,一个配置到安全区域、一个配置到非安全区域。
" u' A4 [7 l# A6 U0 E QQ截图20211009123622.png   G0 X/ c3 u7 [; I- z; t# Y
! ]/ X- X2 x* [! j) K4 [
生成代码,打开keil,嚯,两个工程啊(工程之间的区别以后再聊)。! F: ?+ H2 |; i, J, g5 f
QQ截图20211009123724.png
, K# O! a2 t3 i$ `4 j( z3 ^6 ~& x4 s9 }* i0 o  Y% d( _
右键可以切换选中工程。5 x6 y6 J8 x, S
QQ截图20211009145205.png - D5 @  d3 h/ g* h) G) c6 y

4 N7 N  p' U# L" Q5 O& v9 ~看看代码8 s: h4 s  O! _2 d- t: T. P! `
安全区域的GPIO初始化
5 A8 i$ N5 M7 |! q2 w
  1. void MX_GPIO_Init(void)
    " P0 B1 {/ l0 X% [
  2. {
    4 J- [) w" k7 _6 p) ]& p
  3. : c' O3 o; t3 i$ S6 p& D5 @
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};  l: n3 q+ G/ p. B$ C' g4 t0 i3 z
  5.   H+ ^* X3 M2 b3 h1 m0 y) M
  6.   /* GPIO Ports Clock Enable */1 P3 g: o0 E7 K0 a
  7.   __HAL_RCC_GPIOA_CLK_ENABLE();3 x5 a0 g8 \5 |4 B
  8.   __HAL_RCC_GPIOH_CLK_ENABLE();/ ]6 X2 K4 Z! m% N, Z% g
  9. ! _- j9 l5 X" S
  10.   /*Configure GPIO pin Output Level */
    + t/ ^4 Y+ J7 G
  11.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_RESET);
    $ R2 U" M2 B) h9 m! `) f' S7 W

  12. % B- k4 m. B# x/ w  g. o
  13.   /*IO attributes management functions */
    / t7 m. b4 o( R
  14.   HAL_GPIO_ConfigPinAttributes(GPIOH, GPIO_PIN_6, GPIO_PIN_NSEC);; k) i' x; S  s5 |8 ~6 C
  15. # O0 ]' ?. t: T$ ~2 g9 g- b
  16.   /*Configure GPIO pin : PH7 */  q: ?( N# n! x) i
  17.   GPIO_InitStruct.Pin = GPIO_PIN_7;
    / c, l0 w( b- w+ T. T3 @* z* ^+ [
  18.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;: D5 n( ~9 X7 G7 b5 t3 W0 i, {5 z( U
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;8 x, Z* _6 n. B, N3 O9 _6 n% h4 d
  20.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    ( |9 m' K' F( w* S5 o
  21.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);8 r1 O' p4 o8 g! v; h
  22. 1 n) V1 M- c, _; i( ~5 Z
  23. }
复制代码
2 U1 ~+ Q' i6 `' T* E
非安全区域的GPIO初始化
- c- U' c  A. y& }* ^# c' V
  1. void MX_GPIO_Init(void)5 B! j! T4 [, H: Y0 _
  2. {; I8 }5 A5 C  V7 r$ b0 Z$ o
  3. ! O. ^0 g; p' ]* ]  Y  D$ C
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    8 y5 [" H6 J' p$ W
  5. + q( g+ Q* _5 l0 S- ?
  6.   /* GPIO Ports Clock Enable */8 l; ?4 {1 {! Z9 M: z1 _
  7.   __HAL_RCC_GPIOH_CLK_ENABLE();
    : E6 g3 n1 v- ]% o

  8. 8 z; |9 r' x0 L3 n) T
  9.   /*Configure GPIO pin Output Level */# ~7 _! h( t0 e; z
  10.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_6, GPIO_PIN_RESET);
    ! A7 Z1 I# ^/ R3 K- _1 H

  11. 9 f: V, R( I4 r+ p
  12.   /*Configure GPIO pin : PH6 *// V3 G1 n6 R' c4 O% O0 r
  13.   GPIO_InitStruct.Pin = GPIO_PIN_6;: `2 B2 o2 @# o: o
  14.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;" O- f& Q& j9 F' E) w
  15.   GPIO_InitStruct.Pull = GPIO_NOPULL;/ \- d( e" ~' b; z7 @* c6 N! A! ?/ w5 J
  16.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    " w" c7 w, K- p1 D' O  P: m: ~9 F
  17.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
    . E" E* ?- U! E9 }' N8 d% ~3 Q% a
  18. & b9 t2 S$ N. b' r6 N1 H; @
  19. }
复制代码

5 E$ ?- y+ {, |区分还是很明显的。
" z' }& _# u( s: s. P2 M
8 r4 Y# Y( ]& N! U9 E. H; Y接下来写写代码看看, B2 j4 F, [5 V4 [$ H
安全区域# d+ S, Y" A4 j7 a) d
  1. while (1)
    9 g! H; @% f7 \) |
  2.   {
    8 D8 ^) }: E% \0 n# F; b2 l9 e2 K* J
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_7);3 v5 A0 e1 l+ K% v4 K* T
  4.     HAL_Delay(1000);
    , }8 _+ L9 U6 h: b; f* ~1 U7 f
  5.     /* USER CODE END WHILE */
    ' p, n" s4 R  t* {

  6. 8 M7 m+ R, \6 D5 G
  7.     /* USER CODE BEGIN 3 */
    ) @( O! v5 @- M* H& ~
  8.   }
复制代码
( G- U1 g+ m* v- Q+ T
非安全区域& [" \  J- H7 K: ~  s' _# ~
  1. while (1)
    # L$ K5 l" d! i/ f+ `$ u
  2.   {' `% u. T: f5 ]0 ~2 u# s( T
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_6);
    ( i3 T- x! I" \) o' g7 k
  4.     HAL_Delay(1000);, u1 _7 g2 Q! p
  5.     /* USER CODE END WHILE */
    " {) h2 c$ K7 }9 R

  6. 5 s5 T$ R+ f! z" d/ L* J
  7.     /* USER CODE BEGIN 3 */
    5 O3 T2 [+ Q$ C/ D+ b
  8.   }
复制代码

- x! s: u+ g: @! L- n写了两个闪灯的程序,各自是各自的。看看会发生什么。把两个代码都下载到芯片内部。
  F3 Z0 A, L/ V. a# k4 |6 C& x& f1 M) v$ h
结果是,非安全区的代码while(1)里面的代码正常执行,而安全区while(1)里面的代码没有正常执行。板卡红灯闪烁,而绿灯常亮(图片看不太出来)。( p' H! `+ L) V2 y) Z% k  V, n5 p
IMG_20211009_145539.jpg ! B3 X- j9 J7 D% D2 a  u2 ?
原因也很简单,安全区代码是上电之后优先执行的,然后运行到NonSecure_Init,把非安全区堆栈初始化好,然后调用非安全区的复位函数(具体调用方式与逻辑请关注后续文章)。然后代码就跳转到非安全区了。
% R# p1 q& t3 U9 g* L% b
5 s) k; E9 t0 Z也就是说,两套代码,并不是真两个核,内部还是只有一个内核滴。+ T7 w9 m: E/ o0 _0 Y- `) b& s

1 o& z( N" M9 K$ c1 p8 |& i7 ?
赞 收藏 1 评论16 发布时间:2021-10-14 18:15

举报

16个回答
奇迹 回答时间:2021-10-20 18:03:40
不咸不要钱 发表于 2021-10-20 10:49; [9 S7 Y) j4 R; A, j
M33就是两个核啊,可以仿真以下看看为啥只有一个灯闪

  b$ J, J/ ], G你有测试过吗?M33只是为了安全在NVIC、MPU、SYSTICK等资源提供了双份,本身控制还在在切换安全区与非安全区运行实现的。核心资源只会提供一份的。
: W* x5 B7 ~5 A! w# J7 h( N/ R- r/ l7 G5 c$ h0 l1 y3 _+ y
不咸不要钱 回答时间: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就是两个核啊,可以仿真以下看看为啥只有一个灯闪7 {( M$ B9 [; Z+ b2 I( S, p
liuxingkeji 回答时间:2021-10-27 10:12:50
不错9 q4 w9 U6 `2 C$ f
子曰好人2号 回答时间:2021-10-27 10:13:32
这里不太懂,安全区的代码为什么没执行7 q6 A, A6 h- G2 r3 k$ u( o5 p
joshua天宇 回答时间:2021-10-27 10:24:32
不错,学习7 @0 i' T0 s* J. s: H* D7 H4 R
wudianjun2001 回答时间:2021-10-27 10:25:16
绝对666666               1 h3 I- H- N+ N' o
zhangt0713 回答时间:2021-10-27 10:35:12
谢谢分享
* L7 o/ h" `8 L1 W$ a3 X
QIANYING79 回答时间:2021-10-27 14:30:05
有意思,学习了4 z" W& x. Z1 R* R4 ]! m
moluxiyan 回答时间:2021-10-27 16:17:02
安全区的代码为什么没执行,得看下回分解了
2 F2 W. o4 c4 m+ S& ], |5 h7 O- C7 f' P0 X" p, ~" J6 m
orima 回答时间:2021-10-27 21:57:07
要动手操作一遍才行。。。! G! u% t8 T* a9 ^2 M
qiangtech 回答时间:2021-10-28 09:48:32
一个时间还是只能运行一个程序的,谢谢分享。2 V/ n! s7 ?3 J. P
VegardCheng 回答时间:2021-10-28 22:30:46
不是很理解两个区域是怎样运行的/ d5 X% r* D8 N7 F
BEEE 回答时间:2021-10-28 23:45:09
想赶快使用ST新推出这款STM32U5系列产品,学习学习/ K& p7 _+ F! E4 _/ c  k- j
& I. N! g. ]( z5 x& n! r
朱贵和 回答时间:2021-10-30 09:47:34
绝对666666   

) x) S( R3 e% {  t8 K/ }& N+ X7 x
12下一页

所属标签

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