首先需要使用STM32CubeProgrammer软件对芯片的模式进行配置。
连接上芯片后,选择OB选型卡,找到User Configuration
将其中的TZEN选项打上对号,使用Apply写入到芯片。
如图所示配置Secure Area 1与Secure Area 2选项,使用Apply写入到芯片。
打开STM32CubeMX,找到STM32U585AI,这一次就要选择第二项开启TrustZone了。
看看新的外设界面,嗯,与之前大大不同啊。
简单配一下时钟。
配一下SWD,这里就让他使用安全区域那边的初始化。
配一下IO,就是板子上的两个小灯,一个配置到安全区域、一个配置到非安全区域。
生成代码,打开keil,嚯,两个工程啊(工程之间的区别以后再聊)。
右键可以切换选中工程。
看看代码
安全区域的GPIO初始化
- void MX_GPIO_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- /* GPIO Ports Clock Enable */
- __HAL_RCC_GPIOA_CLK_ENABLE();
- __HAL_RCC_GPIOH_CLK_ENABLE();
- /*Configure GPIO pin Output Level */
- HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_RESET);
- /*IO attributes management functions */
- HAL_GPIO_ConfigPinAttributes(GPIOH, GPIO_PIN_6, GPIO_PIN_NSEC);
- /*Configure GPIO pin : PH7 */
- GPIO_InitStruct.Pin = GPIO_PIN_7;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
- }
复制代码
非安全区域的GPIO初始化
- void MX_GPIO_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- /* GPIO Ports Clock Enable */
- __HAL_RCC_GPIOH_CLK_ENABLE();
- /*Configure GPIO pin Output Level */
- HAL_GPIO_WritePin(GPIOH, GPIO_PIN_6, GPIO_PIN_RESET);
- /*Configure GPIO pin : PH6 */
- GPIO_InitStruct.Pin = GPIO_PIN_6;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
- }
复制代码
区分还是很明显的。
接下来写写代码看看
安全区域
- while (1)
- {
- HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_7);
- HAL_Delay(1000);
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- }
复制代码
非安全区域
- while (1)
- {
- HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_6);
- HAL_Delay(1000);
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- }
复制代码
写了两个闪灯的程序,各自是各自的。看看会发生什么。把两个代码都下载到芯片内部。
结果是,非安全区的代码while(1)里面的代码正常执行,而安全区while(1)里面的代码没有正常执行。板卡红灯闪烁,而绿灯常亮(图片看不太出来)。
原因也很简单,安全区代码是上电之后优先执行的,然后运行到NonSecure_Init,把非安全区堆栈初始化好,然后调用非安全区的复位函数(具体调用方式与逻辑请关注后续文章)。然后代码就跳转到非安全区了。
也就是说,两套代码,并不是真两个核,内部还是只有一个内核滴。
|
你有测试过吗?M33只是为了安全在NVIC、MPU、SYSTICK等资源提供了双份,本身控制还在在切换安全区与非安全区运行实现的。核心资源只会提供一份的。
用过NXP的LPC55S69 里面有两个M33 ,理解错了
[md]嗯嗯,你说的这一颗芯片比较特殊,他虽然是双核M33,不过仅有第一个核是支持TrustZone的