blob: 552b0936c269caf6fd68c8adec62c6f7ce1923c0 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>STMicroelectronics STM32L5</title>
<title>CMSIS-Zone (Preview): STMicroelectronics STM32L5</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="cmsis.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<script type="text/javascript" src="printComponentTabs.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 46px;">
<td id="projectlogo"><img alt="Logo" src="CMSIS_Logo_Final.png"/></td>
<td style="padding-left: 0.5em;">
<div id="projectname">CMSIS-Zone (Preview)
&#160;<span id="projectnumber">Version 0.9.2</span>
</div>
<div id="projectbrief">System Resource Management</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<div id="CMSISnav" class="tabs1">
<ul class="tablist">
<script type="text/javascript">
<!--
writeComponentTabs.call(this);
//-->
</script>
</ul>
</div>
<!-- Generated by Doxygen 1.8.6 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li class="current"><a href="pages.html"><span>Usage&#160;and&#160;Description</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('zTESTM32L5.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Pages</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">STMicroelectronics STM32L5 </div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p>This single processor demo application shows how to do the <a class="el" href="UseCases.html#UseCase_TrustZone">TrustZone Partitioning</a>. It is split into a secure and non-secure part. Using CMSIS-Zone, it generates:</p>
<ul>
<li>A header file that contains #defines to control the various linker scatter files (and might be used in other parts of the application).</li>
<li>The SystemIsolation_Config.c header file that contains memory protection controller (MPC) and peripheral protection controller (PPC) and related interrupt setup.</li>
<li>The partition_gen.h header file that contains the secure attribution unit (SAU) setup and the NVIC configuration for secure/non-secure.</li>
</ul>
<p>The application itself shows how to implement calls between the secure and the non-secure part.</p>
<h1><a class="anchor" id="zTESTM32L5_Eclipse"></a>
Using the CMSIS-Zone project</h1>
<ul>
<li><a class="el" href="zTExamples.html#zTExImport">Import</a> the project "Examples\STM32L5\Zone" into the CMSIS-Zone utility</li>
<li><a class="el" href="zTUI.html#zTProjEx">Open</a> the STM32L5.azone file</li>
<li><a class="el" href="zTUIGenerate.html">Generate</a> the related output files</li>
</ul>
<p>The STM32L5.azone file of that project has the following configuration settings:</p>
<ul>
<li><a class="el" href="zTUIZonePart.html#zTUICreate">Added the zones</a> <code>blinky_s</code> and <code>blinky_ns</code> </li>
<li><a class="el" href="zTUIMemPerRes.html#zTUIMemAdd">Created the memory regions</a> <code>CODE_NS</code>, <code>CODE_S</code>, <code>Veneer</code>, <code>DATA_NS</code>, and <code>DATA_S</code> </li>
<li>Selected various memory regions and peripherals for using in the different zones.</li>
</ul>
<div class="image">
<img src="STM32L5_zones.png" alt="STM32L5_zones.png"/>
</div>
<p>The zones use different Flash and SRAM regions for code and data, but share Flash configuration registers. Peripherals, such as the system and IO configuration, as well as an UART are available in the secure world only. To generate the output, click on the <a class="el" href="zTUIGenerate.html">Generate</a> button in the Zone Editor tool bar. This creates the following files in the <code>ftl_gen</code> directory:</p>
<table class="doxtable">
<tr>
<th align="left">Template File </th><th align="left">Generated File </th><th align="left">Description </th></tr>
<tr>
<td align="left">dump_fzone.txt.ftl </td><td align="left">dump_fzone.txt </td><td align="left">Contains the complete model </td></tr>
<tr>
<td align="left">helper.ftlinc </td><td align="left">N/A </td><td align="left">Helper template file with FTL functions. </td></tr>
<tr>
<td align="left">mem_layout.h.ftl </td><td align="left">mem_layout.h </td><td align="left">Header file that contains the memory region definitions, for example for the linker scatter file. </td></tr>
<tr>
<td align="left">partition_gen.h.ftl </td><td align="left">partition_gen.h </td><td align="left">Configuration of the secure attribution unit (SAU) and the NVIC interrupt assignment. </td></tr>
<tr>
<td align="left">SystemIsolation_Config.c.ftl </td><td align="left">SystemIsolation_Config.c </td><td align="left">Setup of the MPC and PPC. </td></tr>
<tr>
<td align="left">blinky_ns.sct.ftl </td><td align="left">blinky_ns.sct </td><td align="left">Scatter file for non-secure zone. </td></tr>
<tr>
<td align="left">blinky_s.sct.ftl </td><td align="left">blinky_s.sct </td><td align="left">Scatter file for secure zone. </td></tr>
</table>
<p>These files can be used in any IDE to create the final application. In the following, the usage in Arm Keil MDK is described.</p>
<h1><a class="anchor" id="zTESTM32L5_MDK"></a>
Using the MDK project</h1>
<p>The example project can be loaded, built and debugged in µVision by performing the following steps:</p>
<ol type="1">
<li>Navigate to Examples/STM32L5/MDK</li>
<li>Open the multi-project workspace blinky.uvmpw</li>
<li>Optional: Update the generated files by executing the copy_gen.bat scripts in blinky_s\mdk and blinky_ns\mdk folders.</li>
<li>Run the batch build in MDK. Both projects, blinky_s and blinky_ns need to be compiled in order.</li>
</ol>
<h1><a class="anchor" id="zTESTM32L5_MDK_Setup"></a>
MDK project setup</h1>
<p>The multiproject workspace contains the secure <code>blinky_s</code> project and the non-secure <code>blinky_ns</code> project:</p>
<div class="image">
<img src="blinky_window.png" alt="blinky_window.png"/>
</div>
<p>The projects use the files generated in CMSIS-Zone as follows:</p>
<table class="doxtable">
<tr>
<th align="left">File </th><th align="left">Used in </th><th align="left">Description </th></tr>
<tr>
<td align="left">mem_layout.h </td><td align="left">blinky_s, blinky_ns </td><td align="left">Input for the linker scatter files. </td></tr>
<tr>
<td align="left">partition_gen.h </td><td align="left">blinky_s </td><td align="left">Configuration of the secure attribution unit (SAU) and the NVIC interrupt assignment. This file is included in the partition_stm32l5xx.h header file. </td></tr>
<tr>
<td align="left">SystemIsolation_Config.c </td><td align="left">blinky_s </td><td align="left">Setup of the MPC and PPC. </td></tr>
<tr>
<td align="left">blinky_ns.sct </td><td align="left">blinky_ns </td><td align="left">Scatter file for non-secure zone (initally based on generated file). </td></tr>
<tr>
<td align="left">blinky_s.sct </td><td align="left">blinky_s </td><td align="left">Scatter file for secure zone (initally based on generated file). </td></tr>
</table>
<dl class="section note"><dt>Note</dt><dd>If you want to learn more about the general project layout for an Armv8-M project using TrustZone, refer to <a href="https://www.keil.com/appnotes/docs/apnt_291.asp" target="_blank">Application Note 291</a>.</dd></dl>
<h2><a class="anchor" id="zTESTM32L5_hwsScatter"></a>
blinky_s.sct</h2>
<p>As explained previously, the #defines in <code>mem_layout.h</code> can be used to create generic scatter files that are easy to update once changes in the CMSIS-Zone project happen. Using the <b>mem_layout.h</b> file from CMSIS-Zone, the following scatter file is used in the secure <code>blinky</code> project, which is based on the generated scatterf file (scatter_s.sct):</p>
<div class="fragment"><div class="line">; Use Arm compiler 6 to pre-process the scatter file and pull in the defines from the mem_layout.h file:</div>
<div class="line"><span class="preprocessor">#! armclang -E --target=arm-arm-none-eabi -mcpu=cortex-m33 -I../ -xc</span></div>
<div class="line"><span class="preprocessor"></span></div>
<div class="line"><span class="preprocessor">#include &quot;mem_layout.h&quot;</span></div>
<div class="line"></div>
<div class="line">; *------- &lt;&lt;&lt; Use Configuration Wizard in Context Menu &gt;&gt;&gt; ------------------</div>
<div class="line"></div>
<div class="line">;&lt;h&gt; Stack Configuration</div>
<div class="line">; &lt;o&gt; Stack Size (in Bytes) &lt;0x0-0xFFFFFFFF:8&gt;</div>
<div class="line">;&lt;/h&gt;</div>
<div class="line"><span class="preprocessor">#define STACK_SIZE 0x400</span></div>
<div class="line"><span class="preprocessor"></span></div>
<div class="line">;&lt;h&gt; Heap Configuration</div>
<div class="line">; &lt;o&gt; Heap Size (in Bytes) &lt;0x0-0xFFFFFFFF:8&gt;</div>
<div class="line">;&lt;/h&gt;</div>
<div class="line"><span class="preprocessor">#define HEAP_SIZE 0xC00</span></div>
<div class="line"><span class="preprocessor"></span></div>
<div class="line">; *-------------- &lt;&lt;&lt; end of configuration section &gt;&gt;&gt; -----------------------</div>
<div class="line">LR_CODE_S REGION_CODE_S_START REGION_CODE_S_SIZE {</div>
<div class="line"> ER_CODE_S REGION_CODE_S_START REGION_CODE_S_SIZE {</div>
<div class="line"> (RESET,+FIRST)</div>
<div class="line"> (InRoot$$Sections)</div>
<div class="line"> .ANY (+RO +XO)</div>
<div class="line"> }</div>
<div class="line"> RW_DATA_S REGION_DATA_S_START REGION_DATA_S_SIZE-HEAP_SIZE-STACK_SIZE {</div>
<div class="line"> .ANY (+RW +ZI)</div>
<div class="line"> }</div>
<div class="line"><span class="preprocessor">#if HEAP_SIZE&gt;0</span></div>
<div class="line"><span class="preprocessor"></span> ARM_LIB_HEAP REGION_DATA_S_START+REGION_DATA_S_SIZE-HEAP_SIZE-STACK_SIZE EMPTY HEAP_SIZE {</div>
<div class="line"> }</div>
<div class="line"><span class="preprocessor">#endif</span></div>
<div class="line"><span class="preprocessor"></span><span class="preprocessor">#if STACK_SIZE&gt;0</span></div>
<div class="line"><span class="preprocessor"></span> ARM_LIB_STACK REGION_DATA_S_START+REGION_DATA_S_SIZE-STACK_SIZE EMPTY STACK_SIZE {</div>
<div class="line"> }</div>
<div class="line"><span class="preprocessor">#endif </span></div>
<div class="line"><span class="preprocessor"></span>}</div>
<div class="line">LR_Veneer REGION_VENEER_START REGION_VENEER_SIZE {</div>
<div class="line"> ER_Veneer REGION_VENEER_START REGION_VENEER_SIZE {</div>
<div class="line"> (Veneer$$CMSE)</div>
<div class="line"> }</div>
<div class="line">}</div>
</div><!-- fragment --><p>The partition_gen.h header file contains Configuration Wizard annotation so that it can be viewed in a graphical window:</p>
<div class="image">
<img src="partition_h_l5.png" alt="partition_h_l5.png"/>
</div>
</div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="zoneToolUsage.html">CMSIS-Zone Utility</a></li><li class="navelem"><a class="el" href="zTExamples.html">Examples</a></li>
<li class="footer">Generated on Wed Jul 10 2019 15:21:06 for CMSIS-Zone (Preview) Version 0.9.2 by Arm Ltd. All rights reserved.
<!--
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.6
-->
</li>
</ul>
</div>
</body>
</html>