manhuami2007 发表于 2023-1-2 18:31

[ ST NUCLEO-U575ZI-Q 测评] 3-使用cubemx软件配置TrustZone工程

<div class='showpostmsg'> 本帖最后由 manhuami2007 于 2023-1-2 18:35 编辑

<h3 data-line="1" dir="auto"><span style="font-size:16px;"><span style="font-family:宋体;">上一个帖子大概介绍了TrustZone的基本原理,接下来要写如何实现TrustZone。在初始化阶段可以借助st公司提供的cubemx等软件进行设置,具体步骤如下。</span></span></h3>

<h3 data-line="1" dir="auto">&nbsp;</h3>

<h3 data-line="1" dir="auto" id="1%E9%85%8D%E7%BD%AEflash%E7%9A%84%E5%88%AB%E5%90%8D%E5%8C%BA">1.配置Flash的别名区</h3>

<p data-line="6" dir="auto">通过programer 配置&quot;option bytes&quot;里的TZEN和DBANK位,TZEN是使能Flash的TrustZone功能,DBANK是使能Flash的双bank功能。&nbsp;&nbsp;&nbsp;</p>

<p data-line="6" dir="auto"></p>

<p data-line="6" dir="auto"></p>

<p data-line="6" dir="auto">使能上面2个位之后,在option bytes中就出现了下面的选项,其中&quot;secure area&quot;选项负责设置2个bank的安全区域的大小。每个bank对应1个secure area 。&nbsp;&nbsp;</p>

<p data-line="6" dir="auto"></p>

<p data-line="6" dir="auto">下图中,SECWMx_PSTRT和SECWMx_PEND这2个参数是设置flash安全区的起始页和终止页的。&nbsp;&nbsp;</p>

<p data-line="6" dir="auto"></p>

<p data-line="6" dir="auto">比如把第一个bank全部设置成安全区:SECWM1_PSTRT=0,SECWM1_PEND=0x7F 。第二个bank全部设置成非安全区:SECWM2_PSTRT=1,SECWM1_PEND=0。设置规则如下图所示。</p>

<p data-line="6" dir="auto"></p>

<h3 data-line="14" dir="auto" id="2%E4%BD%BF%E7%94%A8stm32cubemx%E9%85%8D%E7%BD%AE">2.使用stm32cubemx配置</h3>

<p data-line="15" dir="auto">在使用cubemx建立工程的时候会出现弹出框,询问是否建立TrustZone工程,这时要选是。</p>

<h4 data-line="17" dir="auto" id="21-%E8%AE%BE%E7%BD%AEgztc">2.1 设置GZTC</h4>

<p data-line="18" dir="auto">首先设置GZTC,GZTC控制了SRAM的访问。在这里定义SRAM的安全区和非安全区。cubemx默认将SRAM1、SRAM2和SRAM4用于安全区,SRAM3用于非安全区。如下图所示,注意2个图片的区别是&quot;Area size&quot;不同。&nbsp;&nbsp;</p>

<p data-line="18" dir="auto"></p>

<p data-line="18" dir="auto"></p>

<p data-line="22" dir="auto">SRAM1、2、3、4都是片内的SRAM。如下图的简介所示。</p>

<p data-line="24" dir="auto"></p>

<h4 data-line="26" dir="auto" id="22-%E5%A4%96%E8%AE%BE%E5%92%8C%E4%B8%AD%E6%96%AD%E7%9A%84%E8%AE%BE%E7%BD%AE">2.2 外设和中断的设置</h4>

<p data-line="28" dir="auto">这里要配置2个LED,1个按键和1个串口。其中1个LED用于安全区,1个用于非安全区。串口在非安全区。按键使用外部中断,并且可以通过串口配置这个中断是工作在安全区还是非安全区。</p>

<p data-line="28" dir="auto">&nbsp;</p>

<p data-line="30" dir="auto">首先在cubemx中配置PB7(蓝色LED)工作在安全模式,如下图所示:&nbsp;</p>

<p data-line="30" dir="auto"></p>

<p data-line="33" dir="auto">PC7(绿色LED)工作中非安全模式,如下图所示:&nbsp;</p>

<p data-line="33" dir="auto"></p>

<p data-line="36" dir="auto">PC13是按键,按键按下时触发外部中断,先工作在安全模式。并且在NVIC_S中使能EXIT_13中断。&nbsp;</p>

<p data-line="36" dir="auto"></p>

<p data-line="39" dir="auto">使用UART1作为串口,将其勾选在M33_NS模式。</p>

<p data-line="39" dir="auto">&nbsp;</p>

<p data-line="41" dir="auto">至此初始化工作完成,配置了Flash、SRAM、外设和中断的工作安全模式。下一步开始使用。</p>

<h3 data-line="43" dir="auto" id="3%E7%BC%96%E5%86%99nsc%E4%BB%A3%E7%A0%81">3.编写NSC代码</h3>

<p data-line="45" dir="auto">现在安全区的代码和非安全区的代码是独立的,两者需要建立联系,才能互相调用。</p>

<p data-line="47" dir="auto">安全区的代码是可以直接调用非安全区的代码的,可以通过绝对地址进行调用,而在代码中则是通过函数指针代替了绝对地址进行调用。</p>

<p data-line="49" dir="auto">非安全区的代码要想访问安全区的代码,需要NSC(非安全可调用)代码作为中介。也就是说非安全区的代码不能随便调用安全区的代码,只能调用安全区通过NSC表现出来的代码。</p>

<p data-line="51" dir="auto">在工程中,上面2个部分的代码都是在安全区工程中的&quot;secure_nsc.c&quot;文件中的。这个文件的代码会被编译成库文件,供非安全区代码调用。</p>

<p data-line="53" dir="auto"></p>

<p data-line="55" dir="auto">具体代码的实现,请见下一个帖子。</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

lugl4313820 发表于 2023-1-2 21:37

<p data-line="45" dir="auto">现在安全区的代码和非安全区的代码是独立的,两者需要建立联系,才能互相调用。</p>

<p data-line="47" dir="auto">安全区的代码是可以直接调用非安全区的代码的,可以通过绝对地址进行调用,而在代码中则是通过函数指针代替了绝对地址进行调用。</p>

<p data-line="49" dir="auto">非安全区的代码要想访问安全区的代码,需要NSC(非安全可调用)代码作为中介。也就是说非安全区的代码不能随便调用安全区的代码,只能调用安全区通过NSC表现出来的代码。</p>

<p data-line="51" dir="auto">在工程中,上面2个部分的代码都是在安全区工程中的&quot;secure_nsc.c&quot;文件中的。这个文件的代码会被编译成库文件,供非安全区代码调用。</p>

<p data-line="51" dir="auto">感谢分享。认真学习一下。</p>

okhxyyo 发表于 2023-1-12 09:20

<p>测评汇总:免费申请|ST NUCLEO-U575ZI-Q https://bbs.eeworld.com.cn/thread-1228653-1-1.html</p>
页: [1]
查看完整版本: [ ST NUCLEO-U575ZI-Q 测评] 3-使用cubemx软件配置TrustZone工程