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

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

[复制链接]
奇迹 发布时间:2021-10-14 18:15
首先需要使用STM32CubeProgrammer软件对芯片的模式进行配置。, U1 Y" R% w! T: e/ W/ k! I
QQ截图20211009140413.png 7 d) `* S3 V& C5 K
连接上芯片后,选择OB选型卡,找到User Configuration8 k& }& X( M5 _9 ?5 y5 d
; b: d* ^: N% f
将其中的TZEN选项打上对号,使用Apply写入到芯片。: Y% @# s, ?% Q' k  u/ r
QQ截图20211009122748.png 6 C. r7 X9 @! u/ ?8 c
) b. V0 k% b, W; O, j
如图所示配置Secure Area 1与Secure Area 2选项,使用Apply写入到芯片。
5 g6 N% I+ K& { QQ截图20211009130918.png
$ l, o# s. y8 x. s2 y2 V4 u' B0 P9 e4 A7 g# P
打开STM32CubeMX,找到STM32U585AI,这一次就要选择第二项开启TrustZone了。
  a& G5 @6 U' e* B QQ截图20211009123049.png
2 L, N. ^1 Z; f' E$ K; p% G3 M) x+ H# V6 c% m2 }0 Y. h
看看新的外设界面,嗯,与之前大大不同啊。. |! _/ W$ S+ s- N' f4 N4 r3 C4 ~+ Q
QQ截图20211009123436.png 6 s- M5 e) H. h. M
1 m; t; E% c( [4 e1 U: D
简单配一下时钟。
5 |* s4 u% _" a5 [4 t QQ截图20211009144914.png 2 Q( {+ `1 ~+ H' p' G) `
7 k6 b( R6 j$ V( B2 Q2 q
配一下SWD,这里就让他使用安全区域那边的初始化。' ], C# {) Z; [. G0 w0 Q# S* Z
QQ截图20211009123445.png
$ W+ L$ p( E' @0 l* v! G
* q  x3 ]4 F8 N9 ]+ S( d# b配一下IO,就是板子上的两个小灯,一个配置到安全区域、一个配置到非安全区域。
6 [1 D  {. @7 B( Y* U$ c QQ截图20211009123622.png
5 C6 Q) V2 W+ H9 M* ~; W4 o. W, k( M3 b* e2 g3 a
生成代码,打开keil,嚯,两个工程啊(工程之间的区别以后再聊)。; Q# ~' Y6 U- y3 w( d% A
QQ截图20211009123724.png
$ U6 V4 G$ h! i+ S1 v! j6 b) _$ A
- e5 `9 G* W4 S* m& y- Z6 Y$ j右键可以切换选中工程。, J: p7 @1 c) C0 F' o2 i9 k, O
QQ截图20211009145205.png
+ _6 t- R4 S1 g) A" z
- s& O, S  U% Z) ^2 T看看代码
, @+ z) ]* X4 A% j# W9 I7 C安全区域的GPIO初始化
. n7 n: H; m# f9 S
  1. void MX_GPIO_Init(void)
    2 [. S$ @7 }, x8 K, P% Y
  2. {
    5 I3 t2 G* K; c6 x6 r$ K; a0 l3 M$ {
  3. 1 V# s5 u2 o- E- q# l3 m
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    ( J& I# O8 Y+ n: f

  5.   X  M! ~+ A/ i2 I# n/ O) T
  6.   /* GPIO Ports Clock Enable */
      j! b5 u9 r  a: U
  7.   __HAL_RCC_GPIOA_CLK_ENABLE();
    4 k3 ~' D8 @9 T0 S9 a
  8.   __HAL_RCC_GPIOH_CLK_ENABLE();
    6 m5 _/ S3 D# s( P

  9. 9 g6 C; d3 J+ K- X
  10.   /*Configure GPIO pin Output Level */
    2 d& R/ S+ T( E7 x, E+ ]% P
  11.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_RESET);
    5 |0 b: L$ J! W; \/ N' F, _9 E! J
  12. " [7 F2 u% y7 N, T  v: t! b( v9 X+ P
  13.   /*IO attributes management functions */
    : Q! @- k0 }! A8 C& U
  14.   HAL_GPIO_ConfigPinAttributes(GPIOH, GPIO_PIN_6, GPIO_PIN_NSEC);
    ; K# H1 B) g7 C9 G
  15. - M, d+ ]$ r- k8 h
  16.   /*Configure GPIO pin : PH7 */! {1 V9 t5 `$ x/ f. x
  17.   GPIO_InitStruct.Pin = GPIO_PIN_7;8 f0 e( o3 P' i
  18.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;3 y8 Q. ?6 {/ t2 c# K
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    ! `% M  V* @- x9 e
  20.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    5 R/ t6 c6 S1 p( h, W; `( [6 P) D
  21.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);0 R# L6 m& e' U. U0 d8 ~

  22. % e7 y$ S! e3 w: ]/ l: T: L9 T
  23. }
复制代码
) X7 n5 ?  ?- Z7 t0 M% U% f1 w
非安全区域的GPIO初始化- w5 G: P. ~) w9 d
  1. void MX_GPIO_Init(void), ~# x. P& }3 U- U& ]
  2. {9 H2 i: m$ F8 y5 K

  3. ( I, @3 I, r+ G: D# V
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    ; n" d  U9 `, x! o; s% M: ]" n! I
  5. 2 Q0 v4 ^$ }; M: i. a5 G
  6.   /* GPIO Ports Clock Enable */
      [2 e0 h8 T. ?
  7.   __HAL_RCC_GPIOH_CLK_ENABLE();9 i8 b. X$ _  r+ t  T' f# [2 H" n/ E

  8. 9 o- P( o# q4 @
  9.   /*Configure GPIO pin Output Level */
    & @% L2 R: a8 j3 |) ?& K
  10.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_6, GPIO_PIN_RESET);. |: J2 w& |0 [, E1 R

  11. # \* l  w  K& N1 J* t: {( S
  12.   /*Configure GPIO pin : PH6 */
    4 x. Z/ U7 ^% ?6 _, Z7 o4 j
  13.   GPIO_InitStruct.Pin = GPIO_PIN_6;! u8 K7 u- U% [1 W: V
  14.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    2 q8 J/ C- n( G+ I$ y4 r  r
  15.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    ! o6 A9 ^' i6 W
  16.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;6 o( Y1 |* y; \4 L  n
  17.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
    % E0 ]: T2 u6 o! Q$ R
  18. 8 l  Y0 j* `* Z6 J' Y; K
  19. }
复制代码
& X5 M! R" z8 r5 ^1 Y
区分还是很明显的。
& z! i! N5 P3 e2 o  H$ u. P2 u+ v$ I% n3 k
接下来写写代码看看+ q  D' N* s4 _" P
安全区域3 z7 S% Q4 B3 R1 ?/ o
  1. while (1)0 p* Y. o% ]' U2 ^* Q8 G
  2.   {
    + W& z% j5 f. ?' `
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_7);
    ) Q4 V; b6 q. W5 V$ ^9 S1 a3 ^; _) Q/ p
  4.     HAL_Delay(1000);
    - a3 \" W3 g0 K7 d
  5.     /* USER CODE END WHILE */
    1 T5 v, Z: x' _, c
  6. 7 a+ n$ U/ N8 E2 B  P0 g5 M
  7.     /* USER CODE BEGIN 3 */2 ?; G9 b" Q8 k0 \
  8.   }
复制代码

0 e1 c! d% l) F7 }非安全区域
, [1 P9 A7 p% D( o# p- V
  1. while (1)3 `. `( G( I4 K. v
  2.   {6 ^& F5 T# v8 `2 p
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_6);$ R( \( R+ f% w( [7 Y/ ~/ S0 C
  4.     HAL_Delay(1000);$ M7 c) v! N' S/ O
  5.     /* USER CODE END WHILE */4 K. S  [  |' C' u) G0 w, W1 C

  6. 9 y1 h7 ~. C% [
  7.     /* USER CODE BEGIN 3 */
    4 ?- j+ A5 l' j' {; f
  8.   }
复制代码
# J* }! A7 h2 [9 e. f
写了两个闪灯的程序,各自是各自的。看看会发生什么。把两个代码都下载到芯片内部。
7 s* |7 `/ R; m5 D0 I0 h! k0 D
" t0 O9 W1 v4 a( M$ f结果是,非安全区的代码while(1)里面的代码正常执行,而安全区while(1)里面的代码没有正常执行。板卡红灯闪烁,而绿灯常亮(图片看不太出来)。' u$ a+ V# W4 v- I  o/ U4 y- K0 t
IMG_20211009_145539.jpg , b2 |; g0 b1 Y) I3 u4 e* T2 \8 ?5 `
原因也很简单,安全区代码是上电之后优先执行的,然后运行到NonSecure_Init,把非安全区堆栈初始化好,然后调用非安全区的复位函数(具体调用方式与逻辑请关注后续文章)。然后代码就跳转到非安全区了。* J* m3 D5 v1 A' o- U) J
% H% ?; q9 a/ B: P  n- B
也就是说,两套代码,并不是真两个核,内部还是只有一个内核滴。: S  _; m5 Z5 L! g. H

; @& {2 r( m% ?0 \8 |9 ?/ }: c
收藏 1 评论16 发布时间:2021-10-14 18:15

举报

16个回答
奇迹 回答时间:2021-10-20 18:03:40
不咸不要钱 发表于 2021-10-20 10:49$ B/ R+ t, r2 x; X" H0 N
M33就是两个核啊,可以仿真以下看看为啥只有一个灯闪

  W1 Z1 i$ a, s% R你有测试过吗?M33只是为了安全在NVIC、MPU、SYSTICK等资源提供了双份,本身控制还在在切换安全区与非安全区运行实现的。核心资源只会提供一份的。0 F+ I" u, Y- V* p

5 c! W4 |# q+ c: A. k$ E8 X
不咸不要钱 回答时间: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就是两个核啊,可以仿真以下看看为啥只有一个灯闪& ^+ R) G* S/ u! a- R
liuxingkeji 回答时间:2021-10-27 10:12:50
不错/ X9 y" q. ~# W: O7 M
子曰好人2号 回答时间:2021-10-27 10:13:32
这里不太懂,安全区的代码为什么没执行
1 p$ _- w; V8 l
joshua天宇 回答时间:2021-10-27 10:24:32
不错,学习
9 f0 d- c, u4 {+ v$ _9 ^6 {
wudianjun2001 回答时间:2021-10-27 10:25:16
绝对666666               
) q+ G8 B1 t) ]$ d# G
zhangt0713 回答时间:2021-10-27 10:35:12
谢谢分享
/ b: v* K( H1 o0 ]+ c( f4 c
QIANYING79 回答时间:2021-10-27 14:30:05
有意思,学习了
0 ~/ ^0 r0 x+ @) c) ?, G4 m
moluxiyan 回答时间:2021-10-27 16:17:02
安全区的代码为什么没执行,得看下回分解了: f  f* d. \* Z/ V2 ?

5 B4 f  l" A) Z8 w8 U
orima 回答时间:2021-10-27 21:57:07
要动手操作一遍才行。。。; |. q+ I8 t( D- _" L
qiangtech 回答时间:2021-10-28 09:48:32
一个时间还是只能运行一个程序的,谢谢分享。5 {+ C" I/ a1 i' Y
EricCheng 回答时间:2021-10-28 22:30:46
不是很理解两个区域是怎样运行的' \9 C; g1 J4 z$ h, ?3 e8 x2 x
BEEE 回答时间:2021-10-28 23:45:09
想赶快使用ST新推出这款STM32U5系列产品,学习学习2 _; T8 _% u" v! c

. r" X* f% n9 _7 ^. V/ V
朱贵和 回答时间:2021-10-30 09:47:34
绝对666666   
- l2 K+ P' s( U  |# e+ |8 I
12下一页

所属标签

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