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

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

[复制链接]
奇迹 发布时间:2021-10-14 18:15
首先需要使用STM32CubeProgrammer软件对芯片的模式进行配置。
QQ截图20211009140413.png
连接上芯片后,选择OB选型卡,找到User Configuration

将其中的TZEN选项打上对号,使用Apply写入到芯片。
QQ截图20211009122748.png

如图所示配置Secure Area 1与Secure Area 2选项,使用Apply写入到芯片。
QQ截图20211009130918.png

打开STM32CubeMX,找到STM32U585AI,这一次就要选择第二项开启TrustZone了。
QQ截图20211009123049.png

看看新的外设界面,嗯,与之前大大不同啊。
QQ截图20211009123436.png

简单配一下时钟。
QQ截图20211009144914.png

配一下SWD,这里就让他使用安全区域那边的初始化。
QQ截图20211009123445.png

配一下IO,就是板子上的两个小灯,一个配置到安全区域、一个配置到非安全区域。
QQ截图20211009123622.png

生成代码,打开keil,嚯,两个工程啊(工程之间的区别以后再聊)。
QQ截图20211009123724.png

右键可以切换选中工程。
QQ截图20211009145205.png

看看代码
安全区域的GPIO初始化
  1. void MX_GPIO_Init(void)
  2. {

  3.   GPIO_InitTypeDef GPIO_InitStruct = {0};

  4.   /* GPIO Ports Clock Enable */
  5.   __HAL_RCC_GPIOA_CLK_ENABLE();
  6.   __HAL_RCC_GPIOH_CLK_ENABLE();

  7.   /*Configure GPIO pin Output Level */
  8.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_RESET);

  9.   /*IO attributes management functions */
  10.   HAL_GPIO_ConfigPinAttributes(GPIOH, GPIO_PIN_6, GPIO_PIN_NSEC);

  11.   /*Configure GPIO pin : PH7 */
  12.   GPIO_InitStruct.Pin = GPIO_PIN_7;
  13.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  14.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  15.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  16.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);

  17. }
复制代码

非安全区域的GPIO初始化
  1. void MX_GPIO_Init(void)
  2. {

  3.   GPIO_InitTypeDef GPIO_InitStruct = {0};

  4.   /* GPIO Ports Clock Enable */
  5.   __HAL_RCC_GPIOH_CLK_ENABLE();

  6.   /*Configure GPIO pin Output Level */
  7.   HAL_GPIO_WritePin(GPIOH, GPIO_PIN_6, GPIO_PIN_RESET);

  8.   /*Configure GPIO pin : PH6 */
  9.   GPIO_InitStruct.Pin = GPIO_PIN_6;
  10.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  11.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  12.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  13.   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);

  14. }
复制代码

区分还是很明显的。

接下来写写代码看看
安全区域
  1. while (1)
  2.   {
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_7);
  4.     HAL_Delay(1000);
  5.     /* USER CODE END WHILE */

  6.     /* USER CODE BEGIN 3 */
  7.   }
复制代码

非安全区域
  1. while (1)
  2.   {
  3.     HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_6);
  4.     HAL_Delay(1000);
  5.     /* USER CODE END WHILE */

  6.     /* USER CODE BEGIN 3 */
  7.   }
复制代码

写了两个闪灯的程序,各自是各自的。看看会发生什么。把两个代码都下载到芯片内部。

结果是,非安全区的代码while(1)里面的代码正常执行,而安全区while(1)里面的代码没有正常执行。板卡红灯闪烁,而绿灯常亮(图片看不太出来)。
IMG_20211009_145539.jpg
原因也很简单,安全区代码是上电之后优先执行的,然后运行到NonSecure_Init,把非安全区堆栈初始化好,然后调用非安全区的复位函数(具体调用方式与逻辑请关注后续文章)。然后代码就跳转到非安全区了。

也就是说,两套代码,并不是真两个核,内部还是只有一个内核滴。

收藏 1 评论16 发布时间:2021-10-14 18:15

举报

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

你有测试过吗?M33只是为了安全在NVIC、MPU、SYSTICK等资源提供了双份,本身控制还在在切换安全区与非安全区运行实现的。核心资源只会提供一份的。

不咸不要钱 回答时间: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就是两个核啊,可以仿真以下看看为啥只有一个灯闪
liuxingkeji 回答时间:2021-10-27 10:12:50
不错
子曰好人2号 回答时间:2021-10-27 10:13:32
这里不太懂,安全区的代码为什么没执行
joshua天宇 回答时间:2021-10-27 10:24:32
不错,学习
wudianjun2001 回答时间:2021-10-27 10:25:16
绝对666666               
zhangt0713 回答时间:2021-10-27 10:35:12
谢谢分享
QIANYING79 回答时间:2021-10-27 14:30:05
有意思,学习了
moluxiyan 回答时间:2021-10-27 16:17:02
安全区的代码为什么没执行,得看下回分解了

orima 回答时间:2021-10-27 21:57:07
要动手操作一遍才行。。。
qiangtech 回答时间:2021-10-28 09:48:32
一个时间还是只能运行一个程序的,谢谢分享。
VegardCheng 回答时间:2021-10-28 22:30:46
不是很理解两个区域是怎样运行的
BEEE 回答时间:2021-10-28 23:45:09
想赶快使用ST新推出这款STM32U5系列产品,学习学习

朱贵和 回答时间:2021-10-30 09:47:34
绝对666666   

12下一页

所属标签

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