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

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

[复制链接]
奇迹 发布时间:2021-10-14 18:15
首先需要使用STM32CubeProgrammer软件对芯片的模式进行配置。" R# b0 U! {' r( ~, X9 i
QQ截图20211009140413.png ' O5 P! T. @* }' R; {  C, R
连接上芯片后,选择OB选型卡,找到User Configuration! R" u* Z+ l0 ~2 e" r

5 f7 i/ \6 c6 Q" g8 L% A1 A. G, k将其中的TZEN选项打上对号,使用Apply写入到芯片。" `9 f" e% V- `0 @2 o7 M
QQ截图20211009122748.png 2 y1 J1 r6 v0 N

' j/ Z& R2 a) b, J如图所示配置Secure Area 1与Secure Area 2选项,使用Apply写入到芯片。
1 o$ {. T1 z$ }8 S4 S- c QQ截图20211009130918.png 1 l' @1 H2 _) p) @" l% |2 y
& k( L; r; L% J% i8 _
打开STM32CubeMX,找到STM32U585AI,这一次就要选择第二项开启TrustZone了。. m# b# a/ y, g7 `$ W
QQ截图20211009123049.png
/ c$ r* y( U) b2 s& n& t" V9 @9 X
' f3 J; m. ?- V0 t/ ^看看新的外设界面,嗯,与之前大大不同啊。
/ d% l9 M% u/ Q* D% U" E1 W QQ截图20211009123436.png 4 M) C) K# ]  Q" B; I5 |/ t2 T

, ]0 b( \# V% x( s简单配一下时钟。0 g0 k: D# x* a5 f
QQ截图20211009144914.png 2 l( K$ Y' Q/ O3 G, f

1 Z7 V' K. v% T  R9 L# a, L配一下SWD,这里就让他使用安全区域那边的初始化。4 [$ V5 F* P* @2 ?! c
QQ截图20211009123445.png ! U/ O  B# J0 ?4 }" ^. k* W: U5 M% Z1 A

1 `6 J9 o" ~: C2 h4 I配一下IO,就是板子上的两个小灯,一个配置到安全区域、一个配置到非安全区域。
7 @; F' N% m" L6 Z QQ截图20211009123622.png ) q& x6 v& X& H5 H! m
9 {! b) E: _; `- T5 v
生成代码,打开keil,嚯,两个工程啊(工程之间的区别以后再聊)。7 v- ^1 z/ Z( r& w* c
QQ截图20211009123724.png
7 F! n- X5 x# g& O/ K9 x+ c8 R
8 i( Y2 _2 P! |; J0 r! T( F右键可以切换选中工程。
1 s6 F3 N; @& P/ z& r$ K QQ截图20211009145205.png
' L$ H" V, q" c6 F9 X+ N. C! G3 }
看看代码7 d, l) z/ q$ n6 {- U: _( l+ ]9 }
安全区域的GPIO初始化- G/ A# u* r8 B& t1 k6 D' G2 n
  1. void MX_GPIO_Init(void)' O0 c8 v8 j$ z6 W; j/ z$ r
  2. {8 w9 X1 l) J2 B
  3. " d! k% I3 j/ S) E9 J8 c, ~) C
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};! N) f8 r/ m8 _; [. r( Q$ H6 Z
  5. 4 q# {5 U/ v2 a3 q1 g  k! U- S6 P
  6.   /* GPIO Ports Clock Enable */
    ) d6 A$ {5 B+ N& k
  7.   __HAL_RCC_GPIOA_CLK_ENABLE();3 Q, W( f0 R) c
  8.   __HAL_RCC_GPIOH_CLK_ENABLE();: }8 q, b! ]4 X% H$ W

  9. 8 {$ F1 c% \7 D3 n
  10.   /*Configure GPIO pin Output Level */* Z/ J% U- S& r6 ?
  11.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_RESET);
    3 G9 C+ z, H' o  K( h
  12. 8 m$ l6 q6 L. [' w; g
  13.   /*IO attributes management functions */4 U3 A' s+ v9 p# S& j
  14.   HAL_GPIO_ConfigPinAttributes(GPIOH, GPIO_PIN_6, GPIO_PIN_NSEC);% H% d" `( p& R- W& j; o
  15. ) R( \4 B* @% P: W; d$ U
  16.   /*Configure GPIO pin : PH7 */
    4 x3 n( C. T) n0 u0 O4 U4 e
  17.   GPIO_InitStruct.Pin = GPIO_PIN_7;& j( N0 |& Q4 z! X+ C0 L7 E
  18.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    + \+ P- A% Y; N( J
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;' H* f3 H. C! \
  20.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;0 ?; K' n3 ?1 [3 o4 Z$ V# [+ n
  21.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
    + y7 c7 G$ I. R& c. m, a' x; X
  22.   _% A+ S% L# t/ g7 w0 V
  23. }
复制代码
; A6 B. ^; y* U, S7 Q( [
非安全区域的GPIO初始化& j' l. c0 u4 k( Y
  1. void MX_GPIO_Init(void)
    , W1 [9 T/ U7 d
  2. {
    ' p, T) f' s6 P+ g0 e
  3. # E! S* N, _, U- ]+ m
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    / T9 K' y6 F# q$ y
  5.   e7 u1 Z: a% v% T% m/ n# f' `
  6.   /* GPIO Ports Clock Enable */
    8 }, h  }' W7 y4 A
  7.   __HAL_RCC_GPIOH_CLK_ENABLE();$ h! Y( z  h1 e. a  i( A3 p+ z5 q
  8. 9 t6 K( }: f- G  p/ s1 i
  9.   /*Configure GPIO pin Output Level */
    . k( b1 O& g+ t4 X) I: [
  10.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_6, GPIO_PIN_RESET);% S& M" }; B, @& q

  11. / M4 D9 D4 X8 U* F
  12.   /*Configure GPIO pin : PH6 */9 n( q9 E' q4 U+ I: y% c  ~1 s! B# m4 l
  13.   GPIO_InitStruct.Pin = GPIO_PIN_6;/ d1 [5 n1 ?& }3 A+ Y/ x9 l
  14.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;  q3 }5 Q7 B% p: ?) u
  15.   GPIO_InitStruct.Pull = GPIO_NOPULL;9 e2 }7 h9 P. d4 \
  16.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;/ g; C; F9 V' d4 i& F/ u
  17.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
    " r& E/ ]' }" `5 z

  18. ! R+ u3 s7 }! Z' N7 u! }* ^' e
  19. }
复制代码

8 ^4 ^/ Q7 X- [: j. T: Q区分还是很明显的。
; Q- O- T2 C3 G3 C1 s" W7 `2 y
8 s4 F* G3 Q) w9 h6 ^% Z3 \接下来写写代码看看( n( A) r/ g. N" w" \* W) r
安全区域
( L# W: }0 ^1 X$ Q) n
  1. while (1)6 u# d2 J& |0 b0 r' ]/ q2 H+ p
  2.   {; z; r8 t7 G* M3 @# |6 ?
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_7);: M( A9 v* j# X" T! w
  4.     HAL_Delay(1000);3 g9 i9 u# Z0 G9 |/ k! `
  5.     /* USER CODE END WHILE */
    2 `$ {8 r/ ]1 X1 w/ a

  6. + t& v6 L3 j1 p! p5 T8 X
  7.     /* USER CODE BEGIN 3 */
    " e" y$ F0 d% ~7 z$ `4 {. u( J
  8.   }
复制代码
9 r7 a! B1 l1 T# @
非安全区域
7 \$ q9 n3 i) g, i! T2 F
  1. while (1): w! V' q7 v! K* V5 O: q) {" o
  2.   {
    1 R% s* n6 B; H' U) h$ U1 O
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_6);6 l& Z+ O6 ]3 Y6 z" D1 |  v6 C
  4.     HAL_Delay(1000);
    + ~) o# M. C( t3 ^3 A. x* l1 Z! X+ I2 a
  5.     /* USER CODE END WHILE */
    * I! u8 F2 Z! S5 |7 a
  6. ' r4 }6 L2 T& M9 N% \- T- S4 e
  7.     /* USER CODE BEGIN 3 */
    - Y; o% M+ K+ _7 `
  8.   }
复制代码
/ F4 j3 e' Z# H  W5 H
写了两个闪灯的程序,各自是各自的。看看会发生什么。把两个代码都下载到芯片内部。
9 m- A3 [' o: ~: ?5 x( L5 b5 B- [& k
" ]4 P! w8 h( u" s, {# U结果是,非安全区的代码while(1)里面的代码正常执行,而安全区while(1)里面的代码没有正常执行。板卡红灯闪烁,而绿灯常亮(图片看不太出来)。8 e  C5 M  W  }/ Z# x0 _
IMG_20211009_145539.jpg
* T3 B' ]3 v/ N& {/ ?- R. y原因也很简单,安全区代码是上电之后优先执行的,然后运行到NonSecure_Init,把非安全区堆栈初始化好,然后调用非安全区的复位函数(具体调用方式与逻辑请关注后续文章)。然后代码就跳转到非安全区了。
& j& W5 X2 e. m
3 w, O- P9 R) P+ l( _, h也就是说,两套代码,并不是真两个核,内部还是只有一个内核滴。
+ ~5 v4 X9 W9 w: R$ N$ v( Y5 z  {* x+ V
收藏 1 评论16 发布时间:2021-10-14 18:15

举报

16个回答
奇迹 回答时间:2021-10-20 18:03:40
不咸不要钱 发表于 2021-10-20 10:49& D; m6 o: m# `1 P7 V
M33就是两个核啊,可以仿真以下看看为啥只有一个灯闪
) E9 F) {  V/ Z! s3 j2 |' V7 l! U" d
你有测试过吗?M33只是为了安全在NVIC、MPU、SYSTICK等资源提供了双份,本身控制还在在切换安全区与非安全区运行实现的。核心资源只会提供一份的。
  A8 _; r! B: V3 w2 P8 X3 f# Y* z: S% N/ M9 w5 b5 W" @; ?
不咸不要钱 回答时间: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就是两个核啊,可以仿真以下看看为啥只有一个灯闪
2 _+ W* P: L2 k
liuxingkeji 回答时间:2021-10-27 10:12:50
不错
" J  S8 T( n: U
子曰好人2号 回答时间:2021-10-27 10:13:32
这里不太懂,安全区的代码为什么没执行
* A* L. U' x: S* X
joshua天宇 回答时间:2021-10-27 10:24:32
不错,学习
' ~3 K% K- [  }# S
wudianjun2001 回答时间:2021-10-27 10:25:16
绝对666666               
( O" X; V/ h- T% P
zhangt0713 回答时间:2021-10-27 10:35:12
谢谢分享
& u) F3 r; o& R9 C: T( z
QIANYING79 回答时间:2021-10-27 14:30:05
有意思,学习了
- G4 o# w0 v3 w: a% h) Y: c$ Z( c
moluxiyan 回答时间:2021-10-27 16:17:02
安全区的代码为什么没执行,得看下回分解了" f+ J# [9 q/ u- L& y
& n7 h1 K; Q4 W& x0 m
orima 回答时间:2021-10-27 21:57:07
要动手操作一遍才行。。。2 i- S9 P! ?  ^+ \! I1 x* K9 ~
qiangtech 回答时间:2021-10-28 09:48:32
一个时间还是只能运行一个程序的,谢谢分享。
9 m( X! y% Q+ X2 w, U. ^" T
EricCheng 回答时间:2021-10-28 22:30:46
不是很理解两个区域是怎样运行的
, @/ G% k' u, G# U% v" _/ K) T' D: U
BEEE 回答时间:2021-10-28 23:45:09
想赶快使用ST新推出这款STM32U5系列产品,学习学习
/ G' E' ~" M) O' k3 L* ?+ {7 N: J7 m+ r# p5 D, S
朱贵和 回答时间:2021-10-30 09:47:34
绝对666666   
' x3 f( R' T& f1 O, b
12下一页

所属标签

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