308|3

181

帖子

5

资源

一粒金砂(高级)

[ ST NUCLEO-U575ZI-Q 测评] 6-TrustZone工程的启动流程 [复制链接]

TrustZone的工程中是包含2个工程文件的,安全区的工程和非安全区的工程。这两个工程是下载到不同的flash地址的。

TrustZone的工程要求从安全区的工程启动,然后在跳转到非安全区执行的。

这是因为需要在启动的时候设置安全属性,比如SAU、GTZC之类的安全外设,这些安全属性只能在安全区进行设置。因此安全区的工程下载到Flash的起始地址,0x08000000,但因为这是安全区的代码,因此实际上用的是0x08000000的别名地址0x0C000000,这2个地址实际上是同一个地址。别名区的概念在STM32F1时就出现过,当时的位带区也是别名区的一种。当安全区的工程配置好安全属性之后,就要跳转到非安全区了。非安全区的代码下载到另一个地址,比如0x08100000。当然这个地址取决于用户是如何划分Flash的区域的,这个地址是可以更改的。

int main(void)
{
  /* SAU/IDAU, FPU and interrupts secure/non-secure allocation setup done */
  /* in SystemInit() based on partition_stm32u575xx.h file's definitions. */
  /* USER CODE BEGIN 1 */

  /* Enable SecureFault handler (HardFault is default) */
  SCB->SHCSR |= SCB_SHCSR_SECUREFAULTENA_Msk;

  /* STM32U5xx **SECURE** HAL library initialization:
       - Configure the Flash prefetch
       - Configure the Systick to generate an interrupt each 1 msec
       - Set NVIC Group Priority to 3
       - Low Level Initialization
     */
  /* MCU Configuration--------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* Configure the System Power */
  SystemPower_Config();
  /* GTZC initialisation */
  MX_GTZC_S_Init();
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ICACHE_Init();
  /* All IOs are by default allocated to secure */
  /* Release them all to non-secure except PC.07 (LED1) kept as secure */
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOE_CLK_ENABLE();
  __HAL_RCC_GPIOF_CLK_ENABLE();
  __HAL_RCC_GPIOG_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  HAL_GPIO_ConfigPinAttributes(GPIOA, GPIO_PIN_ALL, GPIO_PIN_NSEC);
  HAL_GPIO_ConfigPinAttributes(GPIOB, GPIO_PIN_ALL, GPIO_PIN_NSEC);
  HAL_GPIO_ConfigPinAttributes(GPIOC, (GPIO_PIN_ALL & ~(GPIO_PIN_7)), GPIO_PIN_NSEC);
  HAL_GPIO_ConfigPinAttributes(GPIOD, GPIO_PIN_ALL, GPIO_PIN_NSEC);
  HAL_GPIO_ConfigPinAttributes(GPIOE, GPIO_PIN_ALL, GPIO_PIN_NSEC);
  HAL_GPIO_ConfigPinAttributes(GPIOF, GPIO_PIN_ALL, GPIO_PIN_NSEC);
  HAL_GPIO_ConfigPinAttributes(GPIOG, GPIO_PIN_ALL, GPIO_PIN_NSEC);
  HAL_GPIO_ConfigPinAttributes(GPIOH, GPIO_PIN_ALL, GPIO_PIN_NSEC);
  /* Secure SysTick should rather be suspended before calling non-secure  */
  /* in order to avoid wake-up from sleep mode entered by non-secure      */
  /* The Secure SysTick shall be resumed on non-secure callable functions */
  /* For the purpose of this example, however the Secure SysTick is kept  */
  /* running to toggle the secure IO and the following is commented:      */
  /* HAL_SuspendTick(); */
  /*************** Setup and jump to non-secure *******************************/
  NonSecure_Init();

  /* Non-secure software does not return, this code is not executed */
  /* Infinite loop */
  while (1);
}

上面的代码是位于安全区的工程main函数,从中可以看出其启动流程是:

  1. 设置安全属性,包括SAU、GTZC。在GTZC中要设置SRAM的安全区地址和非安全区地址,为外设分配安全属性。
  2. 为非安全区分配资源,包括GPIO、中断和DMA。从下图中,可以看出在复位之后,有的外设是安全区,有的外设是非安全的。如果要在非安全的工程中使用处于安全区的外设,就要进行配置,将其分配到非安全区。例如GPIO全部位于安全区,如果在非安全区要用到UART或者GPIO,那么就要将对应的引脚分配到非安全区。 2023-01-07-09-13-18.png
  3. 安全区外设的初始化,初始化在安全区使用的外设。
  4. 跳转到非安全区,那么如何从安全区跳转到非安全区呢?跳转函数如下所示。
#define VTOR_TABLE_NS_START_ADDR  0x08100000UL

static void NonSecure_Init(void)
{
  funcptr_NS NonSecure_ResetHandler;
  SCB_NS->VTOR = VTOR_TABLE_NS_START_ADDR;
  /* Set non-secure main stack (MSP_NS) */
  __TZ_set_MSP_NS((*(uint32_t *)VTOR_TABLE_NS_START_ADDR));
  /* Get non-secure reset handler */
  NonSecure_ResetHandler = (funcptr_NS)(*((uint32_t *)((VTOR_TABLE_NS_START_ADDR) + 4U)));
  /* Start non-secure state software application */
  NonSecure_ResetHandler();
}

这个代码和IAP的代码挺像的,都是实现了程序区的跳转。步骤如下:

  1. 将非安全区的中断向量表赋值给程序控制块。
  2. 设置使用的栈顶地址,需要注意的是内核的SP寄存器(栈顶指针寄存器)是有2个的,分别用于安全区和非安全区,所以这个实际上设置的是非安全区的栈顶指针。
  3. 最后跳转到非安全区的重启函数出。

从上面的内容中,可以看出STM32启动的时候先运行安全区的代码,将安全属性、外设资源等分配好,就会跳转到非安全区的main函数执行。因此代码主要执行非安全区的代码,非安全区的代码可以通过NSC函数调用安全区的函数实现两个区域的交互。

此帖出自RF/无线论坛

回复

2883

帖子

3

资源

版主

感谢分享
此帖出自RF/无线论坛

回复

4675

帖子

0

资源

五彩晶圆(中级)

STM32启动的时候先运行安全区的代码确实这样,最后的总结写的好,谢谢

此帖出自RF/无线论坛

回复

1万

帖子

2854

资源

管理员

测评汇总:免费申请|ST NUCLEO-U575ZI-Q http://bbs.eeworld.com.cn/thread-1228653-1-1.html

此帖出自RF/无线论坛

扫一扫,关注 EEWORLD 微信订阅号

行业资讯、电子趣闻、技术干货、精彩活动……尽可掌握~

个人签名

玩板看这里:

http://bbs.eeworld.com.cn/elecplay.html

EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!


回复
您需要登录后才可以回帖 登录 | 注册

相关帖子
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/5 下一条

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表