0
mirror of https://github.com/OneOfEleven/uv-k5-firmware-custom.git synced 2025-04-28 06:11:24 +03:00

clean ups

This commit is contained in:
OneOfEleven 2023-10-21 13:00:38 +01:00
parent b4d50001e1
commit a68d0ab74f
2488 changed files with 0 additions and 310418 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +0,0 @@
# CMSIS-DSP
![GitHub release (latest by date including pre-releases)](https://img.shields.io/github/v/release/ARM-software/CMSIS-DSP?include_prereleases) ![GitHub](https://img.shields.io/github/license/ARM-software/CMSIS-DSP)
This CMSIS component has been moved into its own realm, please find it at [ARM-software/CMSIS-DSP](https://github.com/ARM-software/CMSIS-DSP).

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=https://open-cmsis-pack.github.io/devtools/buildmgr/latest/CmdLineBuild.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/CmdLineBuild.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 676 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 B

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=https://open-cmsis-pack.github.io/devtools/buildmgr/latest/build_revisionHistory.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/build_revisionHistory.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=https://open-cmsis-pack.github.io/devtools/buildmgr/latest/cbuild.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/cbuild.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=https://open-cmsis-pack.github.io/devtools/buildmgr/latest/cbuild_install.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/cbuild_install.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=index.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="index.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=https://open-cmsis-pack.github.io/devtools/buildmgr/latest/cbuildgen.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/cbuildgen.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=index.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="index.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 B

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=https://open-cmsis-pack.github.io/devtools/buildmgr/latest/cmake.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/cmake.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +0,0 @@
function writeFooter() {
document.write('Generated on Wed Apr 13 2022 14:13:49 for CMSIS-Pack Version 1.7.2 by Arm Ltd. All rights reserved.');
};

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=index.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="index.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=https://open-cmsis-pack.github.io/devtools/buildmgr/latest/cpackget.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/cpackget.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=https://open-cmsis-pack.github.io/devtools/buildmgr/latest/cprjFormat_pg.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/cprjFormat_pg.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=https://open-cmsis-pack.github.io/devtools/buildmgr/latest/cprj_types.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/cprj_types.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -1,97 +0,0 @@
function toggleVisibility(linkObj)
{
var base = $(linkObj).attr('id');
var summary = $('#'+base+'-summary');
var content = $('#'+base+'-content');
var trigger = $('#'+base+'-trigger');
var src=$(trigger).attr('src');
if (content.is(':visible')===true) {
content.hide();
summary.show();
$(linkObj).addClass('closed').removeClass('opened');
$(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
} else {
content.show();
summary.hide();
$(linkObj).removeClass('closed').addClass('opened');
$(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
}
return false;
}
function updateStripes()
{
$('table.directory tr').
removeClass('even').filter(':visible:even').addClass('even');
}
function toggleLevel(level)
{
$('table.directory tr').each(function(){
var l = this.id.split('_').length-1;
var i = $('#img'+this.id.substring(3));
var a = $('#arr'+this.id.substring(3));
if (l<level+1) {
i.attr('src','ftv2folderopen.png');
a.attr('src','ftv2mnode.png');
$(this).show();
} else if (l==level+1) {
i.attr('src','ftv2folderclosed.png');
a.attr('src','ftv2pnode.png');
$(this).show();
} else {
$(this).hide();
}
});
updateStripes();
}
function toggleFolder(id)
{
//The clicked row
var currentRow = $('#row_'+id);
var currentRowImages = currentRow.find("img");
//All rows after the clicked row
var rows = currentRow.nextAll("tr");
//Only match elements AFTER this one (can't hide elements before)
var childRows = rows.filter(function() {
var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
return this.id.match(re);
});
//First row is visible we are HIDING
if (childRows.filter(':first').is(':visible')===true) {
currentRowImages.filter("[id^=arr]").attr('src', 'ftv2pnode.png');
currentRowImages.filter("[id^=img]").attr('src', 'ftv2folderclosed.png');
rows.filter("[id^=row_"+id+"]").hide();
} else { //We are SHOWING
//All sub images
var childImages = childRows.find("img");
var childImg = childImages.filter("[id^=img]");
var childArr = childImages.filter("[id^=arr]");
currentRow.find("[id^=arr]").attr('src', 'ftv2mnode.png'); //open row
currentRow.find("[id^=img]").attr('src', 'ftv2folderopen.png'); //open row
childImg.attr('src','ftv2folderclosed.png'); //children closed
childArr.attr('src','ftv2pnode.png'); //children closed
childRows.show(); //show all children
}
updateStripes();
}
function toggleInherit(id)
{
var rows = $('tr.inherit.'+id);
var img = $('tr.inherit_header.'+id+' img');
var src = $(img).attr('src');
if (rows.filter(':first').is(':visible')===true) {
rows.css('display','none');
$(img).attr('src',src.substring(0,src.length-8)+'closed.png');
} else {
rows.css('display','table-row'); // using show() causes jump in firefox
$(img).attr('src',src.substring(0,src.length-10)+'open.png');
}
}

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=https://open-cmsis-pack.github.io/devtools/buildmgr/latest/element_compilers.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/element_compilers.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=https://open-cmsis-pack.github.io/devtools/buildmgr/latest/element_components.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/element_components.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=https://open-cmsis-pack.github.io/devtools/buildmgr/latest/element_cprj.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/element_cprj.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=https://open-cmsis-pack.github.io/devtools/buildmgr/latest/element_created.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/element_created.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=https://open-cmsis-pack.github.io/devtools/buildmgr/latest/element_files.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/element_files.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=https://open-cmsis-pack.github.io/devtools/buildmgr/latest/element_info.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/element_info.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=https://open-cmsis-pack.github.io/devtools/buildmgr/latest/element_layers.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/element_layers.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=https://open-cmsis-pack.github.io/devtools/buildmgr/latest/element_packages.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/element_packages.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=https://open-cmsis-pack.github.io/devtools/buildmgr/latest/element_target.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/element_target.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 453 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 746 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 616 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 597 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 746 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 246 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 246 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 403 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 388 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 229 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 229 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 314 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 B

View File

@ -1,173 +0,0 @@
<!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>Overview</title>
<title>CMSIS-Build: Overview</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>
<script type="text/javascript" src="cmsis_footer.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-Build
&#160;<span id="projectnumber">Version 0.10.0 (beta)</span>
</div>
<div id="projectbrief">Tools, software frameworks, and work flows for productivity with CMSIS based projects</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 class="current"><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><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('index.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>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">Overview </div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p>CMSIS-Build is now replaced with the <a href="https://github.com/Open-CMSIS-Pack/devtools/tree/main/tools" target="_blank"><b>CMSIS-Toolbox</b></a> that is a set of tools for creating and building projects that are based on software packs.</p>
Content of this documentation is now <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/index.html" target="_blank"><b>provided here</b></a> and individual pages are redirected to the corresponding pages in CMSIS-Toolbox documents.
<h1><a class="anchor" id="Components_of_CMSIS_Toolbox"></a>
Components of CMSIS-Toolbox</h1>
<p>The <a href="https://github.com/Open-CMSIS-Pack/devtools/tree/main/tools" target="_blank"><b>CMSIS-Toolbox</b></a> is developed under the <a href="https://www.open-cmsis-pack.org" target="_blank">Linaro Open-CMSIS-Pack</a> project and contains these tools:</p>
<ul>
<li><b>cpackget</b> download, add and remove software packs.</li>
<li><b>csolution</b> to create and manage complex applications with user source files and content from software packs</li>
<li><b>cbuild</b> controls the build process that translates a project to a executable binary image.</li>
<li><b>packgen</b> to create a software pack from a CMake based software repository.</li>
<li><b>packchk</b> to validate a software pack</li>
</ul>
<p>The <a href="https://github.com/Open-CMSIS-Pack/devtools/tree/main/tools" target="_blank"><b>CMSIS-Toolbox</b></a> can be used as stand-alone tools with command line interface (CLI) but will be integrated into several other Arm tool solutions such as:</p>
<ul>
<li><a href="https://www.arm.com/virtual-hardware" target="_blank"><b>Arm Virtual Hardware</b></a> to manage the build process in CI workflows.</li>
<li><a href="https://www.keil.arm.com" target="_blank"><b>Keil Studio</b></a> as integral part of the project management.</li>
<li><a href="https://www.keil.com/mdk5/" target="_blank"><b>Keil MDK</b></a> to provide CLI tools for project generation.</li>
</ul>
<h1><a class="anchor" id="Development_Workflow"></a>
Development Workflow</h1>
<p>The following diagram shows the development workflow using the CMSIS-Toolbox.</p>
<div class="image">
<img src="CMSIS-Toolbox.png" alt="CMSIS-Toolbox.png"/>
<div class="caption">
Diagram: CMSIS-Toolbox Development Workflow</div></div>
<p> A solution that manages several related projects and projects can be composed using an intuitive <code>*.yml</code> format. This solution and project files are then translated using <b>csolution</b> CLI tool to the <code>*.CPRJ</code> project file format.</p>
<p>The individual <code>*.CPRJ</code> project files can be imported to an IDE or by using <b>cbuild</b> translated into executable binary images.</p>
<p>The <a class="el" href="cprjFormat_pg.html" target="_blank">*.CPRJ Project Format</a> describes the input file format that is used by <b>cbuild</b>.</p>
<h1><a class="anchor" id="Revision_History"></a>
Revision History</h1>
<table class="doxtable">
<tr>
<th align="left">Version </th><th align="left">Description </th></tr>
<tr>
<td align="left">replaced by </td><td align="left"><a href="https://github.com/Open-CMSIS-Pack/devtools/tree/main/tools" target="_blank"><b>CMSIS-Toolbox</b></a> now contains the <b>cbuild</b> (aka CMSIS-Build) CLI tool. </td></tr>
<tr>
<td align="left">0.10.0 (beta) </td><td align="left">CMake back-end and support for more Cortex-M processors including ArmV8.1M architecture. </td></tr>
<tr>
<td align="left">0.9.0 (beta) </td><td align="left">Support for multiple compilers and commands for layer management </td></tr>
<tr>
<td align="left">0.1.0 (alpha) </td><td align="left">Release for alpha review </td></tr>
</table>
</div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">
<script type="text/javascript">
<!--
writeFooter.call(this);
//-->
</script>
</li>
</ul>
</div>
</body>
</html>

File diff suppressed because one or more lines are too long

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=index.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="index.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 B

View File

@ -1,143 +0,0 @@
#nav-tree .children_ul {
margin:0;
padding:4px;
}
#nav-tree ul {
list-style:none outside none;
margin:0px;
padding:0px;
}
#nav-tree li {
white-space:nowrap;
margin:0px;
padding:0px;
}
#nav-tree .plus {
margin:0px;
}
#nav-tree .selected {
background-image: url('tab_a.png');
background-repeat:repeat-x;
color: #fff;
text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
}
#nav-tree img {
margin:0px;
padding:0px;
border:0px;
vertical-align: middle;
}
#nav-tree a {
text-decoration:none;
padding:0px;
margin:0px;
outline:none;
}
#nav-tree .label {
margin:0px;
padding:0px;
font: 12px 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
}
#nav-tree .label a {
padding:2px;
}
#nav-tree .selected a {
text-decoration:none;
color:#fff;
}
#nav-tree .children_ul {
margin:0px;
padding:0px;
}
#nav-tree .item {
margin:0px;
padding:0px;
}
#nav-tree {
padding: 0px 0px;
background-color: #FAFAFF;
font-size:14px;
overflow:auto;
}
#doc-content {
overflow:auto;
display:block;
padding:0px;
margin:0px;
-webkit-overflow-scrolling : touch; /* iOS 5+ */
}
#side-nav {
padding:0 6px 0 0;
margin: 0px;
display:block;
position: absolute;
left: 0px;
width: 250px;
}
.ui-resizable .ui-resizable-handle {
display:block;
}
.ui-resizable-e {
background:url("ftv2splitbar.png") repeat scroll right center transparent;
cursor:e-resize;
height:100%;
right:0;
top:0;
width:6px;
}
.ui-resizable-handle {
display:none;
font-size:0.1px;
position:absolute;
z-index:1;
}
#nav-tree-contents {
margin: 6px 0px 0px 0px;
}
#nav-tree {
background-image:url('nav_h.png');
background-repeat:repeat-x;
background-color: #F9FAFC;
-webkit-overflow-scrolling : touch; /* iOS 5+ */
}
#nav-sync {
position:absolute;
top:5px;
right:24px;
z-index:0;
}
#nav-sync img {
opacity:0.3;
}
#nav-sync img:hover {
opacity:0.9;
}
@media print
{
#nav-tree { display: none; }
div.ui-resizable-handle { display: none; position: relative; }
}

View File

@ -1,527 +0,0 @@
var NAVTREE =
[
[ "CMSIS-Build", "index.html"]
];
var NAVTREEINDEX =
[
"CmdLineBuild.html"
];
var SYNCONMSG = 'click to disable panel synchronisation';
var SYNCOFFMSG = 'click to enable panel synchronisation';
var SYNCONMSG = 'click to disable panel synchronisation';
var SYNCOFFMSG = 'click to enable panel synchronisation';
var navTreeSubIndices = new Array();
function getData(varName)
{
var i = varName.lastIndexOf('/');
var n = i>=0 ? varName.substring(i+1) : varName;
return eval(n.replace(/\-/g,'_'));
}
function stripPath(uri)
{
return uri.substring(uri.lastIndexOf('/')+1);
}
function stripPath2(uri)
{
var i = uri.lastIndexOf('/');
var s = uri.substring(i+1);
var m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/);
return m ? uri.substring(i-6) : s;
}
function localStorageSupported()
{
try {
return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem;
}
catch(e) {
return false;
}
}
function storeLink(link)
{
if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) {
window.localStorage.setItem('navpath',link);
}
}
function deleteLink()
{
if (localStorageSupported()) {
window.localStorage.setItem('navpath','');
}
}
function cachedLink()
{
if (localStorageSupported()) {
return window.localStorage.getItem('navpath');
} else {
return '';
}
}
function getScript(scriptName,func,show)
{
var head = document.getElementsByTagName("head")[0];
var script = document.createElement('script');
script.id = scriptName;
script.type = 'text/javascript';
script.onload = func;
script.src = scriptName+'.js';
if ($.browser.msie && $.browser.version<=8) {
// script.onload does not work with older versions of IE
script.onreadystatechange = function() {
if (script.readyState=='complete' || script.readyState=='loaded') {
func(); if (show) showRoot();
}
}
}
head.appendChild(script);
}
function createIndent(o,domNode,node,level)
{
var level=-1;
var n = node;
while (n.parentNode) { level++; n=n.parentNode; }
if (node.childrenData) {
var imgNode = document.createElement("img");
imgNode.style.paddingLeft=(16*level).toString()+'px';
imgNode.width = 16;
imgNode.height = 22;
imgNode.border = 0;
node.plus_img = imgNode;
node.expandToggle = document.createElement("a");
node.expandToggle.href = "javascript:void(0)";
node.expandToggle.onclick = function() {
if (node.expanded) {
$(node.getChildrenUL()).slideUp("fast");
node.plus_img.src = node.relpath+"ftv2pnode.png";
node.expanded = false;
} else {
expandNode(o, node, false, false);
}
}
node.expandToggle.appendChild(imgNode);
domNode.appendChild(node.expandToggle);
imgNode.src = node.relpath+"ftv2pnode.png";
} else {
var span = document.createElement("span");
span.style.display = 'inline-block';
span.style.width = 16*(level+1)+'px';
span.style.height = '22px';
span.innerHTML = '&#160;';
domNode.appendChild(span);
}
}
var animationInProgress = false;
function gotoAnchor(anchor,aname,updateLocation)
{
var pos, docContent = $('#doc-content');
if (anchor.parent().attr('class')=='memItemLeft' ||
anchor.parent().attr('class')=='fieldtype' ||
anchor.parent().is(':header'))
{
pos = anchor.parent().position().top;
} else if (anchor.position()) {
pos = anchor.position().top;
}
if (pos) {
var dist = Math.abs(Math.min(
pos-docContent.offset().top,
docContent[0].scrollHeight-
docContent.height()-docContent.scrollTop()));
animationInProgress=true;
docContent.animate({
scrollTop: pos + docContent.scrollTop() - docContent.offset().top
},Math.max(50,Math.min(500,dist)),function(){
if (updateLocation) window.location.href=aname;
animationInProgress=false;
});
}
}
function newNode(o, po, text, link, childrenData, lastNode)
{
var node = new Object();
node.children = Array();
node.childrenData = childrenData;
node.depth = po.depth + 1;
node.relpath = po.relpath;
node.isLast = lastNode;
node.li = document.createElement("li");
po.getChildrenUL().appendChild(node.li);
node.parentNode = po;
node.itemDiv = document.createElement("div");
node.itemDiv.className = "item";
node.labelSpan = document.createElement("span");
node.labelSpan.className = "label";
createIndent(o,node.itemDiv,node,0);
node.itemDiv.appendChild(node.labelSpan);
node.li.appendChild(node.itemDiv);
var a = document.createElement("a");
node.labelSpan.appendChild(a);
node.label = document.createTextNode(text);
node.expanded = false;
a.appendChild(node.label);
if (link) {
var url;
if (link.substring(0,1)=='^') {
url = link.substring(1);
link = url;
} else {
url = node.relpath+link;
}
a.className = stripPath(link.replace('#',':'));
if (link.indexOf('#')!=-1) {
var aname = '#'+link.split('#')[1];
var srcPage = stripPath($(location).attr('pathname'));
var targetPage = stripPath(link.split('#')[0]);
a.href = srcPage!=targetPage ? url : "javascript:void(0)";
a.onclick = function(){
storeLink(link);
if (!$(a).parent().parent().hasClass('selected'))
{
$('.item').removeClass('selected');
$('.item').removeAttr('id');
$(a).parent().parent().addClass('selected');
$(a).parent().parent().attr('id','selected');
}
var anchor = $(aname);
gotoAnchor(anchor,aname,true);
};
} else {
a.href = url;
a.onclick = function() { storeLink(link); }
}
} else {
if (childrenData != null)
{
a.className = "nolink";
a.href = "javascript:void(0)";
a.onclick = node.expandToggle.onclick;
}
}
node.childrenUL = null;
node.getChildrenUL = function() {
if (!node.childrenUL) {
node.childrenUL = document.createElement("ul");
node.childrenUL.className = "children_ul";
node.childrenUL.style.display = "none";
node.li.appendChild(node.childrenUL);
}
return node.childrenUL;
};
return node;
}
function showRoot()
{
var headerHeight = $("#top").height();
var footerHeight = $("#nav-path").height();
var windowHeight = $(window).height() - headerHeight - footerHeight;
(function (){ // retry until we can scroll to the selected item
try {
var navtree=$('#nav-tree');
navtree.scrollTo('#selected',0,{offset:-windowHeight/2});
} catch (err) {
setTimeout(arguments.callee, 0);
}
})();
}
function expandNode(o, node, imm, showRoot)
{
if (node.childrenData && !node.expanded) {
if (typeof(node.childrenData)==='string') {
var varName = node.childrenData;
getScript(node.relpath+varName,function(){
node.childrenData = getData(varName);
expandNode(o, node, imm, showRoot);
}, showRoot);
} else {
if (!node.childrenVisited) {
getNode(o, node);
} if (imm || ($.browser.msie && $.browser.version>8)) {
// somehow slideDown jumps to the start of tree for IE9 :-(
$(node.getChildrenUL()).show();
} else {
$(node.getChildrenUL()).slideDown("fast");
}
if (node.isLast) {
node.plus_img.src = node.relpath+"ftv2mlastnode.png";
} else {
node.plus_img.src = node.relpath+"ftv2mnode.png";
}
node.expanded = true;
}
}
}
function glowEffect(n,duration)
{
n.addClass('glow').delay(duration).queue(function(next){
$(this).removeClass('glow');next();
});
}
function highlightAnchor()
{
var aname = $(location).attr('hash');
var anchor = $(aname);
if (anchor.parent().attr('class')=='memItemLeft'){
var rows = $('.memberdecls tr[class$="'+
window.location.hash.substring(1)+'"]');
glowEffect(rows.children(),300); // member without details
} else if (anchor.parents().slice(2).prop('tagName')=='TR') {
glowEffect(anchor.parents('div.memitem'),1000); // enum value
} else if (anchor.parent().attr('class')=='fieldtype'){
glowEffect(anchor.parent().parent(),1000); // struct field
} else if (anchor.parent().is(":header")) {
glowEffect(anchor.parent(),1000); // section header
} else {
glowEffect(anchor.next(),1000); // normal member
}
gotoAnchor(anchor,aname,false);
}
function selectAndHighlight(hash,n)
{
var a;
if (hash) {
var link=stripPath($(location).attr('pathname'))+':'+hash.substring(1);
a=$('.item a[class$="'+link+'"]');
}
if (a && a.length) {
a.parent().parent().addClass('selected');
a.parent().parent().attr('id','selected');
highlightAnchor();
} else if (n) {
$(n.itemDiv).addClass('selected');
$(n.itemDiv).attr('id','selected');
}
if ($('#nav-tree-contents .item:first').hasClass('selected')) {
$('#nav-sync').css('top','30px');
} else {
$('#nav-sync').css('top','5px');
}
showRoot();
}
function showNode(o, node, index, hash)
{
if (node && node.childrenData) {
if (typeof(node.childrenData)==='string') {
var varName = node.childrenData;
getScript(node.relpath+varName,function(){
node.childrenData = getData(varName);
showNode(o,node,index,hash);
},true);
} else {
if (!node.childrenVisited) {
getNode(o, node);
}
$(node.getChildrenUL()).css({'display':'block'});
if (node.isLast) {
node.plus_img.src = node.relpath+"ftv2mlastnode.png";
} else {
node.plus_img.src = node.relpath+"ftv2mnode.png";
}
node.expanded = true;
var n = node.children[o.breadcrumbs[index]];
if (index+1<o.breadcrumbs.length) {
showNode(o,n,index+1,hash);
} else {
if (typeof(n.childrenData)==='string') {
var varName = n.childrenData;
getScript(n.relpath+varName,function(){
n.childrenData = getData(varName);
node.expanded=false;
showNode(o,node,index,hash); // retry with child node expanded
},true);
} else {
var rootBase = stripPath(o.toroot.replace(/\..+$/, ''));
if (rootBase=="index" || rootBase=="pages" || rootBase=="search") {
expandNode(o, n, true, true);
}
selectAndHighlight(hash,n);
}
}
}
} else {
selectAndHighlight(hash);
}
}
function removeToInsertLater(element) {
var parentNode = element.parentNode;
var nextSibling = element.nextSibling;
parentNode.removeChild(element);
return function() {
if (nextSibling) {
parentNode.insertBefore(element, nextSibling);
} else {
parentNode.appendChild(element);
}
};
}
function getNode(o, po)
{
var insertFunction = removeToInsertLater(po.li);
po.childrenVisited = true;
var l = po.childrenData.length-1;
for (var i in po.childrenData) {
var nodeData = po.childrenData[i];
po.children[i] = newNode(o, po, nodeData[0], nodeData[1], nodeData[2],
i==l);
}
insertFunction();
}
function gotoNode(o,subIndex,root,hash,relpath)
{
var nti = navTreeSubIndices[subIndex][root+hash];
o.breadcrumbs = $.extend(true, [], nti ? nti : navTreeSubIndices[subIndex][root]);
if (!o.breadcrumbs && root!=NAVTREE[0][1]) { // fallback: show index
navTo(o,NAVTREE[0][1],"",relpath);
$('.item').removeClass('selected');
$('.item').removeAttr('id');
}
if (o.breadcrumbs) {
o.breadcrumbs.unshift(0); // add 0 for root node
showNode(o, o.node, 0, hash);
}
}
function navTo(o,root,hash,relpath)
{
var link = cachedLink();
if (link) {
var parts = link.split('#');
root = parts[0];
if (parts.length>1) hash = '#'+parts[1];
else hash='';
}
if (hash.match(/^#l\d+$/)) {
var anchor=$('a[name='+hash.substring(1)+']');
glowEffect(anchor.parent(),1000); // line number
hash=''; // strip line number anchors
//root=root.replace(/_source\./,'.'); // source link to doc link
}
var url=root+hash;
var i=-1;
while (NAVTREEINDEX[i+1]<=url) i++;
if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index
if (navTreeSubIndices[i]) {
gotoNode(o,i,root,hash,relpath)
} else {
getScript(relpath+'navtreeindex'+i,function(){
navTreeSubIndices[i] = eval('NAVTREEINDEX'+i);
if (navTreeSubIndices[i]) {
gotoNode(o,i,root,hash,relpath);
}
},true);
}
}
function showSyncOff(n,relpath)
{
n.html('<img src="'+relpath+'sync_off.png" title="'+SYNCOFFMSG+'"/>');
}
function showSyncOn(n,relpath)
{
n.html('<img src="'+relpath+'sync_on.png" title="'+SYNCONMSG+'"/>');
}
function toggleSyncButton(relpath)
{
var navSync = $('#nav-sync');
if (navSync.hasClass('sync')) {
navSync.removeClass('sync');
showSyncOff(navSync,relpath);
storeLink(stripPath2($(location).attr('pathname'))+$(location).attr('hash'));
} else {
navSync.addClass('sync');
showSyncOn(navSync,relpath);
deleteLink();
}
}
function initNavTree(toroot,relpath)
{
var o = new Object();
o.toroot = toroot;
o.node = new Object();
o.node.li = document.getElementById("nav-tree-contents");
o.node.childrenData = NAVTREE;
o.node.children = new Array();
o.node.childrenUL = document.createElement("ul");
o.node.getChildrenUL = function() { return o.node.childrenUL; };
o.node.li.appendChild(o.node.childrenUL);
o.node.depth = 0;
o.node.relpath = relpath;
o.node.expanded = false;
o.node.isLast = true;
o.node.plus_img = document.createElement("img");
o.node.plus_img.src = relpath+"ftv2pnode.png";
o.node.plus_img.width = 16;
o.node.plus_img.height = 22;
if (localStorageSupported()) {
var navSync = $('#nav-sync');
if (cachedLink()) {
showSyncOff(navSync,relpath);
navSync.removeClass('sync');
} else {
showSyncOn(navSync,relpath);
}
navSync.click(function(){ toggleSyncButton(relpath); });
}
$(window).load(function(){
navTo(o,toroot,window.location.hash,relpath);
showRoot();
});
$(window).bind('hashchange', function(){
if (window.location.hash && window.location.hash.length>1){
var a;
if ($(location).attr('hash')){
var clslink=stripPath($(location).attr('pathname'))+':'+
$(location).attr('hash').substring(1);
a=$('.item a[class$="'+clslink+'"]');
}
if (a==null || !$(a).parent().parent().hasClass('selected')){
$('.item').removeClass('selected');
$('.item').removeAttr('id');
}
var link=stripPath2($(location).attr('pathname'));
navTo(o,link,$(location).attr('hash'),relpath);
} else if (!animationInProgress) {
$('#doc-content').scrollTop(0);
$('.item').removeClass('selected');
$('.item').removeAttr('id');
navTo(o,toroot,window.location.hash,relpath);
}
})
}

View File

@ -1,4 +0,0 @@
var NAVTREEINDEX0 =
{
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 B

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=https://open-cmsis-pack.github.io/devtools/buildmgr/latest/pages.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/pages.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

View File

@ -1,40 +0,0 @@
var strgURL = location.pathname; // path of current component
// constuctor for the array of objects
function tabElement(id, folderName, tabTxt ) {
this.id = id; // elementID as needed in html;
this.folderName = folderName; // folder name of the component
this.tabTxt = tabTxt; // Text displayed as menu on the web
this.currentListItem = '<li id="' + this.id + '" class="current"> <a href="../..' + this.folderName + 'index.html"><span>' + this.tabTxt + '</span></a></li>';
this.listItem = '<li id="' + this.id + '"> <a href="../..' + this.folderName + 'index.html"><span>' + this.tabTxt + '</span></a></li>';
};
// array of objects
var arr = [];
// fill array
arr.push( new tabElement( "GEN", "/General/html/", "General") );
arr.push( new tabElement( "CORE_A", "/Core_A/html/", "Core(A)") );
arr.push( new tabElement( "CORE_M", "/Core/html/", "Core(M)") );
arr.push( new tabElement( "DRV", "/Driver/html/", "Driver") );
arr.push( new tabElement( "DSP&ML", "/DSP/html/", "DSP") );
arr.push( new tabElement( "NN", "/NN/html/", "NN") );
arr.push( new tabElement( "RTOSv1", "/RTOS/html/", "RTOS v1") );
arr.push( new tabElement( "RTOSv2", "/RTOS2/html/", "RTOS v2") );
arr.push( new tabElement( "PACK", "/Pack/html/", "Pack") );
arr.push( new tabElement( "Build", "/Build/html/", "Build") );
arr.push( new tabElement( "SVD", "/SVD/html/", "SVD") );
arr.push( new tabElement( "DAP", "/DAP/html/", "DAP") );
arr.push( new tabElement( "ZONE", "/Zone/html/", "Zone") );
// write tabs
// called from the header file.
function writeComponentTabs() {
for ( var i=0; i < arr.length; i++ ) {
if (strgURL.search(arr[i].folderName) > 0) { // if this is the current folder
document.write(arr[i].currentListItem); // then print and hightlight the tab
} else {
document.write(arr[i].listItem); // else, print the tab
}
}
};

View File

@ -1,14 +0,0 @@
<!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>
<title>Redirect to the corresponding Open-CMSIS-Pack page after 0 seconds</title>
<meta http-equiv="refresh" content="0; URL=https://open-cmsis-pack.github.io/devtools/buildmgr/latest/projectDescriptionSchema.html">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If the automatic redirection is failing, click <a href="https://open-cmsis-pack.github.io/devtools/buildmgr/latest/projectDescriptionSchema.html">here</a> or try to find corresponding topic described in <a href="https://www.open-cmsis-pack.org">Open-CMSIS-Pack resources</a>.
</body>
</html>

View File

@ -1,97 +0,0 @@
var cookie_namespace = 'doxygen';
var sidenav,navtree,content,header;
function readCookie(cookie)
{
var myCookie = cookie_namespace+"_"+cookie+"=";
if (document.cookie)
{
var index = document.cookie.indexOf(myCookie);
if (index != -1)
{
var valStart = index + myCookie.length;
var valEnd = document.cookie.indexOf(";", valStart);
if (valEnd == -1)
{
valEnd = document.cookie.length;
}
var val = document.cookie.substring(valStart, valEnd);
return val;
}
}
return 0;
}
function writeCookie(cookie, val, expiration)
{
if (val==undefined) return;
if (expiration == null)
{
var date = new Date();
date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week
expiration = date.toGMTString();
}
document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; expires=" + expiration+"; path=/";
}
function resizeWidth()
{
var windowWidth = $(window).width() + "px";
var sidenavWidth = $(sidenav).outerWidth();
content.css({marginLeft:parseInt(sidenavWidth)+"px"});
writeCookie('width',sidenavWidth, null);
}
function restoreWidth(navWidth)
{
var windowWidth = $(window).width() + "px";
content.css({marginLeft:parseInt(navWidth)+6+"px"});
sidenav.css({width:navWidth + "px"});
}
function resizeHeight()
{
var headerHeight = header.outerHeight();
var footerHeight = footer.outerHeight();
var windowHeight = $(window).height() - headerHeight - footerHeight;
content.css({height:windowHeight + "px"});
navtree.css({height:windowHeight + "px"});
sidenav.css({height:windowHeight + "px",top: headerHeight+"px"});
}
function initResizable()
{
header = $("#top");
sidenav = $("#side-nav");
content = $("#doc-content");
navtree = $("#nav-tree");
footer = $("#nav-path");
$(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } });
$(window).resize(function() { resizeHeight(); });
var width = readCookie('width');
if (width) { restoreWidth(width); } else { resizeWidth(); }
resizeHeight();
var url = location.href;
var i=url.indexOf("#");
if (i>=0) window.location.hash=url.substr(i);
var _preventDefault = function(evt) { evt.preventDefault(); };
$("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault);
$(document).bind('touchmove',function(e){
var device = navigator.userAgent.toLowerCase();
var ios = device.match(/(iphone|ipod|ipad)/);
if (ios) {
try {
var target = e.target;
while (target) {
if ($(target).css('-webkit-overflow-scrolling')=='touch') return;
target = target.parentNode;
}
e.preventDefault();
} catch(err) {
e.preventDefault();
}
}
});
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 563 B

View File

@ -1,12 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</body>
</html>

View File

@ -1,240 +0,0 @@
/*---------------- Search Box */
#FSearchBox {
float: left;
}
#searchli {
float: right;
display: block;
width: 170px;
height: 24px;
}
#MSearchBox {
white-space : nowrap;
position: absolute;
float: none;
display: inline;
margin-top: 3px;
right: 0px;
width: 170px;
z-index: 102;
}
#MSearchBox .left
{
display:block;
position:absolute;
left:10px;
width:20px;
height:19px;
background:url('search_l.png') no-repeat;
background-position:right;
}
#MSearchSelect {
display:block;
position:absolute;
width:20px;
height:19px;
}
.left #MSearchSelect {
left:4px;
}
.right #MSearchSelect {
right:5px;
}
#MSearchField {
display:block;
position:absolute;
height:19px;
background:url('search_m.png') repeat-x;
border:none;
width:116px;
margin-left:20px;
padding-left:4px;
color: #909090;
outline: none;
font: 9pt Arial, Verdana, sans-serif;
}
#FSearchBox #MSearchField {
margin-left:15px;
}
#MSearchBox .right {
display:block;
position:absolute;
right:10px;
top:0px;
width:20px;
height:19px;
background:url('search_r.png') no-repeat;
background-position:left;
}
#MSearchClose {
display: none;
position: absolute;
top: 4px;
background : none;
border: none;
margin: 0px 4px 0px 0px;
padding: 0px 0px;
outline: none;
}
.left #MSearchClose {
left: 6px;
}
.right #MSearchClose {
right: 2px;
}
.MSearchBoxActive #MSearchField {
color: #000000;
}
/*---------------- Search filter selection */
#MSearchSelectWindow {
display: none;
position: absolute;
left: 0; top: 0;
border: 1px solid #90A5CE;
background-color: #F9FAFC;
z-index: 1;
padding-top: 4px;
padding-bottom: 4px;
-moz-border-radius: 4px;
-webkit-border-top-left-radius: 4px;
-webkit-border-top-right-radius: 4px;
-webkit-border-bottom-left-radius: 4px;
-webkit-border-bottom-right-radius: 4px;
-webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
}
.SelectItem {
font: 8pt Arial, Verdana, sans-serif;
padding-left: 2px;
padding-right: 12px;
border: 0px;
}
span.SelectionMark {
margin-right: 4px;
font-family: monospace;
outline-style: none;
text-decoration: none;
}
a.SelectItem {
display: block;
outline-style: none;
color: #000000;
text-decoration: none;
padding-left: 6px;
padding-right: 12px;
}
a.SelectItem:focus,
a.SelectItem:active {
color: #000000;
outline-style: none;
text-decoration: none;
}
a.SelectItem:hover {
color: #FFFFFF;
background-color: #3D578C;
outline-style: none;
text-decoration: none;
cursor: pointer;
display: block;
}
/*---------------- Search results window */
iframe#MSearchResults {
width: 60ex;
height: 15em;
}
#MSearchResultsWindow {
display: none;
position: absolute;
left: 0; top: 0;
border: 1px solid #000;
background-color: #EEF1F7;
}
/* ----------------------------------- */
#SRIndex {
clear:both;
padding-bottom: 15px;
}
.SREntry {
font-size: 10pt;
padding-left: 1ex;
}
.SRPage .SREntry {
font-size: 8pt;
padding: 1px 5px;
}
body.SRPage {
margin: 5px 2px;
}
.SRChildren {
padding-left: 3ex; padding-bottom: .5em
}
.SRPage .SRChildren {
display: none;
}
.SRSymbol {
font-weight: bold;
color: #425E97;
font-family: Arial, Verdana, sans-serif;
text-decoration: none;
outline: none;
}
a.SRScope {
display: block;
color: #425E97;
font-family: Arial, Verdana, sans-serif;
text-decoration: none;
outline: none;
}
a.SRSymbol:focus, a.SRSymbol:active,
a.SRScope:focus, a.SRScope:active {
text-decoration: underline;
}
.SRPage .SRStatus {
padding: 2px 5px;
font-size: 8pt;
font-style: italic;
}
.SRResult {
display: none;
}
DIV.searchresults {
margin-left: 10px;
margin-right: 10px;
}

View File

@ -1,795 +0,0 @@
// Search script generated by doxygen
// Copyright (C) 2009 by Dimitri van Heesch.
// The code in this file is loosly based on main.js, part of Natural Docs,
// which is Copyright (C) 2003-2008 Greg Valure
// Natural Docs is licensed under the GPL.
var indexSectionsWithContent =
{
0: "cmoprs",
1: "cmoprs"
};
var indexSectionNames =
{
0: "all",
1: "pages"
};
function convertToId(search)
{
var result = '';
for (i=0;i<search.length;i++)
{
var c = search.charAt(i);
var cn = c.charCodeAt(0);
if (c.match(/[a-z0-9\u0080-\uFFFF]/))
{
result+=c;
}
else if (cn<16)
{
result+="_0"+cn.toString(16);
}
else
{
result+="_"+cn.toString(16);
}
}
return result;
}
function getXPos(item)
{
var x = 0;
if (item.offsetWidth)
{
while (item && item!=document.body)
{
x += item.offsetLeft;
item = item.offsetParent;
}
}
return x;
}
function getYPos(item)
{
var y = 0;
if (item.offsetWidth)
{
while (item && item!=document.body)
{
y += item.offsetTop;
item = item.offsetParent;
}
}
return y;
}
/* A class handling everything associated with the search panel.
Parameters:
name - The name of the global variable that will be
storing this instance. Is needed to be able to set timeouts.
resultPath - path to use for external files
*/
function SearchBox(name, resultsPath, inFrame, label)
{
if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); }
// ---------- Instance variables
this.name = name;
this.resultsPath = resultsPath;
this.keyTimeout = 0;
this.keyTimeoutLength = 500;
this.closeSelectionTimeout = 300;
this.lastSearchValue = "";
this.lastResultsPage = "";
this.hideTimeout = 0;
this.searchIndex = 0;
this.searchActive = false;
this.insideFrame = inFrame;
this.searchLabel = label;
// ----------- DOM Elements
this.DOMSearchField = function()
{ return document.getElementById("MSearchField"); }
this.DOMSearchSelect = function()
{ return document.getElementById("MSearchSelect"); }
this.DOMSearchSelectWindow = function()
{ return document.getElementById("MSearchSelectWindow"); }
this.DOMPopupSearchResults = function()
{ return document.getElementById("MSearchResults"); }
this.DOMPopupSearchResultsWindow = function()
{ return document.getElementById("MSearchResultsWindow"); }
this.DOMSearchClose = function()
{ return document.getElementById("MSearchClose"); }
this.DOMSearchBox = function()
{ return document.getElementById("MSearchBox"); }
// ------------ Event Handlers
// Called when focus is added or removed from the search field.
this.OnSearchFieldFocus = function(isActive)
{
this.Activate(isActive);
}
this.OnSearchSelectShow = function()
{
var searchSelectWindow = this.DOMSearchSelectWindow();
var searchField = this.DOMSearchSelect();
if (this.insideFrame)
{
var left = getXPos(searchField);
var top = getYPos(searchField);
left += searchField.offsetWidth + 6;
top += searchField.offsetHeight;
// show search selection popup
searchSelectWindow.style.display='block';
left -= searchSelectWindow.offsetWidth;
searchSelectWindow.style.left = left + 'px';
searchSelectWindow.style.top = top + 'px';
}
else
{
var left = getXPos(searchField);
var top = getYPos(searchField);
top += searchField.offsetHeight;
// show search selection popup
searchSelectWindow.style.display='block';
searchSelectWindow.style.left = left + 'px';
searchSelectWindow.style.top = top + 'px';
}
// stop selection hide timer
if (this.hideTimeout)
{
clearTimeout(this.hideTimeout);
this.hideTimeout=0;
}
return false; // to avoid "image drag" default event
}
this.OnSearchSelectHide = function()
{
this.hideTimeout = setTimeout(this.name +".CloseSelectionWindow()",
this.closeSelectionTimeout);
}
// Called when the content of the search field is changed.
this.OnSearchFieldChange = function(evt)
{
if (this.keyTimeout) // kill running timer
{
clearTimeout(this.keyTimeout);
this.keyTimeout = 0;
}
var e = (evt) ? evt : window.event; // for IE
if (e.keyCode==40 || e.keyCode==13)
{
if (e.shiftKey==1)
{
this.OnSearchSelectShow();
var win=this.DOMSearchSelectWindow();
for (i=0;i<win.childNodes.length;i++)
{
var child = win.childNodes[i]; // get span within a
if (child.className=='SelectItem')
{
child.focus();
return;
}
}
return;
}
else if (window.frames.MSearchResults.searchResults)
{
var elem = window.frames.MSearchResults.searchResults.NavNext(0);
if (elem) elem.focus();
}
}
else if (e.keyCode==27) // Escape out of the search field
{
this.DOMSearchField().blur();
this.DOMPopupSearchResultsWindow().style.display = 'none';
this.DOMSearchClose().style.display = 'none';
this.lastSearchValue = '';
this.Activate(false);
return;
}
// strip whitespaces
var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
if (searchValue != this.lastSearchValue) // search value has changed
{
if (searchValue != "") // non-empty search
{
// set timer for search update
this.keyTimeout = setTimeout(this.name + '.Search()',
this.keyTimeoutLength);
}
else // empty search field
{
this.DOMPopupSearchResultsWindow().style.display = 'none';
this.DOMSearchClose().style.display = 'none';
this.lastSearchValue = '';
}
}
}
this.SelectItemCount = function(id)
{
var count=0;
var win=this.DOMSearchSelectWindow();
for (i=0;i<win.childNodes.length;i++)
{
var child = win.childNodes[i]; // get span within a
if (child.className=='SelectItem')
{
count++;
}
}
return count;
}
this.SelectItemSet = function(id)
{
var i,j=0;
var win=this.DOMSearchSelectWindow();
for (i=0;i<win.childNodes.length;i++)
{
var child = win.childNodes[i]; // get span within a
if (child.className=='SelectItem')
{
var node = child.firstChild;
if (j==id)
{
node.innerHTML='&#8226;';
}
else
{
node.innerHTML='&#160;';
}
j++;
}
}
}
// Called when an search filter selection is made.
// set item with index id as the active item
this.OnSelectItem = function(id)
{
this.searchIndex = id;
this.SelectItemSet(id);
var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
if (searchValue!="" && this.searchActive) // something was found -> do a search
{
this.Search();
}
}
this.OnSearchSelectKey = function(evt)
{
var e = (evt) ? evt : window.event; // for IE
if (e.keyCode==40 && this.searchIndex<this.SelectItemCount()) // Down
{
this.searchIndex++;
this.OnSelectItem(this.searchIndex);
}
else if (e.keyCode==38 && this.searchIndex>0) // Up
{
this.searchIndex--;
this.OnSelectItem(this.searchIndex);
}
else if (e.keyCode==13 || e.keyCode==27)
{
this.OnSelectItem(this.searchIndex);
this.CloseSelectionWindow();
this.DOMSearchField().focus();
}
return false;
}
// --------- Actions
// Closes the results window.
this.CloseResultsWindow = function()
{
this.DOMPopupSearchResultsWindow().style.display = 'none';
this.DOMSearchClose().style.display = 'none';
this.Activate(false);
}
this.CloseSelectionWindow = function()
{
this.DOMSearchSelectWindow().style.display = 'none';
}
// Performs a search.
this.Search = function()
{
this.keyTimeout = 0;
// strip leading whitespace
var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
var code = searchValue.toLowerCase().charCodeAt(0);
var idxChar = searchValue.substr(0, 1).toLowerCase();
if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair
{
idxChar = searchValue.substr(0, 2);
}
var resultsPage;
var resultsPageWithSearch;
var hasResultsPage;
var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar);
if (idx!=-1)
{
var hexCode=idx.toString(16);
resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';
resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
hasResultsPage = true;
}
else // nothing available for this search term
{
resultsPage = this.resultsPath + '/nomatches.html';
resultsPageWithSearch = resultsPage;
hasResultsPage = false;
}
window.frames.MSearchResults.location = resultsPageWithSearch;
var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
if (domPopupSearchResultsWindow.style.display!='block')
{
var domSearchBox = this.DOMSearchBox();
this.DOMSearchClose().style.display = 'inline';
if (this.insideFrame)
{
var domPopupSearchResults = this.DOMPopupSearchResults();
domPopupSearchResultsWindow.style.position = 'relative';
domPopupSearchResultsWindow.style.display = 'block';
var width = document.body.clientWidth - 8; // the -8 is for IE :-(
domPopupSearchResultsWindow.style.width = width + 'px';
domPopupSearchResults.style.width = width + 'px';
}
else
{
var domPopupSearchResults = this.DOMPopupSearchResults();
var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;
var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1;
domPopupSearchResultsWindow.style.display = 'block';
left -= domPopupSearchResults.offsetWidth;
domPopupSearchResultsWindow.style.top = top + 'px';
domPopupSearchResultsWindow.style.left = left + 'px';
}
}
this.lastSearchValue = searchValue;
this.lastResultsPage = resultsPage;
}
// -------- Activation Functions
// Activates or deactivates the search panel, resetting things to
// their default values if necessary.
this.Activate = function(isActive)
{
if (isActive || // open it
this.DOMPopupSearchResultsWindow().style.display == 'block'
)
{
this.DOMSearchBox().className = 'MSearchBoxActive';
var searchField = this.DOMSearchField();
if (searchField.value == this.searchLabel) // clear "Search" term upon entry
{
searchField.value = '';
this.searchActive = true;
}
}
else if (!isActive) // directly remove the panel
{
this.DOMSearchBox().className = 'MSearchBoxInactive';
this.DOMSearchField().value = this.searchLabel;
this.searchActive = false;
this.lastSearchValue = ''
this.lastResultsPage = '';
}
}
}
// -----------------------------------------------------------------------
// The class that handles everything on the search results page.
function SearchResults(name)
{
// The number of matches from the last run of <Search()>.
this.lastMatchCount = 0;
this.lastKey = 0;
this.repeatOn = false;
// Toggles the visibility of the passed element ID.
this.FindChildElement = function(id)
{
var parentElement = document.getElementById(id);
var element = parentElement.firstChild;
while (element && element!=parentElement)
{
if (element.nodeName == 'DIV' && element.className == 'SRChildren')
{
return element;
}
if (element.nodeName == 'DIV' && element.hasChildNodes())
{
element = element.firstChild;
}
else if (element.nextSibling)
{
element = element.nextSibling;
}
else
{
do
{
element = element.parentNode;
}
while (element && element!=parentElement && !element.nextSibling);
if (element && element!=parentElement)
{
element = element.nextSibling;
}
}
}
}
this.Toggle = function(id)
{
var element = this.FindChildElement(id);
if (element)
{
if (element.style.display == 'block')
{
element.style.display = 'none';
}
else
{
element.style.display = 'block';
}
}
}
// Searches for the passed string. If there is no parameter,
// it takes it from the URL query.
//
// Always returns true, since other documents may try to call it
// and that may or may not be possible.
this.Search = function(search)
{
if (!search) // get search word from URL
{
search = window.location.search;
search = search.substring(1); // Remove the leading '?'
search = unescape(search);
}
search = search.replace(/^ +/, ""); // strip leading spaces
search = search.replace(/ +$/, ""); // strip trailing spaces
search = search.toLowerCase();
search = convertToId(search);
var resultRows = document.getElementsByTagName("div");
var matches = 0;
var i = 0;
while (i < resultRows.length)
{
var row = resultRows.item(i);
if (row.className == "SRResult")
{
var rowMatchName = row.id.toLowerCase();
rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_'
if (search.length<=rowMatchName.length &&
rowMatchName.substr(0, search.length)==search)
{
row.style.display = 'block';
matches++;
}
else
{
row.style.display = 'none';
}
}
i++;
}
document.getElementById("Searching").style.display='none';
if (matches == 0) // no results
{
document.getElementById("NoMatches").style.display='block';
}
else // at least one result
{
document.getElementById("NoMatches").style.display='none';
}
this.lastMatchCount = matches;
return true;
}
// return the first item with index index or higher that is visible
this.NavNext = function(index)
{
var focusItem;
while (1)
{
var focusName = 'Item'+index;
focusItem = document.getElementById(focusName);
if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
{
break;
}
else if (!focusItem) // last element
{
break;
}
focusItem=null;
index++;
}
return focusItem;
}
this.NavPrev = function(index)
{
var focusItem;
while (1)
{
var focusName = 'Item'+index;
focusItem = document.getElementById(focusName);
if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
{
break;
}
else if (!focusItem) // last element
{
break;
}
focusItem=null;
index--;
}
return focusItem;
}
this.ProcessKeys = function(e)
{
if (e.type == "keydown")
{
this.repeatOn = false;
this.lastKey = e.keyCode;
}
else if (e.type == "keypress")
{
if (!this.repeatOn)
{
if (this.lastKey) this.repeatOn = true;
return false; // ignore first keypress after keydown
}
}
else if (e.type == "keyup")
{
this.lastKey = 0;
this.repeatOn = false;
}
return this.lastKey!=0;
}
this.Nav = function(evt,itemIndex)
{
var e = (evt) ? evt : window.event; // for IE
if (e.keyCode==13) return true;
if (!this.ProcessKeys(e)) return false;
if (this.lastKey==38) // Up
{
var newIndex = itemIndex-1;
var focusItem = this.NavPrev(newIndex);
if (focusItem)
{
var child = this.FindChildElement(focusItem.parentNode.parentNode.id);
if (child && child.style.display == 'block') // children visible
{
var n=0;
var tmpElem;
while (1) // search for last child
{
tmpElem = document.getElementById('Item'+newIndex+'_c'+n);
if (tmpElem)
{
focusItem = tmpElem;
}
else // found it!
{
break;
}
n++;
}
}
}
if (focusItem)
{
focusItem.focus();
}
else // return focus to search field
{
parent.document.getElementById("MSearchField").focus();
}
}
else if (this.lastKey==40) // Down
{
var newIndex = itemIndex+1;
var focusItem;
var item = document.getElementById('Item'+itemIndex);
var elem = this.FindChildElement(item.parentNode.parentNode.id);
if (elem && elem.style.display == 'block') // children visible
{
focusItem = document.getElementById('Item'+itemIndex+'_c0');
}
if (!focusItem) focusItem = this.NavNext(newIndex);
if (focusItem) focusItem.focus();
}
else if (this.lastKey==39) // Right
{
var item = document.getElementById('Item'+itemIndex);
var elem = this.FindChildElement(item.parentNode.parentNode.id);
if (elem) elem.style.display = 'block';
}
else if (this.lastKey==37) // Left
{
var item = document.getElementById('Item'+itemIndex);
var elem = this.FindChildElement(item.parentNode.parentNode.id);
if (elem) elem.style.display = 'none';
}
else if (this.lastKey==27) // Escape
{
parent.searchBox.CloseResultsWindow();
parent.document.getElementById("MSearchField").focus();
}
else if (this.lastKey==13) // Enter
{
return true;
}
return false;
}
this.NavChild = function(evt,itemIndex,childIndex)
{
var e = (evt) ? evt : window.event; // for IE
if (e.keyCode==13) return true;
if (!this.ProcessKeys(e)) return false;
if (this.lastKey==38) // Up
{
if (childIndex>0)
{
var newIndex = childIndex-1;
document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();
}
else // already at first child, jump to parent
{
document.getElementById('Item'+itemIndex).focus();
}
}
else if (this.lastKey==40) // Down
{
var newIndex = childIndex+1;
var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);
if (!elem) // last child, jump to parent next parent
{
elem = this.NavNext(itemIndex+1);
}
if (elem)
{
elem.focus();
}
}
else if (this.lastKey==27) // Escape
{
parent.searchBox.CloseResultsWindow();
parent.document.getElementById("MSearchField").focus();
}
else if (this.lastKey==13) // Enter
{
return true;
}
return false;
}
}
function setKeyActions(elem,action)
{
elem.setAttribute('onkeydown',action);
elem.setAttribute('onkeypress',action);
elem.setAttribute('onkeyup',action);
}
function setClassAttr(elem,attr)
{
elem.setAttribute('class',attr);
elem.setAttribute('className',attr);
}
function createResults()
{
var results = document.getElementById("SRResults");
for (var e=0; e<searchData.length; e++)
{
var id = searchData[e][0];
var srResult = document.createElement('div');
srResult.setAttribute('id','SR_'+id);
setClassAttr(srResult,'SRResult');
var srEntry = document.createElement('div');
setClassAttr(srEntry,'SREntry');
var srLink = document.createElement('a');
srLink.setAttribute('id','Item'+e);
setKeyActions(srLink,'return searchResults.Nav(event,'+e+')');
setClassAttr(srLink,'SRSymbol');
srLink.innerHTML = searchData[e][1][0];
srEntry.appendChild(srLink);
if (searchData[e][1].length==2) // single result
{
srLink.setAttribute('href',searchData[e][1][1][0]);
if (searchData[e][1][1][1])
{
srLink.setAttribute('target','_parent');
}
var srScope = document.createElement('span');
setClassAttr(srScope,'SRScope');
srScope.innerHTML = searchData[e][1][1][2];
srEntry.appendChild(srScope);
}
else // multiple results
{
srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")');
var srChildren = document.createElement('div');
setClassAttr(srChildren,'SRChildren');
for (var c=0; c<searchData[e][1].length-1; c++)
{
var srChild = document.createElement('a');
srChild.setAttribute('id','Item'+e+'_c'+c);
setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')');
setClassAttr(srChild,'SRScope');
srChild.setAttribute('href',searchData[e][1][c+1][0]);
if (searchData[e][1][c+1][1])
{
srChild.setAttribute('target','_parent');
}
srChild.innerHTML = searchData[e][1][c+1][2];
srChildren.appendChild(srChild);
}
srEntry.appendChild(srChildren);
}
srResult.appendChild(srEntry);
results.appendChild(srResult);
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 604 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 612 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 853 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 845 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 177 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 232 B

View File

@ -1,71 +0,0 @@
.tabs, .tabs1, .tabs2, .tabs3 {
background-image: url('tab_b.png');
width: 100%;
z-index: 101;
font-size: 10px;
}
.tabs1 {
background-image: url('tab_topnav.png');
font-size: 12px;
}
.tabs2 {
font-size: 10px;
}
.tabs3 {
font-size: 9px;
}
.tablist {
margin: 0;
padding: 0;
display: table;
line-height: 24px;
}
.tablist li {
float: left;
display: table-cell;
background-image: url('tab_b.png');
list-style: none;
}
.tabs1 .tablist li {
float: left;
display: table-cell;
background-image: url('tab_topnav.png');
list-style: none;
}
.tablist a {
display: block;
padding: 0 20px;
font-weight: bold;
background-image:url('tab_s.png');
background-repeat:no-repeat;
background-position:right;
color: #283A5D;
text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
text-decoration: none;
outline: none;
}
.tabs3 .tablist a {
padding: 0 10px;
}
.tablist a:hover {
background-image: url('tab_h.png');
background-repeat:repeat-x;
color: #fff;
text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
text-decoration: none;
}
.tablist li.current a {
background-image: url('tab_a.png');
background-repeat:repeat-x;
color: #fff;
text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,71 +0,0 @@
/** \page coreMISRA_Exceptions_pg MISRA-C Deviations
CMSIS-Core (Cortex-M) uses the common coding rules for CMSIS components that are documented under
\ifnot FuSaRTS <a href="../../General/html/index.html"><b>Introduction</b></a> \endif \if FuSaRTS <a href="../../Safety/html/index.html#CodingRules"><b>Coding Rules</b></a> \endif.
*/
/* MISRA-C:2004 no longer included in build
CMSIS-Core (Cortex-M) violates the following MISRA-C:2004 rules:
- Required Rule 8.5, object/function definition in header file.<br>
Violated since function definitions in header files are used for function inlining'.
- Advisory Rule 12.4, Side effects on right hand side of logical operator.<br>
Violated because volatile is used for core register definitions.
- Advisory Rule 14.7, Return statement before end of function.<br>
Violated to simplify code logic.
- Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>
Violated since unions are used for effective representation of core registers.
- Advisory Rule 19.4, Disallowed definition for macro.<br>
Violated since macros are used for assembler keywords.
- Advisory Rule 19.7, Function-like macro defined.<br>
Violated since function-like macros are used to generate more efficient code.
- Advisory Rule 19.16, all preprocessing directives must be valid.<br>
Violated to set default settings for macros.
*/
/**
CMSIS-Core (Cortex-M) violates the following MISRA-C:2012 rules:
- Directive 4.9, function-like macro defined.<br>
Violated since function-like macros are used to generate more efficient code.
- Rule 1.3, multiple use of '#/##' operators in macro definition.<br>
Violated since function-like macros are used to generate more efficient code.
- Rule 11.4, conversion between a pointer and integer type.<br>
Violated because of core register access.
- Rule 11.6, cast from unsigned long to pointer.<br>
Violated because of core register access.
- Rule 13.5, side effects on right hand side of logical operator.<br>
Violated because of shift operand is used in macros and functions.
- Rule 14.4, conditional expression should have essentially Boolean type.<br>
Violated since macros with several instructions are used.
- Rule 15.5, return statement before end of function.<br>
Violated to simplify code logic.
- Rule 20.10, '#/##' operators used.<br>
Violated since function-like macros are used to generate more efficient code.
- Rule 21.1, reserved to the compiler.<br>
Violated since macros with leading underscores are used.
&lt;device&gt;.h files generated by <b>SVDConv.exe</b> violate the following MISRA-C:2004 rules:
- Advisory Rule 20.2, Re-use of C90 identifier pattern.<br>
Violated since CMSIS macros begin with '__'. Since CMSIS is developed and verified with various compilers this approach is acceptable and avoids conflicts with user symbols.
- Advisory Rule 19.1, Declaration before \#include.<br>
Violated since Interrupt Number Definition Type (IRQn_Type) must be defined before including the core header file.
*/

View File

@ -1,457 +0,0 @@
/** \mainpage Overview
CMSIS-Core (Cortex-M) implements the basic run-time system for a Cortex-M device and gives the user access to the processor core and the device peripherals.
In detail it defines:
- <b>Hardware Abstraction Layer (HAL)</b> for Cortex-M processor registers with standardized definitions for the SysTick, NVIC, System Control Block registers, MPU registers, FPU registers, and core access functions.
- <b>System exception names</b> to interface to system exceptions without having compatibility issues.
- <b>Methods to organize header files</b> that makes it easy to learn new Cortex-M microcontroller products and improve software portability. This includes naming conventions for device-specific interrupts.
- <b>Methods for system initialization</b> to be used by each MCU vendor. For example, the standardized SystemInit() function is essential for configuring the clock system of the device.
- <b>Intrinsic functions</b> used to generate CPU instructions that are not supported by standard C functions.
- A variable to determine the <b>system clock frequency</b> which simplifies the setup the SysTick timer.
The following sections provide details about the CMSIS-Core (Cortex-M):
- \ref using_pg describes the project setup and shows a simple program example.
\if ARMv8M
- \ref using_TrustZone_pg "Using TrustZone&reg; for Armv8-M" describes how to use the security extensions available in the Armv8-M architecture.
\endif
- \ref templates_pg describes the files of the CMSIS-Core (Cortex-M) in detail and explains how to adapt template files provided by Arm to silicon vendor devices.
- \ref coreMISRA_Exceptions_pg describes the violations to the MISRA standard.
- <a href="modules.html">\b Reference </a> describe the features and functions of the \ref device_h_pg in detail.
- <a href="annotated.html">\b Data \b Structures </a> describe the data structures of the \ref device_h_pg in detail.
<hr>
CMSIS-Core (Cortex-M) in ARM::CMSIS Pack
-----------------------------
Files relevant to CMSIS-Core (Cortex-M) are present in the following <b>ARM::CMSIS</b> directories:
|File/Folder |Content |
|------------------------------|------------------------------------------------------------------------|
|\b CMSIS\\Documentation\\Core | This documentation |
|\b CMSIS\\Core\\Include | CMSIS-Core (Cortex-M) header files (for example core_cm3.h, core_cmInstr.h, etc.) |
|\b Device | \ref using_ARM_pg "Arm reference implementations" of Cortex-M devices |
|\b Device\\\_Template_Vendor | \ref templates_pg for extension by silicon vendors |
<hr>
\section ref_v6-v8M Processor Support
CMSIS supports the complete range of <a href="https://developer.arm.com/products/processors/cortex-m" target="_blank"><b>Cortex-M processors</b></a> and
the <a href="https://developer.arm.com/architectures/cpu-architecture/m-profile" target="_blank"><b>Armv8-M/v8.1-M architecture</b></a> including security extensions.
\subsection ref_man_sec Cortex-M Generic User Guides
The Cortex-M Device Generic User Guides contain the programmers model and detailed information about the core peripherals and are available for:
- <a href="https://developer.arm.com/documentation/dui0497/latest/" target="_blank"><b>Cortex-M0 Devices Generic User Guide</b></a> (Armv6-M architecture)
- <a href="https://developer.arm.com/documentation/dui0662/latest/" target="_blank"><b>Cortex-M0+ Devices Generic User Guide</b></a> (Armv6-M architecture)
- <a href="https://developer.arm.com/documentation/dui0552/latest/" target="_blank"><b>Cortex-M3 Devices Generic User Guide</b></a> (Armv7-M architecture)
- <a href="https://developer.arm.com/documentation/dui0553/latest/" target="_blank"><b>Cortex-M4 Devices Generic User Guide</b></a> (Armv7-M architecture)
- <a href="https://developer.arm.com/documentation/dui0646/latest/" target="_blank"><b>Cortex-M7 Devices Generic User Guide</b></a> (Armv7-M architecture)
- <a href="https://developer.arm.com/documentation/dui1095/latest/" target="_blank"><b>Cortex-M23 Devices Generic User Guide</b></a> (Armv8-M architecture)
- <a href="https://developer.arm.com/documentation/100235/latest/" target="_blank"><b>Cortex-M33 Devices Generic User Guide</b></a> (Armv8-M architecture)
- <a href="https://developer.arm.com/documentation/101273/latest/" target="_blank"><b>Cortex-M55 Devices Generic User Guide</b></a> (Armv8.1-M architecture)
- <a href="https://developer.arm.com/documentation/101928/latest" target="_blank"><b>Cortex-M85 Devices Generic User Guide</b></a> (Armv8.1-M architecture)
CMSIS also supports the following Cortex-M processor variants:
- <a href="https://developer.arm.com/products/processors/cortex-m/cortex-m1" target="_blank"><b>Cortex-M1</b></a> is a processor designed specifically for implementation in FPGAs (Armv6-M architecture).
- <a href="https://developer.arm.com/products/processors/cortex-m/sc000-processor" target="_blank"><b>SecurCore SC000</b></a> is designed specifically for smartcard and security applications (Armv6-M architecture).
- <a href="https://developer.arm.com/products/processors/cortex-m/sc300-processor" target="_blank"><b>SecurCore SC300</b></a> is designed specifically for smartcard and security applications (Armv7-M architecture).
- <a href="https://developer.arm.com/products/processors/cortex-m/cortex-m35p" target="_blank"><b>Cortex-M35P</b></a> is a tamper resistant Cortex-M processor with optional software isolation using TrustZone for Armv8-M.
- <a href="https://www.armchina.com/mountain?infoId=160" target="_blank"><b>STAR-MC1</b></a> is a variant of Armv8-M with TrustZone designed by Arm China.
\subsection ARMv8M Armv8-M and Armv8.1-M Architecture
Armv8-M introduces two profiles \b baseline (for power and area constrained applications) and \b mainline (full-featured with optional SIMD, floating-point, and co-processor extensions).
Both Armv8-M profiles and Armv8.1-M are supported by CMSIS.
The Armv8-M architecture is described in the <a href="https://developer.arm.com/documentation/ddi0553/latest/" target="_blank"><b>Armv8-M Architecture Reference Manual</b></a>.
The Armv8.1-M architecture further extends Armv8-M with Helium (the so called M-Profile Vector Extension (MVE)), as well as further instruction set and debug extensions.
More information about Armv8.1-M architecture is available under <a href="https://developer.arm.com/technologies/helium" target="_blank"><b>Arm Helium technology</b></a>.
<hr>
\section tested_tools_sec Tested and Verified Toolchains
The \ref templates_pg supplied by Arm have been tested and verified with the following toolchains:
- Arm: Arm Compiler 5.06 update 7 (not for Cortex-M23/33/35P/55/85, Armv8-M, Armv8.1-M)
- Arm: Arm Compiler 6.16
- Arm: Arm Compiler 6.6.4 (not for Cortex-M0/23/33/35P/55/85, Armv8-M, Armv8.1-M)
- GNU: GNU Arm Embedded Toolchain 10-2020-q4-major (10.2.1 20201103)
- IAR: IAR ANSI C/C++ Compiler for Arm 8.20.1.14183
*/
/*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
/**
\page core_revisionHistory Revision History of CMSIS-Core (Cortex-M)
<table class="cmtable" summary="Revision History">
<tr>
<th>Version</th>
<th>Description</th>
</tr>
<tr>
<td>V5.7.0</td>
<td>
<ul>
<li>Added: Added new compiler macros __ALIAS and __NO_INIT</li>
</ul>
</td>
</tr>
<tr>
<td>V5.6.0</td>
<td>
<ul>
<li>Added: Arm Cortex-M85 cpu support</li>
<li>Added: Arm China Star-MC1 cpu support</li>
<li>Updated: system_ARMCM55.c</li>
</ul>
</td>
</tr>
<tr>
<td>V5.5.0</td>
<td>
<ul>
<li>Updated GCC LinkerDescription, GCC Assembler startup</li>
<li>Added ARMv8-M Stack Sealing (to linker, startup) for toolchain ARM, GCC</li>
<li>Changed C-Startup to default Startup.</li>
</li>
Updated Armv8-M Assembler startup to use GAS syntax<br>
Note: Updating existing projects may need manual user interaction!
</li>
</ul>
</td>
</tr>
<tr>
<td>V5.4.0</td>
<td>
<ul>
\if ARMv8M
<li>Added: Cortex-M55 cpu support</li>
<li>Enhanced: MVE support for Armv8.1-MML</li>
\endif
<li>Fixed: Device config define checks</li>
<li>Added: L1 Cache functions for Armv7-M and later</li>
</ul>
</td>
</tr>
<tr>
<td>V5.3.0</td>
<td>
<ul>
<li>Added: Provisions for compiler-independent C startup code.</li>
</ul>
</td>
</tr>
<tr>
<td>V5.2.1</td>
<td>
<ul>
<li>Fixed: Compilation issue in cmsis_armclang_ltm.h introduced in 5.2.0</li>
</ul>
</td>
</tr>
<tr>
<td>V5.2.0</td>
<td>
<ul>
<li>Added: Cortex-M35P support.</li>
<li>Added: Cortex-M1 support.
<li>Added: Armv8.1 architecture support.
<li>Added: \ref __RESTRICT and \ref __STATIC_FORCEINLINE compiler control macros.
</ul>
</td>
</tr>
<tr>
<td>V5.1.2</td>
<td>
<ul>
<li>Removed using get/set built-ins FPSCR in GCC >= 7.2 due to shortcomings.</li>
<li>Added __NO_RETURN to __NVIC_SystemReset() to silence compiler warnings.</li>
<li>Added support for Cortex-M1 (beta).</li>
<li>Removed usage of register keyword.</li>
<li>Added defines for EXC_RETURN, FNC_RETURN and integrity signature values.</li>
<li>Enhanced MPUv7 API with defines for memory access attributes.</li>
</ul>
</td>
</tr>
<tr>
<td>V5.1.1</td>
<td>
<ul>
<li>Aligned MSPLIM and PSPLIM access functions along supported compilers.</li>
</ul>
</td>
</tr>
<tr>
<td>V5.1.0</td>
<td>
<ul>
<li>Added MPU Functions for ARMv8-M for Cortex-M23/M33.</li>
<li>Moved __SSAT and __USAT intrinsics to CMSIS-Core.</li>
<li>Aligned __REV, __REV16 and __REVSH intrinsics along supported compilers.</li>
</ul>
</td>
</tr>
<tr>
<td>V5.0.2</td>
<td>
<ul>
<li>Added macros \ref \__UNALIGNED_UINT16_READ, \ref \__UNALIGNED_UINT16_WRITE.</li>
<li>Added macros \ref \__UNALIGNED_UINT32_READ, \ref \__UNALIGNED_UINT32_WRITE.</li>
<li>Deprecated macro \ref \__UNALIGNED_UINT32.</li>
<li>Changed \ref version_control_gr macros to be core agnostic.</li>
<li>Added \ref mpu_functions for Cortex-M0+/M3/M4/M7.</li>
</ul>
</td>
</tr>
<tr>
<td>V5.0.1</td>
<td>
<ul>
<li>Added: macro \ref \__PACKED_STRUCT.</li>
<li>Added: uVisor support.</li>
</ul>
</td>
</tr>
<tr>
<td>V5.00</td>
<td>
<ul>
<li>Added: Cortex-M23, Cortex-M33 support.</li>
<li>Added: macro __SAU_PRESENT with __SAU_REGION_PRESENT.</li>
<li>Replaced: macro __SAU_PRESENT with __SAU_REGION_PRESENT.</li>
<li>Reworked: SAU register and functions.</li>
<li>Added: macro \ref \__ALIGNED.</li>
<li>Updated: function \ref SCB_EnableICache.</li>
<li>Added: cmsis_compiler.h with compiler specific CMSIS macros, functions, instructions.</li>
<li>Added: macro \ref \__PACKED.</li>
<li>Updated: compiler specific include files.</li>
<li>Updated: core dependant include files.</li>
<li>Removed: deprecated files core_cmfunc.h, core_cminstr.h, core_cmsimd.h.</li>
</ul>
</td>
</tr>
<tr>
<td>V5.00<br>Beta 6</td>
<td>
<ul>
<li>Added: SCB_CFSR register bit definitions.</li>
<li>Added: function \ref NVIC_GetEnableIRQ.</li>
<li>Updated: core instruction macros \ref \__NOP, \ref \__WFI, \ref \__WFE, \ref \__SEV for toolchain GCC.</li>
</ul>
</td>
</tr>
<tr>
<td>V5.00<br>Beta 5</td>
<td>
<ul>
<li>Moved: DSP libraries from CMSIS/DSP/Lib to CMSIS/Lib.</li>
<li>Added: DSP libraries build projects to CMSIS pack.</li>
</ul>
</td>
</tr>
<tr>
<td>V5.00<br>Beta 4</td>
<td>
<ul>
<li>Updated: ARMv8M device files.</li>
<li>Corrected: ARMv8MBL interrupts.</li>
<li>Reworked: NVIC functions.</li>
</ul>
</td>
</tr>
<tr>
<td>V5.00<br>Beta 2</td>
<td>
<ul>
\if ARMv8M
<li>Changed: ARMv8M SAU regions to 8.</li>
<li>Changed: moved function \ref TZ_SAU_Setup to file partition_&lt;device&gt;.h.</li>
\endif
<li>Changed: license under Apache-2.0.</li>
<li>Added: check if macro is defined before use.</li>
<li>Corrected: function \ref SCB_DisableDCache.</li>
<li>Corrected: macros \ref \_VAL2FLD, \ref \_FLD2VAL.</li>
<li>Added: NVIC function virtualization with macros \ref CMSIS_NVIC_VIRTUAL and \ref CMSIS_VECTAB_VIRTUAL.</li>
</ul>
</td>
</tr>
<tr>
<td>V5.00<br>Beta 1</td>
<td>
<ul>
<li>Renamed: cmsis_armcc_V6.h to cmsis_armclang.h.</li>
<li>Renamed: core\_*.h to lower case.</li>
<li>Added: function \ref SCB_GetFPUType to all CMSIS cores.</li>
<li>Added: ARMv8-M support.</li>
</ul>
</td>
</tr>
<tr>
<td>V4.30</td>
<td>
<ul>
<li>Corrected: DoxyGen function parameter comments.</li>
<li>Corrected: IAR toolchain: removed for \ref NVIC_SystemReset the attribute(noreturn).</li>
<li>Corrected: GCC toolchain: suppressed irrelevant compiler warnings.</li>
<li>Added: Support files for Arm Compiler v6 (cmsis_armcc_v6.h).</li>
</ul>
</td>
</tr>
<tr>
<td>V4.20</td>
<td>
<ul>
<li>Corrected: MISRA-C:2004 violations.</li>
<li>Corrected: predefined macro for TI CCS Compiler.</li>
<li>Corrected: function \ref __SHADD16 in arm_math.h.</li>
<li>Updated: cache functions for Cortex-M7.</li>
<li>Added: macros \ref _VAL2FLD, \ref _FLD2VAL to core\_*.h.</li>
<li>Updated: functions \ref __QASX, \ref __QSAX, \ref __SHASX, \ref __SHSAX.</li>
<li>Corrected: potential bug in function \ref __SHADD16.</li>
</ul>
</td>
</tr>
<tr>
<td>V4.10</td>
<td>
<ul>
<li>Corrected: MISRA-C:2004 violations.</li>
<li>Corrected: intrinsic functions \ref __DSB, \ref __DMB, \ref __ISB.</li>
<li>Corrected: register definitions for ITCMCR register.</li>
<li>Corrected: register definitions for \ref CONTROL_Type register.</li>
<li>Added: functions \ref SCB_GetFPUType, \ref SCB_InvalidateDCache_by_Addr to core_cm7.h.</li>
<li>Added: register definitions for \ref APSR_Type, \ref IPSR_Type, \ref xPSR_Type register.</li>
<li>Added: \ref __set_BASEPRI_MAX function to core_cmFunc.h.</li>
<li>Added: intrinsic functions \ref __RBIT, \ref __CLZ for Cortex-M0/CortexM0+.</li>
</ul>
</td>
</tr>
<tr>
<td>V4.00</td>
<td>
<ul>
<li>Added: Cortex-M7 support.</li>
<li>Added: intrinsic functions for \ref __RRX, \ref __LDRBT, \ref __LDRHT, \ref __LDRT, \ref __STRBT, \ref __STRHT, and \ref __STRT</li>
</ul>
</td>
</tr>
<tr>
<td>V3.40</td>
<td>
<ul>
<li>Corrected: C++ include guard settings.</li>
</ul>
</td>
</tr>
<tr>
<td>V3.30</td>
<td>
<ul>
<li>Added: COSMIC tool chain support.</li>
<li>Corrected: GCC __SMLALDX instruction intrinsic for Cortex-M4.</li>
<li>Corrected: GCC __SMLALD instruction intrinsic for Cortex-M4.</li>
<li>Corrected: GCC/CLang warnings.</li>
</ul>
</td>
</tr>
<tr>
<td>V3.20</td>
<td>
<ul>
<li>Added: \ref __BKPT instruction intrinsic.</li>
<li>Added: \ref __SMMLA instruction intrinsic for Cortex-M4.</li>
<li>Corrected: \ref ITM_SendChar.</li>
<li>Corrected: \ref __enable_irq, \ref __disable_irq and inline assembly for GCC Compiler.</li>
<li>Corrected: \ref NVIC_GetPriority and VTOR_TBLOFF for Cortex-M0/M0+, SC000.</li>
<li>Corrected: rework of in-line assembly functions to remove potential compiler warnings.</li>
</ul>
</td>
</tr>
<tr>
<td>V3.01</td>
<td>
<ul>
<li>Added support for Cortex-M0+ processor.</li>
</ul>
</td>
</tr>
<tr>
<td>V3.00</td>
<td>
<ul>
<li>Added support for GNU GCC ARM Embedded Compiler.</li>
<li>Added function \ref __ROR.</li>
<li>Added \ref regMap_pg for TPIU, DWT.</li>
<li>Added support for \ref core_config_sect "SC000 and SC300 processors".</li>
<li>Corrected \ref ITM_SendChar function.</li>
<li>Corrected the functions \ref __STREXB, \ref __STREXH, \ref __STREXW for the GNU GCC compiler section.</li>
<li>Documentation restructured.</li>
</ul>
</td>
</tr>
<tr>
<td>V2.10</td>
<td>
<ul>
<li>Updated documentation.</li>
<li>Updated CMSIS core include files.</li>
<li>Changed CMSIS/Device folder structure.</li>
<li>Added support for Cortex-M0, Cortex-M4 w/o FPU to CMSIS DSP library.</li>
<li>Reworked CMSIS DSP library examples.</li>
</ul>
</td>
</tr>
<tr>
<td>V2.00</td>
<td>
<ul>
<li>Added support for Cortex-M4 processor.</li>
</ul>
</td>
</tr>
<tr>
<td>V1.30</td>
<td>
<ul>
<li>Reworked Startup Concept.</li>
<li>Added additional Debug Functionality.</li>
<li>Changed folder structure.</li>
<li>Added doxygen comments.</li>
<li>Added definitions for bit.</li>
</ul>
</td>
</tr>
<tr>
<td>V1.01</td>
<td>
<ul>
<li>Added support for Cortex-M0 processor.</li>
</ul>
</td>
</tr>
<tr>
<td>V1.01</td>
<td>
<ul>
<li>Added intrinsic functions for \ref __LDREXB, \ref __LDREXH, \ref __LDREXW, \ref __STREXB, \ref __STREXH, \ref __STREXW, and \ref __CLREX</li>
</ul>
</td>
</tr>
<tr>
<td>V1.00</td>
<td>
<ul>
<li>Initial Release for Cortex-M3 processor.</li>
</ul>
</td>
</tr>
</table>
*/

View File

@ -1,546 +0,0 @@
/**************************************************************************************************/
/**
\defgroup compiler_conntrol_gr Compiler Control
\brief Compiler agnostic \#define symbols for generic C/C++ source code
\details
The CMSIS-Core provides the header file <b>cmsis_compiler.h</b> with consistent \#define symbols for generate C or C++ source files that should be compiler agnostic.
Each CMSIS compliant compiler should support the functionality described in this section.
The header file <b>cmsis_compiler.h</b> is also included by each \ref device_h_pg so that these definitions are available.
@{
*/
/**
\def __ARM_ARCH_6M__
\brief Set to 1 when generating code for Armv6-M (Cortex-M0, Cortex-M1)
\details
The <b>\#define __ARM_ARCH_6M__</b> is set to 1 when generating code for the Armv6-M architecture. This architecture is for example used by the Cortex-M0, Cortex-M0+, and Cortex-M1 processor.
*/
#define __ARM_ARCH_6M__
/**
\def __ARM_ARCH_7M__
\brief Set to 1 when generating code for Armv7-M (Cortex-M3)
\details
The <b>\#define __ARM_ARCH_7M__</b> is set to 1 when generating code for the Armv7-M architecture. This architecture is for example used by the Cortex-M3 processor.
*/
#define __ARM_ARCH_7M__
/**
\def __ARM_ARCH_7EM__
\brief Set to 1 when generating code for Armv7-M (Cortex-M4) with FPU
\details
The <b>\#define __ARM_ARCH_7EM__</b> is set to 1 when generating code for the Armv7-M architecture with floating point extension. This architecture is for example used by the Cortex-M4 processor with FPU
*/
#define __ARM_ARCH_7EM__
/**
\cond (ARMv8M)
*/
/**
\def __ARM_ARCH_8M_BASE__
\brief Set to 1 when generating code for Armv8-M Baseline
\details
The <b>\#define __ARM_ARCH_8M_BASE__</b> is set to 1 when generating code for the Armv8-M architecture baseline variant.
*/
#define __ARM_ARCH_8M_BASE__
/**
\def __ARM_ARCH_8M_MAIN__
\brief Set to 1 when generating code for Armv8-M Mainline
\details
The <b>\#define __ARM_ARCH_8M_MAIN__</b> is set to 1 when generating code for the Armv8-M architecture mainline variant.
*/
#define __ARM_ARCH_8M_MAIN__
/**
\endcond
*/
/**************************************************************************************************/
/**
\def __ASM
\brief Pass information from the compiler to the assembler.
\details
The \b __ASM keyword can declare or define an embedded assembly function or incorporate inline assembly into a function
(shown in the code example below).
<b>Code Example:</b>
\code
// Reverse bit order of value
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
{
uint32_t result;
__ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );
return(result);
}
\endcode
*/
#define __ASM
/**************************************************************************************************/
/**
\def __INLINE
\brief Recommend that function should be inlined by the compiler.
\details
Inline functions offer a trade-off between code size and performance. By default, the compiler decides during optimization whether to
inline code or not. The \b __INLINE attribute gives the compiler an hint to inline this function. Still, the compiler may decide not to inline
the function. As the function is global an callable function is also generated.
<b>Code Example:</b>
\code
const uint32_t led_mask[] = {1U << 4, 1U << 5, 1U << 6, 1U << 7};
/*------------------------------------------------------------------------------
Switch on LEDs
*------------------------------------------------------------------------------*/
__INLINE static void LED_On (uint32_t led) {
PTD->PCOR = led_mask[led];
}
\endcode
*/
#define __INLINE
/**************************************************************************************************/
/**
\def __STATIC_INLINE
\brief Define a static function that may be inlined by the compiler.
\details
Defines a static function that may be inlined by the compiler. If the compiler generates inline code for
all calls to this functions, no additional function implementation is generated which may further optimize space.
<b>Code Example:</b>
\code
\\ Get Interrupt Vector
__STATIC_INLINE uint32_t NVIC_GetVector(IRQn_Type IRQn)
{
uint32_t *vectors = (uint32_t *)SCB->VTOR;
return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];
}
\endcode
*/
#define __STATIC_INLINE
/**************************************************************************************************/
/**
\def __STATIC_FORCEINLINE
\brief Define a static function that should be always inlined by the compiler.
\details
Defines a static function that should be always inlined by the compiler.
\note
For compilers that do not allow to force function inlining, the macro maps to \ref __STATIC_INLINE.
<b>Code Example:</b>
\code
\\ Get Interrupt Vector
__STATIC_FORCEINLINE uint32_t NVIC_GetVector(IRQn_Type IRQn)
{
uint32_t *vectors = (uint32_t *)SCB->VTOR;
return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];
}
\endcode
*/
#define __STATIC_FORCEINLINE
/**************************************************************************************************/
/**
\def __NO_RETURN
\brief Inform the compiler that a function does not return.
\details
Informs the compiler that the function does not return. The compiler can then perform optimizations by
removing code that is never reached.
<b>Code Example:</b>
\code
// OS idle demon (running when no other thread is ready to run).
__NO_RETURN void os_idle_demon (void);
\endcode
*/
#define __NO_RETURN
/**************************************************************************************************/
/**
\def __RESTRICT
\brief restrict pointer qualifier to enable additional optimizations.
\details
The __RESTRICT keyword corresponds to the \b restrict pointer qualifier that has been introduced in C99.
__RESTRICT is a hint to the compiler that enables additional optimizations. It specifies that for the lifetime
of the pointer, only the pointer itself or a value directly derived from it (such as pointer + 1) is used to access
the object. The compiler may therefore ignore potential pointer aliasing effects and perform additional optimizations.
\note
For compilers that do not support the restrict keyword, __RESTRICT is defined as an empty macro and a warning is issued.
<b>Code Example:</b>
\code
__STATIC_INLINE void ARM_MPU_OrderedMemcpy (volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len)
{
uint32_t i;
for (i = 0U; i < len; ++i)
{
dst[i] = src[i]; // Since src is restrict, the compiler can assume that dst and src are not overlapping may load multiple values at a time
}
}
\endcode
*/
#define __RESTRICT
/**************************************************************************************************/
/**
\def __USED
\brief Inform that a variable shall be retained in executable image.
\details
Definitions tagged with \b __USED in the source code should be not removed by the linker when detected as unused.
<b>Code Example:</b>
\code
/* Export following variables for debugging */
__USED uint32_t const CMSIS_RTOS_API_Version = osCMSIS;
__USED uint32_t const CMSIS_RTOS_RTX_Version = osCMSIS_RTX;
__USED uint32_t const os_clockrate = OS_TICK;
__USED uint32_t const os_timernum = 0;
\endcode
*/
#define __USED
/**************************************************************************************************/
/**
\def __WEAK
\brief Export a function or variable weakly to allow overwrites.
\details
Functions defined with \b __WEAK export their symbols weakly. A weakly defined function behaves like a normally defined
function unless a non-weakly defined function of the same name is linked into the same image. If both a non-weakly defined
function and a weakly defined function exist in the same image then all calls to the function resolve to call the non-weak
function.
Functions declared with \b __WEAK and then defined without \b __WEAK behave as non-weak functions.
<b>Code Example:</b>
\code
__WEAK void SystemInit(void)
{
SystemCoreSetup();
SystemCoreClockSetup();
}
\endcode
*/
#define __WEAK
/**************************************************************************************************/
/**
\def __PACKED
\brief Request smallest possible alignment.
\details
Specifies that a type must have the smallest possible alignment.
<b>Code Example:</b>
\code
struct foo {
uint8_t u8;
uint32_t u32[2] __PACKED;
};
\endcode
*/
#define __PACKED
/**************************************************************************************************/
/**
\def __PACKED_STRUCT
\brief Request smallest possible alignment for a structure.
\details
Specifies that a structure must have the smallest possible alignment.
<b>Code Example:</b>
\code
__PACKED_STRUCT foo {
uint8_t u8;
uint32_t u32;
uint16_t u16;
};
\endcode
*/
#define __PACKED_STRUCT
/**************************************************************************************************/
/**
\def __UNALIGNED_UINT32
\brief Pointer for unaligned access of a uint32_t variable.
\deprecated
Do not use this macro.
It has been superseded by \ref __UNALIGNED_UINT32_READ, \ref __UNALIGNED_UINT32_WRITE and will be removed in the future.
\details
Defines a pointer to a uint32_t from an address that does not need to be aligned. This can then be used in read/write
operations. The compiler will generate the appropriate access (aligned or non-aligned) depending on the underlying Arm
processor core and compiler settings.
<b>Code Example:</b>
\code
uint32_t val32;
void test (uint8_t *ptr) {
__UNALIGNED_UINT32(ptr) = val32;
}
\endcode
*/
#define __UNALIGNED_UINT32
/**************************************************************************************************/
/**
\def __UNALIGNED_UINT16_READ
\brief Pointer for unaligned read of a uint16_t variable.
\details
Defines a pointer to a uint16_t from an address that does not need to be aligned. This can then be used in read
operations. The compiler will generate the appropriate access (aligned or non-aligned) depending on the underlying Arm
processor core and compiler settings.
<b>Code Example:</b>
\code
uint16_t val16;
void test (uint8_t *ptr) {
val16 = __UNALIGNED_UINT16_READ(ptr);
}
\endcode
*/
#define __UNALIGNED_UINT16_READ
/**************************************************************************************************/
/**
\def __UNALIGNED_UINT16_WRITE
\brief Pointer for unaligned write of a uint16_t variable.
\details
Defines a pointer to a uint16_t from an address that does not need to be aligned. This can then be used in write
operations. The compiler will generate the appropriate access (aligned or non-aligned) depending on the underlying Arm
processor core and compiler settings.
<b>Code Example:</b>
\code
uint16_t val16 = 0U;
void test (uint8_t *ptr) {
__UNALIGNED_UINT16_WRITE(ptr, val16);
}
\endcode
*/
#define __UNALIGNED_UINT16_WRITE
/**************************************************************************************************/
/**
\def __UNALIGNED_UINT32_READ
\brief Pointer for unaligned read of a uint32_t variable.
\details
Defines a pointer to a uint32_t from an address that does not need to be aligned. This can then be used in read
operations. The compiler will generate the appropriate access (aligned or non-aligned) depending on the underlying Arm
processor core and compiler settings.
<b>Code Example:</b>
\code
uint32_t val32;
void test (uint8_t *ptr) {
val32 = __UNALIGNED_UINT32_READ(ptr);
}
\endcode
*/
#define __UNALIGNED_UINT32_READ
/**************************************************************************************************/
/**
\def __UNALIGNED_UINT32_WRITE
\brief Pointer for unaligned write of a uint32_t variable.
\details
Defines a pointer to a uint32_t from an address that does not need to be aligned. This can then be used in write
operations. The compiler will generate the appropriate access (aligned or non-aligned) depending on the underlying Arm
processor core and compiler settings.
<b>Code Example:</b>
\code
uint32_t val32 = 0U;
void test (uint8_t *ptr) {
__UNALIGNED_UINT32_WRITE(ptr, val32);
}
\endcode
*/
#define __UNALIGNED_UINT32_WRITE
/**************************************************************************************************/
/**
\def __ALIGNED
\brief Minimum alignment for a variable.
\details
Specifies a minimum alignment for a variable or structure field, measured in bytes.
<b>Code Example:</b>
\code
uint32_t stack_space[0x100] __ALIGNED(8); // 8-byte alignment required
\endcode
*/
#define __ALIGNED
/**************************************************************************************************/
/**
\def __COMPILER_BARRIER
\brief Barrier to prevent compiler from reordering instructions.
\details
This barrier limits the compilers reordering optimizations. It prevents the compiler from swapping
instructions resulting from code before and after the barrier.
<b>Code Example:</b>
The assignments in the example are independent. Hence the compiler could choose a different order of
execution, e.g. for a better pipeline utilization. Using the barrier in between prevents this type
of reordering.
\code
void test (uint8_t *ptr) {
var1 = 1;
__COMPILE_BARRIER();
var2 = var3 + 1;
}
\endcode
*/
#define __COMPILER_BARRIER
/**************************************************************************************************/
/**
\def __NO_INIT
\brief Force symbol into uninitialized memory section
\details
This puts a symbol (such as a variable) into an uninitialized memory section (e.g, .bss.noinit).
<b>Code Example:</b>
The EventBuffer in the example does not need to be copy- or zero-initialized. By adding
__NO_INIT this variable is allocated into an uninitialized memory section.
\code
static EventRecord_t EventBuffer[EVENT_RECORD_COUNT] __NO_INIT __ALIGNED(16);
\endcode
*/
#define __NO_INIT
/**************************************************************************************************/
/**
\def __ALIAS
\brief Creates a symbol as alias to another symbol.
<b>Code Example:</b>
The example declares the function Interrupt0_Handler. By default it is just an alias
pointing to Default_Handler. In combination with __WEAK modifier this allows giving
the function definition at a later point if required.
\code
void Interrupt0_Handler (void) __WEAK __ALIAS("Default_Handler");
\endcode
*/
#define __ALIAS
/**************************************************************************************************/
/**
\def __PROGRAM_START
\brief Entry function into the user application or library startup.
\details
Gives the function to be jumped into right after low level initialization, i.e. SystemInit. This
is compiler and library specific. CMSIS specifies common default for supported compilers.
\note This define is only intended to be used by the \ref startup_c_pg.
<b>Code Example:</b>
\code
void Reset_Handler(void)
{
SystemInit(); /* CMSIS System Initialization */
__PROGRAM_START(); /* Enter PreMain (C library entry point) */
}
\endcode
*/
#define __PROGRAM_START
/**************************************************************************************************/
/**
\def __INITIAL_SP
\brief Compiler/linker symbol specifying the location of the main stack (MSP).
\details
The address of the specified symbol is used to initialize the main stack pointer (MSP) during low
level init. This is compiler/linker specific. CMSIS specifies common default for supported compilers.
\note This define is only intended to be used by the \ref startup_c_pg.
*/
#define __INITIAL_SP
/**************************************************************************************************/
/**
\def __STACK_LIMIT
\brief Compiler/linker symbol specifying the limit of the main stack (MSP).
\details
The address of the specified symbol is used to initialize the main stack pointer limit (MSPLIM on Armv8-M)
during low level init. This is compiler/linker specific. CMSIS specifies common default for supported
compilers.
\note This define is only intended to be used by the \ref startup_c_pg.
<b>Code Example:</b>
\code
void Reset_Handler(void)
{
__set_MSPLIM((uint32_t)(&__STACK_LIMIT));
// :
// :
}
\endcode
*/
#define __STACK_LIMIT
/**************************************************************************************************/
/**
\def __VECTOR_TABLE
\brief Symbol name used for the (static) interrupt vector table.
\details
The given name is used for defining the static (compiler time) interrupt vector table. The name
must comply with any compiler/linker conventions, e.g. if used for vector table relocation or debugger
awareness. CMSIS specifies common default for supported compilers.
\note This define is only intended to be used by the \ref startup_c_pg.
*/
#define __VECTOR_TABLE
/**************************************************************************************************/
/**
\def __VECTOR_TABLE_ATTRIBUTE
\brief Additional decl specs to be used when defining the (static) interrupt vector table.
\details
The given decl specs are used for defining the static (compiler time) interrupt vector table, e.g.
to mark the table as used and force it into a specific linker section. CMSIS specifies common default
for supported compilers.
\note This define is only intended to be used by the \ref startup_c_pg.
*/
#define __VECTOR_TABLE_ATTRIBUTE
/** @} */ /** end of compiler_conntrol_gr **/

View File

@ -1,741 +0,0 @@
/**************************************************************************************************/
/** \defgroup Core_Register_gr Core Register Access
\brief Functions to access the Cortex-M core registers.
\details
The following functions provide access to Cortex-M core registers.
@{
*/
/**************************************************************************************************/
/** \brief Read the CONTROL register
\details
The function reads the CONTROL register value using the instruction \b MRS.
\n\n
The CONTROL register controls the stack used and the privilege level for software execution
when the processor is in thread mode and, if implemented, indicates whether the FPU state is
active. This register uses the following bits:
\n
- \b CONTROL[2] [only Cortex-M4 and Cortex-M7]
- =0 FPU not active
- =1 FPU active
\n\n
- \b CONTROL[1]
- =0 In handler mode - MSP is selected. No alternate stack possible for handler mode.
- =0 In thread mode - Default stack pointer MSP is used.
- =1 In thread mode - Alternate stack pointer PSP is used.
\n\n
- \b CONTROL[0] [not Cortex-M0]
- =0 In thread mode and privileged state.
- =1 In thread mode and user state.
\returns CONTROL register value
\remarks
- The processor can be in user state or privileged state when running in thread mode.
- Exception handlers always run in privileged state.
- On reset, the processor is in thread mode with privileged access rights.
\sa
- \ref __set_CONTROL; CONTROL_Type
- \ref ref_man_sec
*/
uint32_t __get_CONTROL(void);
/**************************************************************************************************/
/** \brief Set the CONTROL Register
\details
The function sets the CONTROL register value using the instruction \b MSR.
\n\n
The CONTROL register controls the stack used and the privilege level for software execution
when the processor is in thread mode and, if implemented, indicates whether the FPU state is
active. This register uses the following bits:
\n
- \b CONTROL[2] [only Cortex-M4 and Cortex-M7]
- =0 FPU not active
- =1 FPU active
\n\n
- \b CONTROL[1]
- Writeable only when the processor is in thread mode and privileged state (CONTROL[0]=0).
- =0 In handler mode - MSP is selected. No alternate stack pointer possible for handler mode.
- =0 In thread mode - Default stack pointer MSP is used.
- =1 In thread mode - Alternate stack pointer PSP is used.
\n\n
- \b CONTROL[0] [not writeable for Cortex-M0]
- Writeable only when the processor is in privileged state.
- Can be used to switch the processor to user state (thread mode).
- Once in user state, trigger an interrupt and change the state to privileged in the
exception handler (the only way).
- =0 In thread mode and privileged state.
- =1 In thread mode and user state.
\param [in] control CONTROL register value to set
\remarks
- The processor can be in user state or privileged state when running in thread mode.
- Exception handlers always run in privileged state.
- On reset, the processor is in thread mode with privileged access rights.
\sa
- \ref __get_CONTROL; __set_PSP; __set_MSP; CONTROL_Type
- \ref ref_man_sec
*/
void __set_CONTROL(uint32_t control);
/**************************************************************************************************/
/** \brief Read the IPSR register
\details
The function reads the Interrupt Program Status Register (IPSR) using the instruction \b MRS.
\n\n
The ISPR contains the exception type number of the current Interrupt Service Routine (ISR).
Each exception has an associated unique IRQn number. The following bits are used:
- \b ISR_NUMBER (IPSR[8:0])
- = 0 Thread mode
- = 1 Reserved
- = 2 NMI
- = 3 HardFault
- = 4 MemManage
- = 5 BusFault
- = 6 UsageFault
- = 7 SecureFault
- = 8-10 Reserved
- = 11 SVC
- = 12 Reserved for Debug
- = 13 Reserved
- = 14 PendSV
- = 15 SysTick
- = 16 IRQ0
- ...
- = n+15 IRQ(n-1)
\returns ISPR register value
\remarks
- This register is read-only.
\sa
- \ref __get_xPSR; IPSR_Type
- \ref NVIC_gr
- \ref ref_man_sec
*/
uint32_t __get_IPSR(void);
/**************************************************************************************************/
/** \brief Read the APSR register
\details
The function reads the Application Program Status Register (APSR) using the instruction \b MRS.
\n\n
The APSR contains the current state of the condition flags from instructions executed previously.
The APSR is essential for controlling conditional branches. The following flags are used:
- \b N (APSR[31]) (Negative flag)
- =1 The instruction result has a negative value (when interpreted as signed integer).
- =0 The instruction result has a positive value or equal zero.
\n\n
- \b Z (APSR[30]) (Zero flag)
- =1 The instruction result is zero. Or, after a compare instruction, when the two values
are the same.
\n\n
- \b C (APSR[29]) (Carry or borrow flag)
- =1 For unsigned additions, if an unsigned overflow occurred.
- =<i>inverse of borrow output status</i> For unsigned subtract operations.
\n\n
- \b V (APSR[28]) (Overflow flag)
- =1 A signed overflow occurred (for signed additions or subtractions).
\n\n
- \b Q (APSR[27]) (DSP overflow or saturation flag) [not Cortex-M0]
- This flag is a \em sticky flag. Saturating and certain multiplying instructions can set the
flag, but cannot clear it.
- =1 When saturation or an overflow occurred.
\n\n
- \b GE (APSR[19:16]) (Greater than or Equal flags) [not Cortex-M0]
- Can be set by the parallel add and subtract instructions.
- Are used by the <kbd>SEL</kbd> instruction to perform byte-based selection from two registers.
\returns APSR register value
\remarks
- Some instructions update all flags; some instructions update a subset of the flags.
- If a flag is not updated, the original value is preserved.
- Conditional instructions that are not executed have no effect on the flags.
- The CMSIS does not provide a function to update this register.
\sa
- \ref __get_xPSR; APSR_Type
- \ref ref_man_sec
*/
uint32_t __get_APSR(void);
/**************************************************************************************************/
/** \brief Read the xPSR register
\details
The function reads the combined Program Status Register (xPSR) using the instruction \b MRS.
\n\n
xPSR provides information about program execution and the APSR flags. It consists of the
following PSRs:
\li Application Program Status Register (APSR)
\li Interrupt Program Status Register (IPSR)
\li Execution Program Status Register (EPSR)
In addition to the flags described in \ref __get_APSR and \ref __get_IPSR, the register provides
the following flags:
- \b IT (xPSR[26:25]) (If-Then condition instruction)
- Contains up to four instructions following an IT instruction.
- Each instruction in the block is conditional.
- The conditions for the instructions are either all the same, or some can be the inverse
of others.
\n\n
- \b T (xPSR[24]) (Thumb bit)
- =1 Indicates that that the processor is in Thumb state.
- =0 Attempting to execute instructions when the T bit is 0 results in a fault or lockup.
- The conditions for the instructions are either all the same, or some can be the inverse
of others.
\returns xPSR register value
\remarks
- The CMSIS does not provide functions that access EPSR.
\sa
- \ref __get_APSR; __get_IPSR; xPSR_Type
- \ref ref_man_sec
*/
uint32_t __get_xPSR(void);
/**************************************************************************************************/
/** \brief Read the PSP register
\details
The function reads the Process Stack Pointer (PSP) value using the instruction \b MRS.
\n\n
Physically two different stack pointers (SP) exist:
- The Main Stack Pointer (MSP) is the default stack pointer after reset. It is also used when
running exception handlers (handler mode).
- The Process Stack Pointer (PSP), which can be used only in thread mode.
Register R13 banks the SP. The SP selection is determined by the bit[1] of the CONTROL register:
- =0 MSP is the current stack pointer. This is also the default SP. The initial value is loaded
from the first 32-bit word of the vector table from the program memory.
- =1 PSP is the current stack pointer. The initial value is undefined.
\returns PSP register value
\remarks
- Only one of the two SPs is visible at a time.
- For many applications, the system can completely rely on the MSP.
- The PSP is normally used in designs with an OS where the stack memory for OS Kernel must
be separated from the application code.
\sa
- \ref __set_PSP; __get_MSP; __get_CONTROL
- \ref ref_man_sec
*/
uint32_t __get_PSP(void);
/**************************************************************************************************/
/** \brief Set the PSP register
\details
The function sets the Process Stack Pointer (PSP) value using the instruction \b MSR.
\n\n
Physically two different stack pointers (SP) exist:
- The Main Stack Pointer (MSP) is the default stack pointer after reset. It is also used when
running exception handlers (handler mode).
- The Process Stack Pointer (PSP), which can be used only in thread mode.
Register R13 banks the SP. The SP selection is determined by the bit[1] of the CONTROL register:
- =0 MSP is the current stack pointer. This is also the default SP. The initial value is loaded
from the first 32-bit word of the vector table from the program memory.
- =1 PSP is the current stack pointer. The initial value is undefined.
\param [in] topOfProcStack PSP value to set
\remarks
- Only one of the two SPs is visible at a time.
- For many applications, the system can completely rely on the MSP.
- The PSP is normally used in designs with an OS where the stack memory for OS Kernel must
be separated from the application code.
\sa
- \ref __get_PSP; __set_MSP; __set_CONTROL
- \ref ref_man_sec
*/
void __set_PSP(uint32_t topOfProcStack);
/**************************************************************************************************/
/** \brief Read the MSP register
\details
The function reads the Main Stack Pointer (MSP) value using the instruction \b MRS.
\n\n
Physically two different stack pointers (SP) exist:
- The Main Stack Pointer (MSP) is the default stack pointer after reset. It is also used when
running exception handlers (handler mode).
- The Process Stack Pointer (PSP), which can be used only in thread mode.
Register R13 banks the SP. The SP selection is determined by the bit[1] of the CONTROL register:
- =0 MSP is the current stack pointer. This is also the default SP. The initial value is loaded
from the first 32-bit word of the vector table from the program memory.
- =1 PSP is the current stack pointer. The initial value is undefined.
\returns MSP Register value
\remarks
- Only one of the two SPs is visible at a time.
- For many applications, the system can completely rely on the MSP.
- The PSP is normally used in designs with an OS where the stack memory for OS Kernel must
be separated from the application code.
\sa
- \ref __set_MSP; __get_PSP; __get_CONTROL
- \ref ref_man_sec
*/
uint32_t __get_MSP(void);
/**************************************************************************************************/
/** \brief Set the MSP register
\details
The function sets the Main Stack Pointer (MSP) value using the instruction \b MSR.
\n\n
Physically two different stack pointers (SP) exist:
- The Main Stack Pointer (MSP) is the default stack pointer after reset. It is also used when
running exception handlers (handler mode).
- The Process Stack Pointer (PSP), which can be used only in thread mode.
Register R13 banks the SP. The SP selection is determined by the bit[1] of the CONTROL register:
- =0 MSP is the current stack pointer. This is also the default SP. The initial value is loaded
from the first 32-bit word of the vector table from the program memory.
- =1 PSP is the current stack pointer. The initial value is undefined.
\param [in] topOfMainStack MSP value to set
\remarks
- Only one of the two SPs is visible at a time.
- For many applications, the system can completely rely on the MSP.
- The PSP is normally used in designs with an OS where the stack memory for OS Kernel must
be separated from the application code.
\sa
- \ref __get_MSP; __set_PSP; __set_CONTROL
- \ref ref_man_sec
*/
void __set_MSP(uint32_t topOfMainStack);
/**************************************************************************************************/
/** \brief Read the PRIMASK register bit
\details
The function reads the Priority Mask register (PRIMASK) value using the instruction \b MRS.
\n\n
PRIMASK is a 1-bit-wide interrupt mask register. When set,
it blocks all interrupts apart from the non-maskable interrupt (NMI) and the hard fault exception.
The PRIMASK prevents activation of all exceptions with configurable priority.
\returns PRIMASK register value
- =0 no effect
- =1 prevents the activation of all exceptions with configurable priority
\sa
- \ref __set_PRIMASK; __get_BASEPRI; __get_FAULTMASK
- \ref ref_man_sec
*/
uint32_t __get_PRIMASK(void);
/**************************************************************************************************/
/** \brief Set the Priority Mask bit
\details
The function sets the Priority Mask register (PRIMASK) value using the instruction \b MSR.
\n\n
PRIMASK is a 1-bit-wide interrupt mask register. When set,
it blocks all interrupts apart from the non-maskable interrupt (NMI) and the hard fault exception.
The PRIMASK prevents activation of all exceptions with configurable priority.
\param [in] priMask Priority Mask
- =0 no effect
- =1 prevents the activation of all exceptions with configurable priority
\remarks
- When set, PRIMASK effectively changes the current priority level to 0.
This is the highest programmable level.
- When set and a fault occurs, the hard fault handler will be executed.
- Useful for temporarily disabling all interrupts for timing critical tasks.
- Does not have the ability to mask BusFault or bypass MPU.
\sa
- \ref __get_PRIMASK; __set_BASEPRI; __set_FAULTMASK
- \ref ref_man_sec
*/
void __set_PRIMASK(uint32_t priMask);
/**************************************************************************************************/
/** \brief Read the BASEPRI register [not for Cortex-M0, Cortex-M0+, or SC000]
\details
The function returns the Base Priority Mask register (BASEPRI) using the instruction \b MRS.
\n\n
BASEPRI defines the minimum priority for exception processing. When BASEPRI is set to a non-zero
value, it prevents the activation of all exceptions with the same or lower priority level as
the BASEPRI value.
\returns BASEPRI register value
\remarks
- Not for Cortex-M0, Cortex-M0+, or SC000.
\sa
- \ref __set_BASEPRI; __set_BASEPRI_MAX; __get_FAULTMASK; __get_PRIMASK
- \ref ref_man_sec
*/
uint32_t __get_BASEPRI(void);
/**************************************************************************************************/
/** \brief Set the BASEPRI register [not for Cortex-M0, Cortex-M0+, or SC000]
\details
The function sets the Base Priority Mask register (BASEPRI) value using the instruction \b MSR.
\n\n
BASEPRI defines the minimum priority for exception processing.
When BASEPRI is set to a non-zero value, it prevents the activation of all exceptions with the
same or lower priority level as the BASEPRI value.
\param [in] basePri BASEPRI value to set
\remarks
- Not for Cortex-M0, Cortex-M0+, or SC000.
- Cannot be set in user state.
- Useful for changing the masking level or disabling the masking.
\sa
- \ref __get_BASEPRI; __set_BASEPRI_MAX; __set_FAULTMASK; __set_PRIMASK
- \ref ref_man_sec
*/
void __set_BASEPRI(uint32_t basePri);
/**************************************************************************************************/
/** \brief Increase the BASEPRI register [not for Cortex-M0, Cortex-M0+, or SC000]
\details
The function only increases the Base Priority Mask register (BASEPRI) value using the instruction \b MSR.
The value is set only if BASEPRI masking is disabled, or the new value increases the BASEPRI priority level.
\n\n
BASEPRI defines the minimum priority for exception processing.
\param [in] basePri BASEPRI value to set
\remarks
- Not for Cortex-M0, Cortex-M0+, or SC000.
- Cannot be set in user state.
- Useful for increasing the masking level.
- Has no effect when \em basePri is lower than the current value of BASEPRI.
- Use \ref __set_BASEPRI to lower the Base Priority Mask register.
\sa
- \ref __set_BASEPRI; __get_BASEPRI; __set_FAULTMASK; __set_PRIMASK
- \ref ref_man_sec
*/
void __set_BASEPRI_MAX(uint32_t basePri);
/**************************************************************************************************/
/** \brief Read the FAULTMASK register [not for Cortex-M0, Cortex-M0+, or SC000]
\details
The function reads the Fault Mask register (FAULTMASK) value using the instruction \b MRS.
\n\n
FAULTMASK prevents activation of all exceptions except for the Non-Maskable Interrupt (NMI).
\returns FAULTMASK register value
\remarks
- not for Cortex-M0, Cortex-M0+, or SC000.
- Is cleared automatically upon exiting the exception handler, except when returning
from the NMI handler.
\sa
- \ref __set_FAULTMASK; __get_BASEPRI; __get_PRIMASK
- \ref ref_man_sec
*/
uint32_t __get_FAULTMASK(void);
/**************************************************************************************************/
/** \brief Set the FAULTMASK register [not for Cortex-M0, Cortex-M0+, or SC000]
\details
The function sets the Fault Mask register (FAULTMASK) value using the instruction \b MSR.
\n\n
FAULTMASK prevents activation of all exceptions except for Non-Maskable Interrupt (NMI).
FAULTMASK can be used to escalate a configurable fault handler (BusFault, usage fault, or
memory management fault) to hard fault level without invoking a hard fault. This allows the
fault handler to pretend to be the hard fault handler, with the ability to:
-# <b>Mask BusFault</b> by setting the BFHFNMIGN in the Configuration Control register.
It can be used to test the bus system without causing a lockup.
-# <b>Bypass the MPU</b>, allowing accessing the MPU protected memory location without
reprogramming the MPU to just carry out a few transfers for fixing faults.
\param [in] faultMask FAULTMASK register value to set
\remarks
- not for Cortex-M0, Cortex-M0+, or SC000.
- Is cleared automatically upon exiting the exception handler, except when returning
from the NMI handler.
- When set, it changes the effective current priority level to -1, so that even the hard
fault handler is blocked.
- Can be used by fault handlers to change their priority to -1 to have access to some
features for hard fault exceptions (see above).
- When set, lockups can still be caused by incorrect or undefined instructions, or by using
SVC in the wrong priority level.
\sa
- \ref __get_FAULTMASK; __set_BASEPRI; __set_PRIMASK
- \ref ref_man_sec
*/
void __set_FAULTMASK(uint32_t faultMask);
/**************************************************************************************************/
/** \brief Read the FPSCR register [only Cortex-M4 and Cortex-M7]
\details
The function reads the Floating-Point Status Control Register (FPSCR) value.
\n\n
FPSCR provides all necessary User level controls of the floating-point system.
\returns
- FPSCR register value, when __FPU_PRESENT=1
- =0, when __FPU_PRESENT=0
\remarks
- Only for Cortex-M4 and Cortex-M7.
\sa
- \ref __set_FPSCR
- \ref ref_man_sec
*/
uint32_t __get_FPSCR(void);
/**************************************************************************************************/
/** \brief Set the FPSC register [only for Cortex-M4 and Cortex-M7]
\details
The function sets the Floating-Point Status Control Register (FPSCR) value.
\n\n
FPSCR provides all necessary User level control of the floating-point system.
\n
- \b N (FPSC[31]) (Negative flag)
- =1 The instruction result has a negative value (when interpreted as signed integer).
- =0 The instruction result has a positive value or equal zero.
\n\n
- \b Z (FPSC[30]) (Zero flag)
- =1 The instruction result is zero. Or, after a compare instruction, when the two values
are the same.
\n\n
- \b C (FPSC[29]) (Carry or borrow flag)
- =1 For unsigned additions, if an unsigned overflow occurred.
- =<i>inverse of borrow output status</i> For unsigned subtract operations.
\n\n
- \b V (FPSC[28]) (Overflow flag)
- =1 A signed overflow occurred (for signed additions or subtractions).
\n\n
- \b AHP (FPSC[26]) (Alternative half-precision flag)
- =1 Alternative half-precision format selected.
- =0 IEEE half-precision format selected.
\n\n
- \b DN (FPSC[25]) (Default NaN mode control flag)
- =1 Any operation involving one or more NaNs returns the Default NaN.
- =0 NaN operands propagate through to the output of a floating-point operation.
\n\n
- \b FZ (FPSC[24]) (Flush-to-zero mode control flag)
- =1 Flush-to-zero mode enabled.
- =0 Flush-to-zero mode disabled. Behavior of the floating-point system is fully
compliant with the IEEE 754 standard.
\n\n
- \b RMode (FPSC[23:22]) (Rounding Mode control flags)
- =0b00 Round to Nearest (RN) mode.
- =0b01 Round towards Plus Infinity (RP) mode.
- =0b10 Round towards Minus Infinity (RM) mode.
- =0b11 Round towards Zero (RZ) mode.
- The specified rounding mode is used by almost all floating-point instructions.
\n\n
- \b IDC (FPSC[7]) (Input Denormal cumulative exception flags)
- See Cumulative exception bits (FPSC[4:0]).
\n\n
- \b IXC (FPSC[4]) (Inexact cumulative exception flag)
- =1 Exception occurred.
- =0 Value has to be set explicitly.
- Flag is not cleared automatically.
\n\n
- \b UFC (FPSC[3]) (Underflow cumulative exception flag)
- =1 Exception occurred.
- =0 Value has to be set explicitly.
- Flag is not cleared automatically.
\n\n
- \b OFC (FPSC[2]) (Overflow cumulative exception flag)
- =1 Exception occurred.
- =0 Value has to be set explicitly.
- Flag is not cleared automatically.
\n\n
- \b DZC (FPSC[1]) (Division by Zero cumulative exception flag)
- =1 Exception occurred.
- =0 Value has to be set explicitly.
- Flag is not cleared automatically.
\n\n
- \b IOC (FPSC[0]) (Invalid Operation cumulative exception flag)
- =1 Exception occurred.
- =0 Value has to be set explicitly.
- Flag is not cleared automatically.
\param [in] fpscr FPSCR value to set
\remarks
- Only for Cortex-M4 and Cortex-M7.
- The variable \b __FPU_PRESENT has to be set to 1.
\sa
- \ref __get_FPSCR
- \ref ref_man_sec
*/
void __set_FPSCR(uint32_t fpscr);
/**************************************************************************************************/
/** \brief Globally enables interrupts and configurable fault handlers
\details
The function enables interrupts and all configurable fault handlers by clearing PRIMASK.
The function uses the instruction <b>CPSIE i</b>.
\remarks
- Can be executed in privileged mode only.
\sa
- \ref __disable_irq; __set_BASEPRI; __set_CONTROL; __set_PRIMASK
*/
void __enable_irq(void);
/**************************************************************************************************/
/** \brief Globally disables interrupts and configurable fault handlers
\details
The function disables interrupts and all configurable fault handlers by setting PRIMASK.
The function uses the instruction <b>CPSID i</b>.
\remarks
- Can be executed in privileged mode only.
- An interrupt can enter pending state even if it is disabled. Disabling an interrupt
only prevents the processor from taking that interrupt.
\sa
- \ref __enable_irq; __set_BASEPRI; __set_CONTROL; __set_PRIMASK
*/
void __disable_irq(void);
/**************************************************************************************************/
/** \brief Enables interrupts and all fault handlers [not for Cortex-M0, Cortex-M0+, or SC000]
\details
The function enables interrupts and all fault handlers by clearing FAULTMASK.
The function uses the instruction <b>CPSIE f</b>.
\remarks
- not for Cortex-M0, Cortex-M0+, or SC000.
- Can be executed in privileged mode only.
\sa
- \ref __disable_fault_irq; __set_BASEPRI; __set_CONTROL; __set_FAULTMASK
*/
void __enable_fault_irq(void);
/**************************************************************************************************/
/** \brief Disables interrupts and all fault handlers [not for Cortex-M0, Cortex-M0+, or SC000]
\details
The function disables interrupts and all fault handlers by setting FAULTMASK.
The function uses the instruction <b>CPSID f</b>.
\remarks
- not for Cortex-M0, Cortex-M0+, or SC000.
- Can be executed in privileged mode only.
- An interrupt can enter pending state even if it is disabled. Disabling an interrupt
only prevents the processor from taking that interrupt.
\sa
- \ref __enable_fault_irq; __set_BASEPRI; __set_CONTROL; __set_FAULTMASK
*/
void __disable_fault_irq(void);
/**
\cond (ARMv8M)
*/
/**
\brief Get Process Stack Pointer Limit
Devices without Armv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
Stack Pointer Limit register hence zero is returned always in non-secure
mode.
\details Returns the current value of the Process Stack Pointer Limit (PSPLIM).
\return PSPLIM Register value
\note Only available for Armv8-M Architecture.
*/
uint32_t __get_PSPLIM(void);
/**
\brief Set Process Stack Pointer Limit
Devices without Armv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
Stack Pointer Limit register hence the write is silently ignored in non-secure
mode.
\details Assigns the given value to the Process Stack Pointer Limit (PSPLIM).
\param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set
\note Only available for Armv8-M Architecture.
*/
void __set_PSPLIM(uint32_t ProcStackPtrLimit);
/**
\brief Get Main Stack Pointer Limit
Devices without Armv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
Stack Pointer Limit register hence zero is returned always in non-secure
mode.
\details Returns the current value of the Main Stack Pointer Limit (MSPLIM).
\return MSPLIM Register value
\note Only available for Armv8-M Architecture.
*/
uint32_t __get_MSPLIM(void);
/**
\brief Set Main Stack Pointer Limit
Devices without Armv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
Stack Pointer Limit register hence the write is silently ignored in non-secure
mode.
\details Assigns the given value to the Main Stack Pointer Limit (MSPLIM).
\param [in] MainStackPtrLimit Main Stack Pointer Limit value to set
\note Only available for Armv8-M Architecture.
*/
__set_MSPLIM(uint32_t MainStackPtrLimit);
/**
\endcond
*/
/** @} */ /** end of Core_Register_gr **/

View File

@ -1,319 +0,0 @@
/**************************** Data Structures ***********************************************/
/** \brief Union type to access the Application Program Status Register (APSR).
*/
typedef union
{
struct
{
#if (__CORTEX_M != 0x04)
uint32_t _reserved0:27; ///< bit: 0..26 Reserved
#else
uint32_t _reserved0:16; ///< bit: 0..15 Reserved
uint32_t GE:4; ///< bit: 16..19 Greater than or Equal flags
uint32_t _reserved1:7; ///< bit: 20..26 Reserved
#endif
uint32_t Q:1; ///< bit: 27 Saturation condition flag
uint32_t V:1; ///< bit: 28 Overflow condition code flag
uint32_t C:1; ///< bit: 29 Carry condition code flag
uint32_t Z:1; ///< bit: 30 Zero condition code flag
uint32_t N:1; ///< bit: 31 Negative condition code flag
} b; ///< Structure used for bit access
uint32_t w; ///< Type used for word access
} APSR_Type;
/**************************************************************************************************/
/** \brief Union type to access the Interrupt Program Status Register (IPSR).
*/
typedef union
{
struct
{
uint32_t ISR:9; ///< bit: 0.. 8 Exception number
uint32_t _reserved0:23; ///< bit: 9..31 Reserved
} b; ///< Structure used for bit access
uint32_t w; ///< Type used for word access
} IPSR_Type;
/**************************************************************************************************/
/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR).
*/
typedef union
{
struct
{
uint32_t ISR:9; ///< bit: 0.. 8 Exception number
#if (__CORTEX_M != 0x04)
uint32_t _reserved0:15; ///< bit: 9..23 Reserved
#else
uint32_t _reserved0:7; ///< bit: 9..15 Reserved
uint32_t GE:4; ///< bit: 16..19 Greater than or Equal flags
uint32_t _reserved1:4; ///< bit: 20..23 Reserved
#endif
uint32_t T:1; ///< bit: 24 Thumb bit (read 0)
uint32_t IT:2; ///< bit: 25..26 saved IT state (read 0)
uint32_t Q:1; ///< bit: 27 Saturation condition flag
uint32_t V:1; ///< bit: 28 Overflow condition code flag
uint32_t C:1; ///< bit: 29 Carry condition code flag
uint32_t Z:1; ///< bit: 30 Zero condition code flag
uint32_t N:1; ///< bit: 31 Negative condition code flag
} b; ///< Structure used for bit access
uint32_t w; ///< Type used for word access
} xPSR_Type;
/**************************************************************************************************/
/** \brief Union type to access the Control Registers (CONTROL).
*/
typedef union
{
struct
{
uint32_t nPRIV:1; ///< bit: 0 Execution privilege in Thread mode
uint32_t SPSEL:1; ///< bit: 1 Stack to be used
uint32_t FPCA:1; ///< bit: 2 FP extension active flag
uint32_t _reserved0:29; ///< bit: 3..31 Reserved
} b; ///< Structure used for bit access
uint32_t w; ///< Type used for word access
} CONTROL_Type;
/**************************************************************************************************/
/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC).
*/
typedef struct
{
__IOM uint32_t ISER[8]; ///< Offset: 0x000 (R/W) Interrupt Set Enable Register
uint32_t RESERVED0[24]; ///< Reserved
__IOM uint32_t ICER[8]; ///< Offset: 0x080 (R/W) Interrupt Clear Enable Register
uint32_t RSERVED1[24]; ///< Reserved
__IOM uint32_t ISPR[8]; ///< Offset: 0x100 (R/W) Interrupt Set Pending Register
uint32_t RESERVED2[24]; ///< Reserved
__IOM uint32_t ICPR[8]; ///< Offset: 0x180 (R/W) Interrupt Clear Pending Register
uint32_t RESERVED3[24]; ///< Reserved
__IOM uint32_t IABR[8]; ///< Offset: 0x200 (R/W) Interrupt Active bit Register
uint32_t RESERVED4[56]; ///< Reserved
__IOM uint8_t IP[240]; ///< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide)
uint32_t RESERVED5[644]; ///< Reserved
__OM uint32_t STIR; ///< Offset: 0xE00 ( /W) Software Trigger Interrupt Register
} NVIC_Type;
/**************************************************************************************************/
/** \brief Structure type to access the System Control Block (SCB).
*/
typedef struct
{
__IM uint32_t CPUID; ///< Offset: 0x000 (R/ ) CPUID Base Register
__IOM uint32_t ICSR; ///< Offset: 0x004 (R/W) Interrupt Control and State Register
__IOM uint32_t VTOR; ///< Offset: 0x008 (R/W) Vector Table Offset Register
__IOM uint32_t AIRCR; ///< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register
__IOM uint32_t SCR; ///< Offset: 0x010 (R/W) System Control Register
__IOM uint32_t CCR; ///< Offset: 0x014 (R/W) Configuration Control Register
__IOM uint8_t SHP[12]; ///< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15)
__IOM uint32_t SHCSR; ///< Offset: 0x024 (R/W) System Handler Control and State Register
__IOM uint32_t CFSR; ///< Offset: 0x028 (R/W) Configurable Fault Status Register
__IOM uint32_t HFSR; ///< Offset: 0x02C (R/W) HardFault Status Register
__IOM uint32_t DFSR; ///< Offset: 0x030 (R/W) Debug Fault Status Register
__IOM uint32_t MMFAR; ///< Offset: 0x034 (R/W) MemManage Fault Address Register
__IOM uint32_t BFAR; ///< Offset: 0x038 (R/W) BusFault Address Register
__IOM uint32_t AFSR; ///< Offset: 0x03C (R/W) Auxiliary Fault Status Register
__IM uint32_t PFR[2]; ///< Offset: 0x040 (R/ ) Processor Feature Register
__IM uint32_t DFR; ///< Offset: 0x048 (R/ ) Debug Feature Register
__IM uint32_t ADR; ///< Offset: 0x04C (R/ ) Auxiliary Feature Register
__IM uint32_t MMFR[4]; ///< Offset: 0x050 (R/ ) Memory Model Feature Register
__IM uint32_t ISAR[5]; ///< Offset: 0x060 (R/ ) Instruction Set Attributes Register
uint32_t RESERVED0[5]; ///< Reserved
__IOM uint32_t CPACR; ///< Offset: 0x088 (R/W) Coprocessor Access Control Register
} SCB_Type;
/**************************************************************************************************/
/** \brief Structure type to access the System Control and ID Register not in the SCB.
*/
typedef struct
{
uint32_t RESERVED0[1]; /*!< Reserved */
__IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register
\note available for Cortex-M3, Cortex-M4, Cortex-M7, Cortex-M33, Cortex-M33P, SecureCore SC300 */
__IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register
\note available for Cortex-M1, Cortex-M3 , Cortex-M4, Cortex-M7, Cortex-M33, Cortex-M33P, SecureCore SC000, SecureCore SC300 */
__IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register
\note available for Cortex-M33, Cortex-M33P */
} SCnSCB_Type;
/**************************************************************************************************/
/** \brief Structure type to access the Implementation Control Block Register (ICB).
\note replaces SCnSCB_Type (only on Cortex-M55/M85)
*/
typedef struct
{
uint32_t RESERVED0[1U];
__IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */
__IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */
__IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */
} ICB_Type;
/**************************************************************************************************/
/** \brief Structure type to access the System Timer (SysTick).
*/
typedef struct
{
__IOM uint32_t CTRL; ///< Offset: 0x000 (R/W) SysTick Control and Status Register
__IOM uint32_t LOAD; ///< Offset: 0x004 (R/W) SysTick Reload Value Register
__IOM uint32_t VAL; ///< Offset: 0x008 (R/W) SysTick Current Value Register
__IM uint32_t CALIB; ///< Offset: 0x00C (R/ ) SysTick Calibration Register
} SysTick_Type;
/**************************************************************************************************/
/** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM).
*/
typedef struct
{
__OM union
{
__OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */
__OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */
__OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */
} PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */
// uint32_t RESERVED0[864U];
__IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */
// uint32_t RESERVED1[15U];
__IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */
// uint32_t RESERVED2[15U];
__IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */
// uint32_t RESERVED3[29U];
__OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */
__IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */
__IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */
// uint32_t RESERVED4[43U];
__OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */
__IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */
// uint32_t RESERVED5[1U];
__IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register (Cortex-M33 only) */
// uint32_t RESERVED6[4U];
__IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */
__IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */
__IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */
__IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */
__IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */
__IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */
__IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */
__IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */
__IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */
__IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */
__IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */
__IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */
} ITM_Type;
/**************************************************************************************************/
/** \brief Structure type to access the Memory Protection Unit (MPU).
*/
typedef struct
{
__IM uint32_t TYPE; ///< Offset: 0x000 (R/ ) MPU Type Register
__IOM uint32_t CTRL; ///< Offset: 0x004 (R/W) MPU Control Register
__IOM uint32_t RNR; ///< Offset: 0x008 (R/W) MPU Region RNRber Register
__IOM uint32_t RBAR; ///< Offset: 0x00C (R/W) MPU Region Base Address Register
__IOM uint32_t RASR; ///< Offset: 0x010 (R/W) MPU Region Attribute and Size Register
__IOM uint32_t RBAR_A1; ///< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register
__IOM uint32_t RASR_A1; ///< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register
__IOM uint32_t RBAR_A2; ///< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register
__IOM uint32_t RASR_A2; ///< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register
__IOM uint32_t RBAR_A3; ///< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register
__IOM uint32_t RASR_A3; ///< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register
} MPU_Type;
/**************************************************************************************************/
/** \brief Structure type to access the Floating Point Unit (FPU).
*/
typedef struct
{
uint32_t RESERVED0[1]; ///< Reserved
__IOM uint32_t FPCCR; ///< Offset: 0x004 (R/W) Floating-Point Context Control Register
__IOM uint32_t FPCAR; ///< Offset: 0x008 (R/W) Floating-Point Context Address Register
__IOM uint32_t FPDSCR; ///< Offset: 0x00C (R/W) Floating-Point Default Status Control Register
__IM uint32_t MVFR0; ///< Offset: 0x010 (R/ ) Media and FP Feature Register 0
__IM uint32_t MVFR1; ///< Offset: 0x014 (R/ ) Media and FP Feature Register 1
} FPU_Type;
/**************************************************************************************************/
/** \brief Structure type to access the Core Debug Register (CoreDebug).
*/
typedef struct
{
__IOM uint32_t DHCSR; ///< Offset: 0x000 (R/W) Debug Halting Control and Status Register
__OM uint32_t DCRSR; ///< Offset: 0x004 ( /W) Debug Core Register Selector Register
__IOM uint32_t DCRDR; ///< Offset: 0x008 (R/W) Debug Core Register Data Register
__IOM uint32_t DEMCR; ///< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register
} CoreDebug_Type;
/**************************************************************************************************/
/** \brief Structure type to access the Data Watchpoint and Trace Register (DWT).
*/
typedef struct
{
__IOM uint32_t CTRL; ///< Offset: 0x000 (R/W) Control Register
__IOM uint32_t CYCCNT; ///< Offset: 0x004 (R/W) Cycle Count Register
__IOM uint32_t CPICNT; ///< Offset: 0x008 (R/W) CPI Count Register
__IOM uint32_t EXCCNT; ///< Offset: 0x00C (R/W) Exception Overhead Count Register
__IOM uint32_t SLEEPCNT; ///< Offset: 0x010 (R/W) Sleep Count Register
__IOM uint32_t LSUCNT; ///< Offset: 0x014 (R/W) LSU Count Register
__IOM uint32_t FOLDCNT; ///< Offset: 0x018 (R/W) Folded-instruction Count Register
__IM uint32_t PCSR; ///< Offset: 0x01C (R/ ) Program Counter Sample Register
__IOM uint32_t COMP0; ///< Offset: 0x020 (R/W) Comparator Register 0
__IOM uint32_t MASK0; ///< Offset: 0x024 (R/W) Mask Register 0
__IOM uint32_t FUNCTION0; ///< Offset: 0x028 (R/W) Function Register 0
uint32_t RESERVED0[1]; ///< Reserved
__IOM uint32_t COMP1; ///< Offset: 0x030 (R/W) Comparator Register 1
__IOM uint32_t MASK1; ///< Offset: 0x034 (R/W) Mask Register 1
__IOM uint32_t FUNCTION1; ///< Offset: 0x038 (R/W) Function Register 1
uint32_t RESERVED1[1]; ///< Reserved
__IOM uint32_t COMP2; ///< Offset: 0x040 (R/W) Comparator Register 2
__IOM uint32_t MASK2; ///< Offset: 0x044 (R/W) Mask Register 2
__IOM uint32_t FUNCTION2; ///< Offset: 0x048 (R/W) Function Register 2
uint32_t RESERVED2[1]; ///< Reserved
__IOM uint32_t COMP3; ///< Offset: 0x050 (R/W) Comparator Register 3
__IOM uint32_t MASK3; ///< Offset: 0x054 (R/W) Mask Register 3
__IOM uint32_t FUNCTION3; ///< Offset: 0x058 (R/W) Function Register 3
} DWT_Type;
/**************************************************************************************************/
/** \brief Structure type to access the Trace Port Interface Register (TPI).
*/
typedef struct
{
__IOM uint32_t SSPSR; ///< Offset: 0x000 (R/ ) Supported Parallel Port Size Register
__IOM uint32_t CSPSR; ///< Offset: 0x004 (R/W) Current Parallel Port Size Register
uint32_t RESERVED0[2]; ///< Reserved
__IOM uint32_t ACPR; ///< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register
uint32_t RESERVED1[55]; ///< Reserved
__IOM uint32_t SPPR; ///< Offset: 0x0F0 (R/W) Selected Pin Protocol Register
uint32_t RESERVED2[131]; ///< Reserved
__IM uint32_t FFSR; ///< Offset: 0x300 (R/ ) Formatter and Flush Status Register
__IOM uint32_t FFCR; ///< Offset: 0x304 (R/W) Formatter and Flush Control Register
__IM uint32_t FSCR; ///< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register
uint32_t RESERVED3[759]; ///< Reserved
__IM uint32_t TRIGGER; ///< Offset: 0xEE8 (R/ ) TRIGGER
__IM uint32_t FIFO0; ///< Offset: 0xEEC (R/ ) Integration ETM Data
__IM uint32_t ITATBCTR2; ///< Offset: 0xEF0 (R/ ) ITATBCTR2
uint32_t RESERVED4[1]; ///< Reserved
__IM uint32_t ITATBCTR0; ///< Offset: 0xEF8 (R/ ) ITATBCTR0
__IM uint32_t FIFO1; ///< Offset: 0xEFC (R/ ) Integration ITM Data
__IOM uint32_t ITCTRL; ///< Offset: 0xF00 (R/W) Integration Mode Control
uint32_t RESERVED5[39]; ///< Reserved
__IOM uint32_t CLAIMSET; ///< Offset: 0xFA0 (R/W) Claim tag set
__IOM uint32_t CLAIMCLR; ///< Offset: 0xFA4 (R/W) Claim tag clear
uint32_t RESERVED7[8]; ///< Reserved
__IM uint32_t DEVID; ///< Offset: 0xFC8 (R/ ) TPIU_DEVID
__IM uint32_t DEVTYPE; ///< Offset: 0xFCC (R/ ) TPIU_DEVTYPE
} TPI_Type;

View File

@ -1,116 +0,0 @@
/* ##################################### Debug In/Output function ############################### */
/**
\defgroup ITM_Debug_gr Debug Access
\brief Debug Access to the Instrumented Trace Macrocell (ITM)
\details
CMSIS provides additional debug functions to enlarge the Debug Access.
Data can be transmitted via a certain global buffer variable towards the target system.
The Cortex-M3 / Cortex-M4 / Cortex-M7 incorporates the <b>Instrumented Trace Macrocell (ITM)</b> that
provides together with the <b>Serial Wire Output (SWO)</b> trace capabilities for the
microcontroller system. The ITM has 32 communication channels; two ITM
communication channels are used by CMSIS to output the following information:
- <b>ITM Channel 0</b>: implements the \ref ITM_SendChar function
which can be used for printf-style output via the debug interface.
- <b>ITM Channel 31</b>: is reserved for the RTOS kernel and can be used for kernel awareness debugging.
\remarks
- ITM channels have 4 groups with 8 channels each, whereby each group can be configured for
access rights in the Unprivileged level.
- The ITM channel 0 can be enabled for the user task.
- ITM channel 31 can be accessed only in Privileged mode
from the RTOS kernel itself. The ITM channel 31 has been selected for the RTOS kernel because some
kernels may use the Privileged level for program execution.
<hr>
\section ITM_debug_uv ITM Debugger Support
A debugger may support a <b>Debug (printf) Viewer</b> window to display data.
<b>Direction: Microcontroller --&gt; Debugger:</b>
- Characters received via ITM communication channel 0 are written in a printf-style to the
<b>Debug (printf) Viewer</b> window.
<b>Direction: Debugger --&gt; Microcontroller:</b>
- Check if \ref ITM_RxBuffer variable is available (only performed once).
- Read the character from the <b>Debug (printf) Viewer</b> window.
- If \ref ITM_RxBuffer is empty, write character to \ref ITM_RxBuffer.
\note
The current solution does not use a buffer mechanism for transmitting the characters.
<hr>
\section itm_debug_ex Example:
Example for the usage of the ITM Channel 31 for RTOS Kernels:
\code
// check if debugger connected and ITM channel enabled for tracing
if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA) &&
(ITM->TCR & ITM_TCR_ITMENA) &&
(ITM->TER & (1UL >> 31))) {
// transmit trace data
while (ITM->PORT31_U32 == 0);
ITM->PORT[31].u8 = task_id; // id of next task
while (ITM->PORT[31].u32 == 0);
ITM->PORT[31].u32 = task_status; // status information
}
\endcode
@{
*/
/**************************************************************************************************/
volatile int32_t ITM_RxBuffer; ///< external variable to receive characters
/********
#define ITM_RxBuffer_EMPTY 0x5AA55AA5 ///< value identifying whether \ref ITM_RxBuffer is ready for the next character
********/
/**************************************************************************************************/
/** \brief Transmits a character via channel 0.
This function transmits a character via the ITM channel 0.
It returns when no debugger is connected that has booked the output.
It is blocking when a debugger is connected, but the previously sent character has not been
transmitted.
\param [in] ch Character to transmit
\returns Character to transmit
*/
uint32_t ITM_SendChar (uint32_t ch);
/**************************************************************************************************/
/** \brief ITM Receive Character
This function inputs a character via the external variable \ref ITM_RxBuffer.
It returns when no debugger is connected that has booked the output.
It is blocking when a debugger is connected, but the previously sent character has not been transmitted.
\returns
- Received character
- =1 - No character received
*/
int32_t ITM_ReceiveChar (void);
/**************************************************************************************************/
/** \brief ITM Check Character
This function reads the external variable \ref ITM_RxBuffer and checks whether a character
is available or not.
\returns
- =0 - No character available
- =1 - Character available
*/
int32_t ITM_CheckChar (void);
/** @} */

View File

@ -1,28 +0,0 @@
/**
\defgroup fpu_functions FPU Functions
\brief Functions that relate to the Floating-Point Arithmetic Unit.
\details
Some Cortex-M processors include optional floating-point arithmetic functionality, with support
for single and double-precision arithmetic.
The Cortex-M processor with FPU is an implementation of the single-precision and
double-precision variant of the Armv7-M Architecture with Floating-Point Extension (FPv5).
@{
*/
/**
\brief Get the FPU type.
\returns
- \b 0: No FPU
- \b 1: Single precision FPU
- \b 2: Double + Single precision FPU
The function returns the implemented FPU type.
*/
__STATIC_INLINE uint32_t SCB_GetFPUType(void);
/**
@}
*/

View File

@ -1,373 +0,0 @@
/**
\defgroup mpu_functions MPU Functions for Armv6-M/v7-M
\brief Functions that relate to the Memory Protection Unit.
\details
The following functions support the optional Memory Protection Unit (MPU) that is available on the Cortex-M0+, M3, M4 and M7 processor.
The MPU is used to prevent from illegal memory accesses that are typically caused by errors in an application software.
<b>Example:</b>
\code
int main()
{
// Set Region 0
ARM_MPU_SetRegionEx(0UL, 0x08000000UL, ARM_MPU_RASR(0UL, ARM_MPU_AP_FULL, 0UL, 0UL, 1UL, 1UL, 0x00UL, ARM_MPU_REGION_SIZE_1MB));
ARM_MPU_Enable(0);
// Execute application code that is access protected by the MPU
ARM_MPU_Disable();
}
\endcode
@{
*/
/**
*/
typedef struct {} MPU_Type;
/** \def ARM_MPU_RBAR
* \brief MPU Region Base Address Register Value
*
* This preprocessor function can be used to construct a valid \ref MPU_Type::RBAR "RBAR" value.
* The VALID bit is implicitly set to 1.
*
* \param Region The region to be configured, number 0 to 15.
* \param BaseAddress The base address for the region.
*/
#define ARM_MPU_RBAR(Region, BaseAddress)
/**
* \def ARM_MPU_RASR
* \brief MPU Region Attribute and Size Register Value
*
* This macro is used to construct a valid \ref MPU_Type::RASR "RASR" value.
* The ENABLE bit of the RASR value is implicitly set to 1.
*
* \param DisableExec Instruction access disable bit. 1 = disable instruction fetches.
* \param AccessPermission Data access permission configures read/write access for User and Privileged mode. Possible values see \ref ARM_MPU_AP_xxx.
* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral.
* \param IsShareable 1 = region is shareable between multiple bus masters.
* \param IsCacheable 1 = region is cacheable (values may be kept in cache).
* \param IsBufferable 1 = region is bufferable (when using write-back caching). Cacheable but non-bufferable regions use write-through policy.
* \param SubRegionDisable Sub-region disable field (8 bits).
* \param Size Region size with values defined under \ref ARM_MPU_REGION_SIZE_xxx.
*/
#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size)
/**
* \def ARM_MPU_RASR_EX
* \brief MPU Region Attribute and Size Register Value
*
* This macro is used to construct a valid \ref MPU_Type::RASR "RASR" value.
* The ENABLE bit of the RASR value is implicitly set to 1.
*
* \param DisableExec Instruction access disable bit, 1= disable instruction fetches.
* \param AccessPermission Data access permission configures read/write access for User and Privileged mode. Possible values see \ref ARM_MPU_AP_xxx.
* \param AccessAttributes Memory access attribution, see \ref ARM_MPU_ACCESS_xxx.
* \param SubRegionDisable Sub-region disable field (8 bits).
* \param Size Region size with values defined under \ref ARM_MPU_REGION_SIZE_xxx.
*/
#define ARM_MPU_RASR_EX(DisableExec, AccessPermission, AccessAttributes, SubRegionDisable, Size)
/**
* \brief Setup information of a single MPU Region
* \details The typedef \ref ARM_MPU_Region_t allows to define a MPU table (array of MPU regions) with pre-compiled register values.
* Such tables enable efficient MPU setup using the function \ref ARM_MPU_Load.
*
* <b>Example:</b> See \ref ARM_MPU_Load
*/
typedef struct {
uint32_t RBAR; //!< The region base address register value (\ref MPU_Type::RBAR "RBAR")
uint32_t RASR; //!< The region attribute and size register value (\ref MPU_Type::RASR "RASR"), see \ref ARM_MPU_RASR.
} ARM_MPU_Region_t;
/**
\brief Enable the memory protection unit (MPU) and
\param MPU_CTRL Additional control settings that configure MPU behaviour
\details
The function \ref ARM_MPU_Enable writes to the register \ref MPU_Type::CTRL "MPU->CTRL" and sets bit ENABLE. The parameter \em MPU_CTRL provides additional bit values
(see table below) that configure the MPU behaviour. For processors that implement an <b>MPU Fault Handler</b> the \ref NVIC_gr "MemoryManagement_IRQn" exception is enabled by setting the bit MEMFAULTACT in register SBC->SHCSR.
The following table contains possible values for the parameter \em MPU_CTRL that set specific bits in register MPU->CTRL.
| Bit | MPU_CTRL value | When applied | When not applied
|:----|:-------------------------|:------------------------------------------------------------------------|:---------------------------------------
| 1 | MPU_CTRL_HFNMIENA_Msk | Enable MPU during hard fault, NMI, and FAULTMASK handlers execution | Disable MPU during hard fault, NMI, and FAULTMASK handler execution
| 2 | MPU_CTRL_PRIVDEFENA_Msk | Enable default memory map as a background region for privileged access | Use only MPU region settings
<b>Example:</b>
\code
// enable MPU with all region definitions. Exceptions are not protected by MPU.
MPU_Enable (0);
// enable MPU with all region definitions and background regions for privileged access. Exceptions are protected by MPU.
MPU_Enable (MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk);
\endcode
*/
__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_CTRL);
/** Disable the MPU.
*/
__STATIC_INLINE void ARM_MPU_Disable();
/** Clear and disable the given MPU region.
* \param rnr Region number to be cleared.
*/
__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr);
/** Configure an MPU region.
*
* The region number should be contained in the rbar value.
*
* \param rbar Value for \ref MPU_Type::RBAR "RBAR" register.
* \param rasr Value for \ref MPU_Type::RASR "RASR" register.
*/
__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr);
/** Configure the given MPU region.
* \param rnr Region number to be configured.
* \param rbar Value for \ref MPU_Type::RBAR "RBAR" register.
* \param rasr Value for \ref MPU_Type::RASR "RASR" register.
*/
__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr);
/** Memcpy with strictly ordered memory access, e.g. used by code in \ref ARM_MPU_Load.
* \param dst Destination data is copied to.
* \param src Source data is copied from.
* \param len Amount of data words to be copied.
*/
__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len);
/** Load the given number of MPU regions from a table.
* \param table Pointer to the MPU configuration table.
* \param cnt Number of regions to be configured.
*
* \note only up to 16 regions can be handled as the function \ref ARM_MPU_Load uses the REGION field in \ref MPU_Type::RBAR "MPU->RBAR".
*
* <b>Example:</b>
* \code
* const ARM_MPU_Region_t mpuTable[3][4] = {
* {
* { .RBAR = ARM_MPU_RBAR(0UL, 0x08000000UL), .RASR = ARM_MPU_RASR(0UL, ARM_MPU_AP_FULL, 0UL, 0UL, 1UL, 1UL, 0x00UL, ARM_MPU_REGION_SIZE_1MB) },
* { .RBAR = ARM_MPU_RBAR(1UL, 0x20000000UL), .RASR = ARM_MPU_RASR(1UL, ARM_MPU_AP_FULL, 0UL, 0UL, 1UL, 1UL, 0x00UL, ARM_MPU_REGION_SIZE_32KB) },
* { .RBAR = ARM_MPU_RBAR(2UL, 0x40020000UL), .RASR = ARM_MPU_RASR(1UL, ARM_MPU_AP_FULL, 2UL, 0UL, 0UL, 0UL, 0x00UL, ARM_MPU_REGION_SIZE_8KB) },
* { .RBAR = ARM_MPU_RBAR(3UL, 0x40022000UL), .RASR = ARM_MPU_RASR(1UL, ARM_MPU_AP_FULL, 2UL, 0UL, 0UL, 0UL, 0xC0UL, ARM_MPU_REGION_SIZE_4KB) }
* },
* {
* { .RBAR = ARM_MPU_RBAR(4UL, 0x08000000UL), .RASR = ARM_MPU_RASR(0UL, ARM_MPU_AP_FULL, 0UL, 0UL, 1UL, 1UL, 0x00UL, ARM_MPU_REGION_SIZE_1MB) },
* { .RBAR = ARM_MPU_RBAR(5UL, 0x20000000UL), .RASR = ARM_MPU_RASR(1UL, ARM_MPU_AP_FULL, 0UL, 0UL, 1UL, 1UL, 0x00UL, ARM_MPU_REGION_SIZE_32KB) },
* { .RBAR = ARM_MPU_RBAR(6UL, 0x40020000UL), .RASR = ARM_MPU_RASR(1UL, ARM_MPU_AP_FULL, 2UL, 0UL, 0UL, 0UL, 0x00UL, ARM_MPU_REGION_SIZE_8KB) },
* { .RBAR = ARM_MPU_RBAR(7UL, 0x40022000UL), .RASR = ARM_MPU_RASR(1UL, ARM_MPU_AP_FULL, 2UL, 0UL, 0UL, 0UL, 0xC0UL, ARM_MPU_REGION_SIZE_4KB) }
* },
* {
* { .RBAR = ARM_MPU_RBAR(4UL, 0x18000000UL), .RASR = ARM_MPU_RASR(0UL, ARM_MPU_AP_FULL, 0UL, 0UL, 1UL, 1UL, 0x00UL, ARM_MPU_REGION_SIZE_1MB) },
* { .RBAR = ARM_MPU_RBAR(5UL, 0x30000000UL), .RASR = ARM_MPU_RASR(1UL, ARM_MPU_AP_FULL, 0UL, 0UL, 1UL, 1UL, 0x00UL, ARM_MPU_REGION_SIZE_32KB) },
* { .RBAR = ARM_MPU_RBAR(6UL, 0x50020000UL), .RASR = ARM_MPU_RASR(1UL, ARM_MPU_AP_FULL, 2UL, 0UL, 0UL, 0UL, 0x00UL, ARM_MPU_REGION_SIZE_8KB) },
* { .RBAR = ARM_MPU_RBAR(7UL, 0x50022000UL), .RASR = ARM_MPU_RASR(1UL, ARM_MPU_AP_FULL, 2UL, 0UL, 0UL, 0UL, 0xC0UL, ARM_MPU_REGION_SIZE_4KB) }
* }
* };
*
* void UpdateMpu(uint32_t idx)
* {
* ARM_MPU_Load(mpuTable[idx], 4);
* }
* \endcode
*
*/
__STATIC_INLINE void ARM_MPU_Load(MPU_Region_t const* table, uint32_t cnt);
/**
@}
\defgroup mpu_defines Define values
\ingroup mpu_functions
\brief Define values for MPU region setup.
\details
The following define values are used with \ref ARM_MPU_RASR to setup the \ref MPU_Type::RASR "RASR" value field in the MPU region.
\see
ARM_MPU_Region_t, ARM_MPU_SetRegion, ARM_MPU_SetRegionEx.
@{
*/
/** \def ARM_MPU_REGION_SIZE_xxx
\brief Size values of a MPU region (in RASR field)
\details
The following define values are used to compose the size information for an MPU region:
|\#define | Value | Description |
|:-------------------------|:-----------------|:---------------------------------------------------------|
|ARM_MPU_REGION_SIZE_32B | 0x04U | Region size 32 Bytes
|ARM_MPU_REGION_SIZE_64B | 0x05U | Region size 64 Bytes
|ARM_MPU_REGION_SIZE_128B | 0x06U | Region size 128 Bytes
|ARM_MPU_REGION_SIZE_256B | 0x07U | Region size 256 Bytes
|ARM_MPU_REGION_SIZE_512B | 0x08U | Region size 512 Bytes
|ARM_MPU_REGION_SIZE_1KB | 0x09U | Region size 1 KByte
|ARM_MPU_REGION_SIZE_2KB | 0x0AU | Region size 2 KBytes
|ARM_MPU_REGION_SIZE_4KB | 0x0BU | Region size 4 KBytes
|ARM_MPU_REGION_SIZE_8KB | 0x0CU | Region size 8 KBytes
|ARM_MPU_REGION_SIZE_16KB | 0x0DU | Region size 16 KBytes
|ARM_MPU_REGION_SIZE_32KB | 0x0EU | Region size 32 KBytes
|ARM_MPU_REGION_SIZE_64KB | 0x0FU | Region size 64 KBytes
|ARM_MPU_REGION_SIZE_128KB | 0x10U | Region size 128 KBytes
|ARM_MPU_REGION_SIZE_256KB | 0x11U | Region size 256 KBytes
|ARM_MPU_REGION_SIZE_512KB | 0x12U | Region size 512 KBytes
|ARM_MPU_REGION_SIZE_1MB | 0x13U | Region size 1 MByte
|ARM_MPU_REGION_SIZE_2MB | 0x14U | Region size 2 MBytes
|ARM_MPU_REGION_SIZE_4MB | 0x15U | Region size 4 MBytes
|ARM_MPU_REGION_SIZE_8MB | 0x16U | Region size 8 MBytes
|ARM_MPU_REGION_SIZE_16MB | 0x17U | Region size 16 MBytes
|ARM_MPU_REGION_SIZE_32MB | 0x18U | Region size 32 MBytes
|ARM_MPU_REGION_SIZE_64MB | 0x19U | Region size 64 MBytes
|ARM_MPU_REGION_SIZE_128MB | 0x1AU | Region size 128 MBytes
|ARM_MPU_REGION_SIZE_256MB | 0x1BU | Region size 256 MBytes
|ARM_MPU_REGION_SIZE_512MB | 0x1CU | Region size 512 MBytes
|ARM_MPU_REGION_SIZE_1GB | 0x1DU | Region size 1 GByte
|ARM_MPU_REGION_SIZE_2GB | 0x1EU | Region size 2 GBytes
|ARM_MPU_REGION_SIZE_4GB | 0x1FU | Region size 4 GBytes
*/
#define ARM_MPU_REGION_SIZE_xxx
/** \def ARM_MPU_AP_xxx
\brief Values for MPU region access permissions (in RASR field)
\details
The following define values are used to compose the access permission for an MPU region:
|\#define | Value | Access permissions |
|:-------------------------|:-----------------|:---------------------------------------------------------|
|ARM_MPU_AP_NONE | 0x0U | None: any access generates a permission fault.
|ARM_MPU_AP_PRIV | 0x1U | Privileged Read/Write: privileged access only; any unprivileged access generates a permission fault.
|ARM_MPU_AP_URO | 0x2U | Privileged Read/Write; Unprivileged Read-only: any unprivileged write generates a permission fault.
|ARM_MPU_AP_FULL | 0x3U | Privileged Read/Write. Unprivileged Read/Write: full access, permission faults are never generated.
|ARM_MPU_AP_PRO | 0x5U | Privileged Read-only: any unprivileged access or privileged write generates a permission fault.
|ARM_MPU_AP_RO | 0x6U | Privileged and Unprivileged Read-only: any write generates a permission fault.
*/
#define ARM_MPU_AP_xxx
/** \def ARM_MPU_ACCESS_xxx
\brief Values for MPU region access attributes (in RASR field)
\details
The following define values are used to compose the access attributes for an MPU region:
|\#define | TEX | Shareable | Cacheable | Bufferable | Description |
|:-----------------------------|:-----|:----------|:----------|:-----------|:------------------------|
| ARM_MPU_ACCESS_ORDERED | 000b | 1 | 0 | 0 | Strongly ordered memory |
| ARM_MPU_ACCESS_DEVICE(S) | 0s0b | S | 0 | S | Memory mapped peripheral device, shared (S=1) or non-shared (S=0) |
| ARM_MPU_ACCESS_NORMAL(O,I,S) | 1BBb | S | A | A | Normal memory, with outer/inner cache policy (O/I=\ref ARM_MPU_CACHEP_xxx, shared (S=1) or non-share (S=0) |
*/
#define ARM_MPU_ACCESS_xxx
/** \def ARM_MPU_CACHEP_xxx
\brief Cache policy values for MPU region access attributes (in RASR field)
\details
The following define values are used to compose the cacheability flags within the
access attributes for an MPU region:
|\#define | Value | Cacheability policy |
|:-----------------------------|:------|:------------------------|
| ARM_MPU_CACHEP_NOCACHE | 00b | Non-cacheable |
| ARM_MPU_CACHEP_WB_WRA | 01b | Write-back, write and read allocate |
| ARM_MPU_CACHEP_WT_NWA | 10b | Write-through, no write allocate |
| ARM_MPU_CACHEP_WB_NWA | 11b | Write-back, no write allocate |
*/
#define ARM_MPU_CACHEP_xxx
/** @} */
/**
\var ARM_MPU_Region_t::RBAR
This value specifies the start address of the MPU protected memory region. The address must be a multiple of the region size (size aligned).
See \ref MPU_Type::RBAR for details about field bit format.
\var ARM_MPU_Region_t::RASR
This value specifies region attributes and size. Use the \ref ARM_MPU_RASR macro to compose this value.
\var MPU_Type::TYPE
The MPU Type Register indicates how many regions the MPU support. Software can use it
to determine if the processor implements an MPU.
| Bits | Name | Function |
| :------ | :------------ | :------------------------------------------------------------ |
| [31:24] | - | Reserved. |
| [23:16] | IREGION | Instruction region. RAZ. Armv7-M only supports a unified MPU. |
| [15:8] | DREGION | Number of regions supported by the MPU. If this field reads-as-zero the processor does not implement an MPU. |
| [7:1] | - | Reserved. |
| [0] | SEPARATE | Indicates support for separate instruction and data address maps. RAZ. Armv7-M only supports a unified MPU. |
\var MPU_Type::CTRL
Enables the MPU, and when the MPU is enabled, controls whether the default memory map
is enabled as a background region for privileged accesses, and whether the MPU is enabled
for HardFaults, NMIs, and exception handlers when FAULTMASK is set to 1.
| Bits | Name | Function |
| :------ | :------------ | :------------------------------------------------------------ |
| [31:3] | - | Reserved. |
| [2] | PRIVDEFENA | 0 - Disables the default memory map. 1 - Enables the default memory map as a background region for privileged access. |
| [1] | HFNMIENA | 0 - Disables the MPU for exception handlers. 1 - Use the MPU for memory accesses by exception handlers. |
| [0] | ENABLE | 0 - The MPU is disabled. 1 - The MPU is enabled. |
\var MPU_Type::RNR
Selects the region currently accessed by \ref MPU_Type::RBAR and \ref MPU_Type::RASR.
| Bits | Name | Function |
| :------ | :------------ | :------------------------------------------------------------ |
| [31:8] | - | Reserved. |
| [7:0] | REGION | Indicates the memory region accessed. |
\var MPU_Type::RBAR
Holds the base address of the region identified by MPU_RNR. On a write, can also be used
to update the base address of a specified region, in the range 0 to 15, updating MPU_RNR
with the new region number.
| Bits | Name | Function |
| :------ | :------------ | :------------------------------------------------------------ |
| [31:5] | ADDR | Base address of the region. |
| [4] | VALID | 1 - Update \ref MPU_Type::RNR to the value obtained by zero extending the REGION value specified in this write, and apply the base address update to this region. |
| [3:0] | REGION | On writes, can specify the number of the region to update, see VALID field description. |
\var MPU_Type::RASR
Defines the size and access behavior of the region identified by MPU_RNR, and enables
that region.
| Bits | Name | Function |
| :------ | :------------ | :------------------------------------------------------------ |
| [31:29] | - | Reserved. |
| [28] | XN | Execute Never. |
| [27] | - | Reserved. |
| [26:24] | AP | Access Permissions, see \ref ARM_MPU_AP_xxx. |
| [23:22] | - | Reserved. |
| [21:19] | TEX | Type Extension. |
| [18] | S | Shareable. |
| [17] | C | Cacheable. |
| [16] | B | Bufferable. |
| [15:8] | SRD | Subregion Disable. For regions of 256 bytes or larger, each bit of this field controls whether one of the eight equal subregions is enabled (0) or disabled (1).
| [7:6] | - | Reserved. |
| [5:1] | SIZE | Indicates the region size. The region size, in bytes, is 2(SIZE+1). SIZE field values less than 4 are reserved, because the smallest supported region size is 32 bytes. |
| [0] | ENABLE | 0 - This region is disabled. 1 - This region is enabled. |
\var MPU_Type::RBAR_A1
Alias for \ref MPU_Type::RBAR.
\var MPU_Type::RASR_A1
Alias for \ref MPU_Type::RASR.
\var MPU_Type::RBAR_A2
Alias for \ref MPU_Type::RBAR.
\var MPU_Type::RASR_A2
Alias for \ref MPU_Type::RASR.
\var MPU_Type::RBAR_A3
Alias for \ref MPU_Type::RBAR.
\var MPU_Type::RASR_A3
Alias for \ref MPU_Type::RASR.
*/

View File

@ -1,300 +0,0 @@
/**
\defgroup mpu8_functions MPU Functions for Armv8-M
\brief Functions that relate to the Memory Protection Unit.
\details
The following functions support the optional Memory Protection Unit (MPU) that is available on the Cortex-M23, M33, M35P processor.
The MPU is used to prevent from illegal memory accesses that are typically caused by errors in an application software.
<b>Example:</b>
\code
int main()
{
// Set Region 0 using Attr 0
ARM_MPU_SetMemAttr(0UL, ARM_MPU_ATTR( /* Normal memory */
MPU_ATTR_NORMAL_OUTER_WT_TR_RA_WA, /* Outer Write-Back transient with read and write allocate */
MPU_ATTR_NORMAL_INNER_WT_TR_RA_WA /* Inner Write-Through transient with read and write allocate */
));
ARM_MPU_SetRegion(0UL,
ARM_MPU_RBAR(0x08000000UL, ARM_MPU_SH_NON, ARM_MPU_AP_RW, ARM_MPU_AP_NP, ARM_MPU_XN), /* Non-shareable, read/write, non-privileged, execute-never */
ARM_MPU_RLAR(0x080FFFFFUL, MAIR_ATTR(0)) /* 1MB memory block using Attr 0 */
);
ARM_MPU_Enable(0);
// Execute application code that is access protected by the MPU
ARM_MPU_Disable();
}
\endcode
@{
*/
/** \brief Attribute for device memory (outer only) */
#define ARM_MPU_ATTR_DEVICE ( 0U )
/** \brief Attribute for non-cacheable, normal memory */
#define ARM_MPU_ATTR_NON_CACHEABLE ( 4U )
/** \brief Attribute for Normal memory, Outer and Inner cacheability.
* \param NT Non-Transient: Set to 1 for Non-transient data. Set to 0 for Transient data.
* \param WB Write-Back: Set to 1 to use a Write-Back policy. Set to 0 to use a Write-Through policy.
* \param RA Read Allocation: Set to 1 to enable cache allocation on read miss. Set to 0 to disable cache allocation on read miss.
* \param WA Write Allocation: Set to 1 to enable cache allocation on write miss. Set to 0 to disable cache allocation on write miss.
*/
#define ARM_MPU_ATTR_MEMORY_(NT, WB, RA, WA)
/** \brief Device memory type non Gathering, non Re-ordering, non Early Write Acknowledgement */
#define ARM_MPU_ATTR_DEVICE_nGnRnE
/** \brief Device memory type non Gathering, non Re-ordering, Early Write Acknowledgement */
#define ARM_MPU_ATTR_DEVICE_nGnRE
/** \brief Device memory type non Gathering, Re-ordering, Early Write Acknowledgement */
#define ARM_MPU_ATTR_DEVICE_nGRE
/** \brief Device memory type Gathering, Re-ordering, Early Write Acknowledgement */
#define ARM_MPU_ATTR_DEVICE_GRE
/** \brief Normal memory outer-cacheable and inner-cacheable attributes
* WT = Write Through, WB = Write Back, TR = Transient, RA = Read-Allocate, WA = Write Allocate
*/
#define MPU_ATTR_NORMAL_OUTER_NON_CACHEABLE
#define MPU_ATTR_NORMAL_OUTER_WT_TR_RA
#define MPU_ATTR_NORMAL_OUTER_WT_TR_WA
#define MPU_ATTR_NORMAL_OUTER_WT_TR_RA_WA
#define MPU_ATTR_NORMAL_OUTER_WT_RA
#define MPU_ATTR_NORMAL_OUTER_WT_WA
#define MPU_ATTR_NORMAL_OUTER_WT_RA_WA
#define MPU_ATTR_NORMAL_OUTER_WB_TR_RA
#define MPU_ATTR_NORMAL_OUTER_WB_TR_WA
#define MPU_ATTR_NORMAL_OUTER_WB_TR_RA_WA
#define MPU_ATTR_NORMAL_OUTER_WB_RA
#define MPU_ATTR_NORMAL_OUTER_WB_WA
#define MPU_ATTR_NORMAL_OUTER_WB_RA_WA
#define MPU_ATTR_NORMAL_INNER_NON_CACHEABLE
#define MPU_ATTR_NORMAL_INNER_WT_TR_RA
#define MPU_ATTR_NORMAL_INNER_WT_TR_WA
#define MPU_ATTR_NORMAL_INNER_WT_TR_RA_WA
#define MPU_ATTR_NORMAL_INNER_WT_RA
#define MPU_ATTR_NORMAL_INNER_WT_WA
#define MPU_ATTR_NORMAL_INNER_WT_RA_WA
#define MPU_ATTR_NORMAL_INNER_WB_TR_RA
#define MPU_ATTR_NORMAL_INNER_WB_TR_WA
#define MPU_ATTR_NORMAL_INNER_WB_TR_RA_WA
#define MPU_ATTR_NORMAL_INNER_WB_RA
#define MPU_ATTR_NORMAL_INNER_WB_WA
#define MPU_ATTR_NORMAL_INNER_WB_RA_WA
/** \brief Memory Attribute
* \param O Outer memory attributes
* \param I O == ARM_MPU_ATTR_DEVICE: Device memory attributes, else: Inner memory attributes
*/
#define ARM_MPU_ATTR(O, I)
/**
* Shareability
*/
/** \brief Normal memory non-shareable */
#define ARM_MPU_SH_NON
/** \brief Normal memory outer shareable */
#define ARM_MPU_SH_OUTER
/** \brief Normal memory inner shareable */
#define ARM_MPU_SH_INNER
/**
* Access permissions
* AP = Access permission, RO = Read-only, RW = Read/Write, NP = Any privilege, PO = Privileged code only
*/
/** \brief Normal memory, read/write */
#define ARM_MPU_AP_RW
/** \brief Normal memory, read-only */
#define ARM_MPU_AP_RO
/** \brief Normal memory, any privilege level */
#define ARM_MPU_AP_NP
/** \brief Normal memory, privileged access only */
#define ARM_MPU_AP_PO
/*
* Execute-never
* XN = Execute-never, EX = Executable
*/
/** \brief Normal memory, Execution only permitted if read permitted */
#define ARM_MPU_XN
/** \brief Normal memory, Execution only permitted if read permitted */
#define ARM_MPU_EX
/** \brief Memory access permissions
* \param RO Read-Only: Set to 1 for read-only memory.
* \param NP Non-Privileged: Set to 1 for non-privileged memory.
*/
#define ARM_MPU_AP_(RO, NP)
/** \brief Region Base Address Register value
* \param BASE The base address bits [31:5] of a memory region. The value is zero extended. Effective address gets 32 byte aligned.
* \param SH Defines the Shareability domain for this memory region.
* \param RO Read-Only: Set to 1 for a read-only memory region. Set to 0 for a read/write memory region.
* \param NP Non-Privileged: Set to 1 for a non-privileged memory region. Set to 0 for privileged memory region.
* \param XN eXecute Never: Set to 1 for a non-executable memory region. Set to 0 for an executable memory region.
*/
#define ARM_MPU_RBAR(BASE, SH, RO, NP, XN)
/** \brief Region Limit Address Register value
* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended.
* \param IDX The attribute index to be associated with this memory region.
*/
#define ARM_MPU_RLAR(LIMIT, IDX)
/** \brief Region Limit Address Register with PXN value
* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended.
* \param PXN Privileged execute never. Defines whether code can be executed from this privileged region.
* \param IDX The attribute index to be associated with this memory region.
*/
#define ARM_MPU_RLAR_PXN(LIMIT, PXN, IDX)
/**
* Struct for a single MPU Region
*/
typedef struct {
uint32_t RBAR; /*!< Region Base Address Register value */
uint32_t RLAR; /*!< Region Limit Address Register value */
} ARM_MPU_Region_t;
/**
\brief Read MPU Type Register
\return Number of MPU regions
*/
__STATIC_INLINE uint32_t ARM_MPU_TYPE()
/** Enable the MPU.
* \param MPU_Control Default access permissions for unconfigured regions.
*/
__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control);
/** Disable the MPU.
*/
__STATIC_INLINE void ARM_MPU_Disable(void);
/** Enable the Non-secure MPU.
* \param MPU_Control Default access permissions for unconfigured regions.
*/
__STATIC_INLINE ARM_MPU_Enable_NS(uint32_t MPU_Control);
/** Disable the Non-secure MPU.
*/
__STATIC_INLINE void ARM_MPU_Disable_NS(void);
/** Set the memory attribute encoding to the given MPU.
* \param mpu Pointer to the MPU to be configured.
* \param idx The attribute index to be set [0-7]
* \param attr The attribute value to be set.
*/
__STATIC_INLINE void ARM_MPU_SetMemAttrEx(MPU_Type* mpu, uint8_t idx, uint8_t attr);
/** Set the memory attribute encoding.
* \param idx The attribute index to be set [0-7]
* \param attr The attribute value to be set.
*/
__STATIC_INLINE void ARM_MPU_SetMemAttr(uint8_t idx, uint8_t attr);
/** Set the memory attribute encoding to the Non-secure MPU.
* \param idx The attribute index to be set [0-7]
* \param attr The attribute value to be set.
*/
__STATIC_INLINE void ARM_MPU_SetMemAttr_NS(uint8_t idx, uint8_t attr);
/** Clear and disable the given MPU region of the given MPU.
* \param mpu Pointer to MPU to be used.
* \param rnr Region number to be cleared.
*/
__STATIC_INLINE void ARM_MPU_ClrRegionEx(MPU_Type* mpu, uint32_t rnr);
/** Clear and disable the given MPU region.
* \param rnr Region number to be cleared.
*/
__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr);
/** Clear and disable the given Non-secure MPU region.
* \param rnr Region number to be cleared.
*/
__STATIC_INLINE void ARM_MPU_ClrRegion_NS(uint32_t rnr);
/** Configure the given MPU region of the given MPU.
* \param mpu Pointer to MPU to be used.
* \param rnr Region number to be configured.
* \param rbar Value for RBAR register.
* \param rlar Value for RLAR register.
*/
__STATIC_INLINE void ARM_MPU_SetRegionEx(MPU_Type* mpu, uint32_t rnr, uint32_t rbar, uint32_t rlar);
/** Configure the given MPU region.
* \param rnr Region number to be configured.
* \param rbar Value for RBAR register.
* \param rlar Value for RLAR register.
*/
__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rnr, uint32_t rbar, uint32_t rlar);
/** Configure the given Non-secure MPU region.
* \param rnr Region number to be configured.
* \param rbar Value for RBAR register.
* \param rlar Value for RLAR register.
*/
__STATIC_INLINE void ARM_MPU_SetRegion_NS(uint32_t rnr, uint32_t rbar, uint32_t rlar);
/** Memcpy with strictly ordered memory access, e.g. used by code in \ref ARM_MPU_LoadEx.
* \param dst Destination data is copied to.
* \param src Source data is copied from.
* \param len Amount of data words to be copied.
*/
__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len);
/** Load the given number of MPU regions from a table to the given MPU.
* \param mpu Pointer to the MPU registers to be used.
* \param rnr First region number to be configured.
* \param table Pointer to the MPU configuration table.
* \param cnt Amount of regions to be configured.
*/
__STATIC_INLINE void ARM_MPU_LoadEx(MPU_Type* mpu, uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt);
/** Load the given number of MPU regions from a table.
* \param rnr First region number to be configured.
* \param table Pointer to the MPU configuration table.
* \param cnt Amount of regions to be configured.
*
* <b>Example:</b>
* \code
* const ARM_MPU_Region_t mpuTable[1][4] = {
* {
* // BASE SH RO NP XN LIMIT ATTR
* { .RBAR = ARM_MPU_RBAR(0x08000000UL, ARM_MPU_SH_NON, ARM_MPU_AP_RO, ARM_MPU_AP_NP, ARM_MPU_XN), .RLAR = ARM_MPU_RLAR(0x080FFFFFUL, MAIR_ATTR(0)) },
* { .RBAR = ARM_MPU_RBAR(0x20000000UL, ARM_MPU_SH_NON, ARM_MPU_AP_RO, ARM_MPU_AP_NP, ARM_MPU_XN), .RLAR = ARM_MPU_RLAR(0x20007FFFUL, MAIR_ATTR(0)) },
* { .RBAR = ARM_MPU_RBAR(0x40020000UL, ARM_MPU_SH_NON, ARM_MPU_AP_RO, ARM_MPU_AP_NP, ARM_MPU_XN), .RLAR = ARM_MPU_RLAR(0x40021FFFUL, MAIR_ATTR(1)) },
* { .RBAR = ARM_MPU_RBAR(0x40022000UL, ARM_MPU_SH_NON, ARM_MPU_AP_RO, ARM_MPU_AP_NP, ARM_MPU_XN), .RLAR = ARM_MPU_RLAR(0x40022FFFUL, MAIR_ATTR(1)) }
* }
* };
*
* void UpdateMpu(uint32_t idx)
* {
* ARM_MPU_Load(0, mpuTable[idx], 4);
* }
* \endcode
*/
__STATIC_INLINE void ARM_MPU_Load(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt);
/** Load the given number of MPU regions from a table to the Non-secure MPU.
* \param rnr First region number to be configured.
* \param table Pointer to the MPU configuration table.
* \param cnt Amount of regions to be configured.
*/
__STATIC_INLINE void ARM_MPU_Load_NS(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt);
/** @} */

View File

@ -1,24 +0,0 @@
/**
\defgroup mve_functions MVE Functions
\brief Functions that relate to the MVE (Cortex-M Vector Extensions) Unit.
\details
Some Cortex-M processors include an optional MVE unit.
@{
*/
/**
\brief Get the MVE type.
\details Returns the MVE type.
\returns
- \b 0: No Vector Extension (MVE)
- \b 1: Integer Vector Extension (MVE-I)
- \b 2: Floating-point Vector Extension (MVE-F)
*/
__STATIC_INLINE uint32_t SCB_GetMVEType(void);
/**
@}
*/

View File

@ -1,836 +0,0 @@
/**
\defgroup NVIC_gr Interrupts and Exceptions (NVIC)
@{
\brief Functions to access the Nested Vector Interrupt Controller (NVIC).
\details
This section explains how to use interrupts and exceptions and access functions for the Nested Vector Interrupt Controller (NVIC).
Arm provides a template file <strong>startup_<em>device</em></strong> for each supported
compiler. The file must be adapted by the silicon vendor to include interrupt vectors for all device-specific
interrupt handlers. Each interrupt handler is defined as a <strong><em>weak</em></strong> function
to an dummy handler. These interrupt handlers can be used directly in application software
without being adapted by the programmer.
The table below lists the core exception vectors of the various Cortex-M processors.
<table class="cmtable" summary="Core Exception Name">
<tr>
<th>Exception Vector</th>
<th>Handler Function</th>
<th>IRQn<br/>Value</th>
<th title="Cortex-M0/M0+
\if ARMSC
and SC000
\endif
">Armv6-M</th>
<th title="Cortex-M3/M4/M7
\if ARMSC
and SC300
\endif
">Armv7-M</th>
\if ARMv8M
<th title="Cortex-M23">Armv8-M<br/>Baseline</th>
<th title="Cortex-M33/M35P">Armv8-M<br/>Mainline</th>
<th>Armv8.1-M<br/>Mainline</th>
\endif
<th>Description</th>
</tr>
<tr>
<td><b>NonMaskableInt_IRQn</b></td>
<td>NMI_Handler</td>
<td>-14</td>
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
\if ARMv8M
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
\endif
<td>Non Maskable Interrupt</td>
</tr>
<tr>
<td><b>HardFault_IRQn</b></td>
<td>HardFault_Handler</td>
<td>-13</td>
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
\if ARMv8M
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
\endif
<td>Hard Fault Interrupt</td>
</tr>
<tr>
<td><b>MemoryManagement_IRQn</b></td>
<td>MemManage_Handler</td>
<td>-12</td>
<td>&nbsp;</td>
<td><img src="check.png" alt="available"></td>
\if ARMv8M
<td>&nbsp;</td>
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
\endif
<td>Memory Management Interrupt</td>
</tr>
<tr>
<td><b>BusFault_IRQn</b></td>
<td>BusFault_Handler</td>
<td>-11</td>
<td>&nbsp;</td>
<td><img src="check.png" alt="available"></td>
\if ARMv8M
<td>&nbsp;</td>
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
\endif
<td>Bus Fault Interrupt</td>
</tr>
<tr>
<td><b>UsageFault_IRQn</b></td>
<td>UsageFault_Handler</td>
<td>-10</td>
<td>&nbsp;</td>
<td><img src="check.png" alt="available"></td>
\if ARMv8M
<td>&nbsp;</td>
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
\endif
<td>Usage Fault Interrupt</td>
</tr>
\if ARMv8M
<tr>
<td><b>SecureFault_IRQn</b></td>
<td>SecureFault_Handler</td>
<td>-9</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
<td>Secure Fault Interrupt</td>
</tr>
\endif
<tr>
<td><b>SVCall_IRQn</b></td>
<td>SVC_Handler</td>
<td>-5</td>
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
\if ARMv8M
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
\endif
<td>SVC Interrupt </td>
</tr>
<tr>
<td><b>DebugMonitor_IRQn</b></td>
<td>DebugMon_Handler</td>
<td>-4</td>
<td>&nbsp;</td>
<td><img src="check.png" alt="available"></td>
\if ARMv8M
<td>&nbsp;</td>
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
\endif
<td>Debug Monitor Interrupt</td>
</tr>
<tr>
<td><b>PendSV_IRQn</b></td>
<td>PendSV_Handler</td>
<td>-2</td>
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
\if ARMv8M
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
\endif
<td>Pend SV Interrupt</td>
</tr>
<tr>
<td><b>SysTick_IRQn</b></td>
<td>SysTick_Handler</td>
<td>-1</td>
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
\if ARMv8M
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
<td><img src="check.png" alt="available"></td>
\endif
<td>System Tick Interrupt</td>
</tr>
</table>
Vector Table
============
The Vector Table defines the entry addresses of the processor exceptions and the
device specific interrupts. It is typically located at the beginning of the
program memory, however \ref using_VTOR_pg it can be relocated to RAM. The symbol
<b>__Vectors</b> is the address of the vector table in the startup code and the
register <b>SCB->VTOR</b> holds the start address of the vector table.
\if ARMv8M
An Armv8-M implementation with TrustZone provides two vector tables:
- vector table for Secure handlers
- vector table for Non-Secure handlers
Refer to \ref Model_TrustZone for more information.
\endif
Processor Exceptions
--------------------
At the beginning of the vector table, the initial stack value and the
exception vectors of the processor are defined. The vector table below
shows the exception vectors of a Armv8-M Mainline processor. Other processor
variants may have fewer vectors.
\code
__Vectors DCD __initial_sp ; Top of Stack initialization
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD SecureFault_Handler ; Secure Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVC Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
\endcode
Device Specific Vectors
-----------------------
Following the processor exception vectors, the vector table contains also the
device specific interrupt vectors.
\code
; device specific interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
DCD TAMPER_IRQHandler ; Tamper
\endcode
All device specific interrupts should have a default interrupt handler function that can
be overwritten in user code. Below is an example for this default handler function.
\code
Default_Handler PROC
EXPORT WWDG_IRQHandler [WEAK]
EXPORT PVD_IRQHandler [WEAK]
EXPORT TAMPER_IRQHandler [WEAK]
:
:
WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
:
:
B .
ENDP
\endcode
The user application may simply define an interrupt handler function by using the handler name
as shown below.
\code
void WWDG_IRQHandler(void)
{
...
}
\endcode
NVIC Function Usage
===================
The code below shows the usage of various CMSIS NVIC functions with an LPC1700 device.
Code Example 1
--------------
\code
#include "LPC17xx.h"
uint32_t priorityGroup; /* Variables to store priority group and priority */
uint32_t priority;
uint32_t preemptPriority;
uint32_t subPriority;
int main (void) {
NVIC_SetPriorityGrouping(5); /* Set priority group to 5:
Bit[7..6] preempt priority Bits,
Bit[5..3] subpriority Bits
(valid for five priority bits) */
priorityGroup = NVIC_GetPriorityGrouping(); /* Get used priority grouping */
priority = NVIC_EncodePriority(priorityGroup, 1, 6); /* Encode priority with 6 for subpriority and 1 for preempt priority
Note: priority depends on the used priority grouping */
NVIC_SetPriority(UART0_IRQn, priority); /* Set new priority */
priority = NVIC_GetPriority(UART0_IRQn); /* Retrieve priority again */
NVIC_DecodePriority(priority, priorityGroup, &preemptPriority, &subPriority);
while(1);
}
\endcode
Code Example 2
--------------
\code
#include "LPC17xx.h"
uint32_t active; /* Variable to store interrupt active state */
void TIMER0_IRQHandler(void) { /* Timer 0 interrupt handler */
if (LPC_TIM0->IR & (1 << 0)) { /* Check if interrupt for match channel 0 occurred */
LPC_TIM0->IR |= (1 << 0); /* Acknowledge interrupt for match channel 0 occurred */
}
active = NVIC_GetActive(TIMER0_IRQn); /* Get interrupt active state of timer 0 */
}
int main (void) {
/* Set match channel register MR0 to 1 millisecond */
LPC_TIM0->MR0 = (((SystemCoreClock / 1000) / 4) - 1); /* 1 ms? */
LPC_TIM0->MCR = (3 << 0); /* Enable interrupt and reset for match channel MR0 */
NVIC_EnableIRQ(TIMER0_IRQn); /* Enable NVIC interrupt for timer 0 */
LPC_TIM0->TCR = (1 << 0); /* Enable timer 0 */
while(1);
}
\endcode
NVIC API Virtualization
=======================
The CMSIS-Core has provisions for overriding NVIC APIs as required for implementing
secure systems that control access to peripherals and related interrupts.
These overrides allow an operating system to control the access privileges of
application code to critical interrupts.
The NVIC function virtualization is enabled with the following \#define symbols:
- \ref CMSIS_NVIC_VIRTUAL enables overriding the CMSIS-Core (Cortex-M) NVIC functions.
- \ref CMSIS_VECTAB_VIRTUAL enables overriding the CMSIS-Core (Cortex-M) interrupt vector table access functions.
*/
#define CMSIS_NVIC_VIRTUAL ///< Virtualization of the NVIC API
/**
\def CMSIS_NVIC_VIRTUAL
When \ref CMSIS_NVIC_VIRTUAL is defined, the NVIC access functions in the table below must be implemented
for virtualizing NVIC access. These functions should be implemented
in a separate source module.
The original CMSIS-Core __NVIC functions are always available independent of \ref CMSIS_NVIC_VIRTUAL.
NVIC Access Functions | CMSIS-Core Functions
--------------------------|---------------------------------------------
NVIC_EnableIRQ | __NVIC_EnableIRQ
NVIC_GetEnableIRQ | __NVIC_GetEnableIRQ
NVIC_DisableIRQ | __NVIC_DisableIRQ
NVIC_GetPendingIRQ | __NVIC_GetPendingIRQ
NVIC_SetPendingIRQ | __NVIC_SetPendingIRQ
NVIC_ClearPendingIRQ | __NVIC_ClearPendingIRQ
NVIC_GetActive | __NVIC_GetActive
NVIC_SetPriority | __NVIC_SetPriority
NVIC_GetPriority | __NVIC_GetPriority
NVIC_SetPriorityGrouping | __NVIC_SetPriorityGrouping
NVIC_GetPriorityGrouping | __NVIC_GetPriorityGrouping
*/
#define CMSIS_VECTAB_VIRTUAL ///< Virtualization of interrupt vector table access functions
/**
\def CMSIS_VECTAB_VIRTUAL
When \ref CMSIS_NVIC_VIRTUAL is defined, the functions in the table below must be replaced
to virtualize the API access functions to the interrupt vector table. The NVIC vector table API should be implemented
in a separate source module. This allows, for example, alternate implementations to relocate the vector table from flash to RAM on the first vector table update.
The original CMSIS-Core functions are always available, but prefixed with __NVIC.
Interrupt Vector Table Access | CMSIS-Core Functions
-------------------------------|---------------------------------------------
NVIC_GetVector | __NVIC_GetVector
NVIC_SetVector | __NVIC_SetVector
*/
/**************************************************************************************************/
/** \brief Definition of IRQn numbers
The core exception enumeration names for IRQn values are defined in the \ref device_h_pg.
- Negative IRQn values represent processor core exceptions (internal interrupts).
- Positive IRQn values represent device-specific exceptions (external interrupts).
- The first device-specific interrupt has the IRQn value 0.
The table below describes the core exception names and their availability in various Cortex-M cores.
*/
typedef enum IRQn
{
/****** Cortex-M3 Processor Exceptions/Interrupt Numbers **************************/
NonMaskableInt_IRQn = -14, ///< Exception 2: Non Maskable Interrupt
HardFault_IRQn = -13, ///< Exception 3: Hard Fault Interrupt
MemoryManagement_IRQn = -12, ///< Exception 4: Memory Management Interrupt [not on Cortex-M0 variants]
BusFault_IRQn = -11, ///< Exception 5: Bus Fault Interrupt [not on Cortex-M0 variants]
UsageFault_IRQn = -10, ///< Exception 6: Usage Fault Interrupt [not on Cortex-M0 variants]
\if ARMv8M
SecureFault_IRQn = -9, ///< Exception 7: Secure Fault Interrupt [only on Armv8-M]
\endif
SVCall_IRQn = -5, ///< Exception 11: SVC Interrupt
DebugMonitor_IRQn = -4, ///< Exception 12: Debug Monitor Interrupt [not on Cortex-M0 variants]
PendSV_IRQn = -2, ///< Exception 14: Pend SV Interrupt [not on Cortex-M0 variants]
SysTick_IRQn = -1, ///< Exception 15: System Tick Interrupt
/****** Device-specific Interrupt Numbers *****************************************/
WWDG_STM_IRQn = 0, ///< Device Interrupt 0: Window WatchDog Interrupt
PVD_STM_IRQn = 1, ///< Device Interrupt 1: PVD through EXTI Line detection Interrupt
} IRQn_Type;
/**************************************************************************************************/
/** \brief Set priority grouping [not for Cortex-M0, Cortex-M0+, or SC000]
The function sets the priority grouping \em PriorityGroup using the required unlock sequence.
\em PriorityGroup is assigned to the field PRIGROUP (register AIRCR[10:8]). This field
determines the split of group priority from subpriority.
Only values from 0..7 are used.
In case of a conflict between priority grouping and available
priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.
\param [in] PriorityGroup Priority group
\remarks
- not for Cortex-M0, Cortex-M0+, or SC000.
- By default, priority group setting is zero.
\sa
- \ref NVIC_GetPriorityGrouping; NVIC_SetPriority; SCB_Type
- \ref ref_man_sec
*/
void NVIC_SetPriorityGrouping(uint32_t PriorityGroup);
/**************************************************************************************************/
/**
\brief Read the priority grouping [not for Cortex-M0, Cortex-M0+, or SC000]
This function returns the priority grouping (flag PRIGROUP in AIRCR[10:8]).
\return Priority grouping field
\remarks
- not for Cortex-M0, Cortex-M0+, or SC000.
- By default, priority group setting is zero.
\sa
- \ref NVIC_SetPriorityGrouping; NVIC_GetPriority; SCB_Type
- \ref ref_man_sec
*/
uint32_t NVIC_GetPriorityGrouping(void);
/**************************************************************************************************/
/**
\brief Enable a device specific interrupt
This function enables the specified device specific interrupt \em IRQn.
\em IRQn cannot be a negative value.
\param [in] IRQn Interrupt number
\remarks
- IRQn must not be negative.
- The registers that control the enabling and disabling of interrupts are called
SETENA and CLRENA.
- The number of supported interrupts depends on the implementation of the chip designer
and can be read form the Interrupt Controller Type Register (ICTR) in granularities of 32:
\n ICTR[4:0]
- 0 - 32 interrupts supported
- 1 - 64 interrupts supported
- ...
\sa
- \ref NVIC_DisableIRQ; SCnSCB_Type;
- \ref ref_man_sec
*/
void NVIC_EnableIRQ(IRQn_Type IRQn);
/**************************************************************************************************/
/**
\brief Get a device specific interrupt enable status
This function returns the interrupt enable status for the specified device specific interrupt \em IRQn.
\em IRQn cannot be a negative value.
\param [in] IRQn Interrupt number
\returns
- 0 Interrupt is not enabled
- 1 Interrupt is enabled
\remarks
- IRQn must not be negative.
- The registers that control the enabling and disabling of interrupts are called SETENA and CLRENA.
\sa
- \ref NVIC_EnableIRQ; NVIC_DisableIRQ;
- \ref ref_man_sec
*/
uint32_t NVIC_GetEnableIRQ(IRQn_Type IRQn);
/**************************************************************************************************/
/**
\brief Disable a device specific interrupt
This function disables the specified device specific interrupt \em IRQn.
\em IRQn cannot be a negative value.
\param [in] IRQn Number of the external interrupt to disable
\remarks
- IRQn must not be negative.
- The registers that control the enabling and disabling of interrupts are called
SETENA and CLRENA.
\sa
- \ref NVIC_EnableIRQ
- \ref ref_man_sec
*/
void NVIC_DisableIRQ(IRQn_Type IRQn);
/**************************************************************************************************/
/**
\brief Get the pending device specific interrupt
This function returns the pending status of the specified device specific interrupt \em IRQn.
\param [in] IRQn Interrupt number
\returns
- 0 Interrupt is not pending
- 1 Interrupt is pending
\remarks
- IRQn must not be negative.
- The registers that control the status of interrupts are called SETPEND and CLRPEND.
\sa
- \ref NVIC_SetPendingIRQ; NVIC_ClearPendingIRQ
- \ref ref_man_sec
*/
uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn);
/**************************************************************************************************/
/**
\brief Set a device specific interrupt to pending
This function sets the pending bit for the specified device specific interrupt \em IRQn.
\em IRQn cannot be a negative value.
\param [in] IRQn Interrupt number
\remarks
- IRQn must not be negative.
- The registers that control the status of interrupts are called SETPEND and CLRPEND.
\sa
- \ref NVIC_GetPendingIRQ; NVIC_ClearPendingIRQ
- \ref ref_man_sec
*/
void NVIC_SetPendingIRQ(IRQn_Type IRQn);
/**************************************************************************************************/
/**
\brief Clear a device specific interrupt from pending
This function removes the pending state of the specified device specific interrupt \em IRQn.
\em IRQn cannot be a negative number.
\param [in] IRQn Interrupt number
\remarks
- IRQn must not be negative.
- The registers that control the status of interrupts are called SETPEND and CLRPEND.
- An interrupt can have the status pending though it is not active.
\sa
- \ref NVIC_SetPendingIRQ; NVIC_GetPendingIRQ
- \ref ref_man_sec
*/
void NVIC_ClearPendingIRQ(IRQn_Type IRQn);
/**************************************************************************************************/
/**
\brief Get the device specific interrupt active status [not for Cortex-M0, Cortex-M0+, or SC000]
This function reads the Interrupt Active Register (NVIC_IABR0-NVIC_IABR7) in NVIC and
returns the active bit of the interrupt \em IRQn.
\param [in] IRQn Interrupt number
\returns
- 0 Interrupt is not active
- 1 Interrupt is active, or active and pending
\remarks
- not for Cortex-M0, Cortex-M0+, or SC000.
- IRQn must not be negative.
- Each external interrupt has an active status bit. When the processor starts the interrupt
handler the bit is set to 1 and cleared when the interrupt return is executed.
- When an ISR is preempted and the processor executes another interrupt handler, the
previous interrupt is still defined as active.
\sa
- \ref ref_man_sec
*/
uint32_t NVIC_GetActive(IRQn_Type IRQn);
/**************************************************************************************************/
/**
\brief Set the priority for an interrupt
Sets the priority for the interrupt specified by \em IRQn.\em IRQn can can specify any
device specific interrupt, or processor exception. The \em priority specifies
the interrupt priority value, whereby lower values indicate a higher priority. The default
priority is 0 for every interrupt. This is the highest possible priority.
The priority cannot be set for every core interrupt. HardFault and NMI have a fixed (negative)
priority that is higher than any configurable exception or interrupt.
\param [in] IRQn Interrupt Number
\param [in] priority Priority to set
\remarks
- The number of priority levels is configurable and depends on the implementation of the
chip designer. To determine the number of bits implemented for interrupt priority-level
registers, write \em 0xFF to one of the priority-level register, then read back the value. For
example, if the minimum number of 3 bits have been implemented, the read-back value is \em 0xE0.
- Writes to unimplemented bits are ignored.
- <b>For Cortex-M0</b>:
- Dynamic switching of interrupt priority levels is not supported. The priority level of
an interrupt should not be changed after it has been enabled.
- Supports 0 to 192 priority levels.
- Priority-level registers are 2 bit wide, occupying the two MSBs.
Each Interrupt Priority Level Register is 1-byte wide.
- <b>For Cortex-M3, Cortex-M4, and Cortex-M7</b>:
- Dynamic switching of interrupt priority levels is supported.
- Supports 0 to 255 priority levels.
- Priority-level registers have a maximum width of 8 bits and a minimum of 3 bits.
Each register can be further divided into preempt priority level and subpriority level.
\sa
- \ref NVIC_GetPriority; NVIC_SetPriorityGrouping; __set_BASEPRI;
- \ref ref_man_sec
*/
void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority);
/**************************************************************************************************/
/**
\brief Get the priority of an interrupt
This function reads the priority for the specified interrupt \em IRQn. \em IRQn can can specify
any device specific interrupt, or processor exception.
The returned priority value is automatically aligned to the implemented
priority bits of the microcontroller.
\param [in] IRQn Interrupt number
\returns Interrupt priority
\remarks
- Each external interrupt has an associated priority-level register.
- Unimplemented bits are read as zero.
\sa
- \ref NVIC_SetPriority; NVIC_GetPriorityGrouping; __get_BASEPRI;
- \ref ref_man_sec
*/
uint32_t NVIC_GetPriority(IRQn_Type IRQn);
/**************************************************************************************************/
/**
\brief Encodes Priority [not for Cortex-M0, Cortex-M0+, or SC000]
This function encodes the priority for an interrupt with the priority group \em PriorityGroup,
preemptive priority value \em PreemptPriority, and subpriority value \em SubPriority.
In case of a conflict between priority grouping and available
priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set.
\param [in] PriorityGroup Priority group
\param [in] PreemptPriority Preemptive priority value (starting from 0)
\param [in] SubPriority Subpriority value (starting from 0)
\returns Encoded priority for the interrupt
\remarks
- not for Cortex-M0, Cortex-M0+, or SC000.
\sa
- \ref NVIC_DecodePriority; NVIC_SetPriority;
- \ref ref_man_sec
*/
uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority);
/**************************************************************************************************/
/**
\brief Decode the interrupt priority [not for Cortex-M0, Cortex-M0+, or SC000]
This function decodes an interrupt priority value with the priority group \em PriorityGroup to
preemptive priority value \em pPreemptPriority and subpriority value \em pSubPriority.
In case of a conflict between priority grouping and available
priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set.
\param [in] Priority Priority
\param [in] PriorityGroup Priority group
\param [out] *pPreemptPriority Preemptive priority value (starting from 0)
\param [out] *pSubPriority Subpriority value (starting from 0)
\remarks
- not for Cortex-M0, Cortex-M0+, or SC000.
\sa
- \ref NVIC_EncodePriority; NVIC_GetPriority; NVIC_GetPriorityGrouping;
- \ref ref_man_sec
*/
void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority);
/**************************************************************************************************/
/**
\brief Read Interrupt Vector [not for Cortex-M0, SC000]
This function allows to read the address of an interrupt handler function.
\param [in] IRQn Interrupt number
\returns Address of interrupt handler function
\remarks
- For using this function with Cortex-M0+ processor based devices, the SBC->VTOR register must be implemented.
\sa
- \ref NVIC_SetVector
- \ref ref_man_sec
*/
uint32_t NVIC_GetVector(IRQn_Type IRQn);
/**************************************************************************************************/
/**
\brief Modify Interrupt Vector [not for Cortex-M0, SC000]
This function allows to change the address of an interrupt handler function.
\param [in] IRQn Interrupt number
\param [in] vector Address of new interrupt handler function
\remarks
- Usage of this function requires vector relocation to RAM. Refer to \ref using_VTOR_pg for more information.
- For using this function with Cortex-M0+ processor based devices, the SBC->VTOR register must be implemented.
\sa
- \ref NVIC_GetVector
- \ref ref_man_sec
*/
void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector);
/**************************************************************************************************/
/**
\brief Reset the system
This function requests a system reset by setting the SYSRESETREQ flag in the AIRCR register.
\remarks
- In most microcontroller designs, setting the SYSRESETREQ flag resets the processor and
most parts of the system, but should not affect the debug system.
\sa
- \ref ref_man_sec
*/
void NVIC_SystemReset (void);
/**
\cond (ARMv8M)
*/
/**
\brief Get Interrupt Target State
\details Reads the interrupt target field from the non-secure NVIC when in secure state.
\param [in] IRQn External interrupt number. Value cannot be negative.
\returns
- 0 if interrupt is assigned to Secure
- 1 if interrupt is assigned to Non Secure
\remarks
- Only available for Armv8-M in secure state.
\sa
- \ref NVIC_ClearTargetState; NVIC_SetTargetState;
*/
uint32_t NVIC_GetTargetState(IRQn_Type IRQn);
/**
\brief Set Interrupt Target State
\details Sets the interrupt target field in the non-secure NVIC when in secure state.
\param [in] IRQn External interrupt number. Value cannot be negative.
\returns
- 0 if interrupt is assigned to Secure
- 1 if interrupt is assigned to Non Secure
\remarks
- Only available for Armv8-M in secure state.
\sa
- \ref NVIC_ClearTargetState; NVIC_GetTargetState;
*/
uint32_t NVIC_SetTargetState(IRQn_Type IRQn);
/**
\brief Clear Interrupt Target State
\details Clears the interrupt target field in the non-secure NVIC when in secure state.
\param [in] IRQn External interrupt number. Value cannot be negative.
\returns
- 0 if interrupt is assigned to Secure
- 1 if interrupt is assigned to Non Secure
\remarks
- Only available for Armv8-M in secure state.
\sa
- \ref NVIC_GetTargetState; NVIC_SetTargetState;
*/
uint32_t NVIC_ClearTargetState(IRQn_Type IRQn);
/**
\endcond
*/
/*@} end of NVIC_gr */

View File

@ -1,428 +0,0 @@
/**
\defgroup pmu8_functions PMU Functions for Armv8.1-M
\brief Functions that relate to the Performance Monitoring Unit.
\details
The following functions support the Performance Monitoring Unit (PMU) that is available on the Cortex-M55/M85 processors.
The PMU is used to monitor events that occur during run-time of an application.
<b>Example:</b>
\code
// Initialize counter variables
unsigned int cycle_count = 0;
unsigned int l1_dcache_miss_count = 0;
unsigned int instructions_retired_count = 0;
// Enable the PMU
// Note: Before using the PMU, software needs to ensure
// that trace is enabled via the Debug Exception Monitor Control Register, DEMCR:
// CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
ARM_PMU_Enable();
// Configure Event Counter Register 0 to count instructions retired
// Configure Event Counter Register 1 to count L1 D-Cache misses
ARM_PMU_Set_EVTYPER(0, ARM_PMU_INST_RETIRED);
ARM_PMU_Set_EVTYPER(1, ARM_PMU_L1D_CACHE_MISS_RD);
// Reset Event Counters and Cycle Counter
ARM_PMU_EVCNTR_ALL_Reset();
ARM_PMU_CYCCNT_Reset();
// Start incrementing Cycle Count Register and Event Counter Registers 0 & 1
ARM_PMU_CNTR_Enable(PMU_CNTENSET_CCNTR_ENABLE_Msk|PMU_CNTENSET_CNT0_ENABLE_Msk|PMU_CNTENSET_CNT1_ENABLE_Msk);
// Code you want to measure here
// Stop incrementing Cycle Count Register and Event Counter Registers 0 & 1
ARM_PMU_CNTR_Disable(PMU_CNTENCLR_CCNTR_ENABLE_Msk|PMU_CNTENCLR_CNT0_ENABLE_Msk|PMU_CNTENCLR_CNT1_ENABLE_Msk);
// Get cycle count, number of instructions retired and number of L1 D-Cache misses (on read)
cycle_count = cycle_count + ARM_PMU_Get_CCNTR();
instructions_retired_count = instructions_retired_count + ARM_PMU_Get_EVCNTR(0);
l1_dcache_miss_count = l1_dcache_miss_count + ARM_PMU_Get_EVCNTR(1); // Note: D-Cache must be enabled using
// SCB_EnableDCache() for meaningful result.
\endcode
@{
*/
/**
\defgroup pmu8_events_armv81 PMU Events for Armv8.1-M
\ingroup pmu8_functions
\brief IDs for Armv8.1-M architecture defined events.
\details
These events are available on all Armv8.1-M devices including a PMU.
@{
*/
#define ARM_PMU_SW_INCR 0x0000 /*!< \brief Software update to the PMU_SWINC register, architecturally executed and condition code check pass */
#define ARM_PMU_L1I_CACHE_REFILL 0x0001 /*!< \brief L1 I-Cache refill */
#define ARM_PMU_L1D_CACHE_REFILL 0x0003 /*!< \brief L1 D-Cache refill */
#define ARM_PMU_L1D_CACHE 0x0004 /*!< \brief L1 D-Cache access */
#define ARM_PMU_LD_RETIRED 0x0006 /*!< \brief Memory-reading instruction architecturally executed and condition code check pass */
#define ARM_PMU_ST_RETIRED 0x0007 /*!< \brief Memory-writing instruction architecturally executed and condition code check pass */
#define ARM_PMU_INST_RETIRED 0x0008 /*!< \brief Instruction architecturally executed */
#define ARM_PMU_EXC_TAKEN 0x0009 /*!< \brief Exception entry */
#define ARM_PMU_EXC_RETURN 0x000A /*!< \brief Exception return instruction architecturally executed and the condition code check pass */
#define ARM_PMU_PC_WRITE_RETIRED 0x000C /*!< \brief Software change to the Program Counter (PC). Instruction is architecturally executed and condition code check pass */
#define ARM_PMU_BR_IMMED_RETIRED 0x000D /*!< \brief Immediate branch architecturally executed */
#define ARM_PMU_BR_RETURN_RETIRED 0x000E /*!< \brief Function return instruction architecturally executed and the condition code check pass */
#define ARM_PMU_UNALIGNED_LDST_RETIRED 0x000F /*!< \brief Unaligned memory memory-reading or memory-writing instruction architecturally executed and condition code check pass */
#define ARM_PMU_BR_MIS_PRED 0x0010 /*!< \brief Mispredicted or not predicted branch speculatively executed */
#define ARM_PMU_CPU_CYCLES 0x0011 /*!< \brief Cycle */
#define ARM_PMU_BR_PRED 0x0012 /*!< \brief Predictable branch speculatively executed */
#define ARM_PMU_MEM_ACCESS 0x0013 /*!< \brief Data memory access */
#define ARM_PMU_L1I_CACHE 0x0014 /*!< \brief Level 1 instruction cache access */
#define ARM_PMU_L1D_CACHE_WB 0x0015 /*!< \brief Level 1 data cache write-back */
#define ARM_PMU_L2D_CACHE 0x0016 /*!< \brief Level 2 data cache access */
#define ARM_PMU_L2D_CACHE_REFILL 0x0017 /*!< \brief Level 2 data cache refill */
#define ARM_PMU_L2D_CACHE_WB 0x0018 /*!< \brief Level 2 data cache write-back */
#define ARM_PMU_BUS_ACCESS 0x0019 /*!< \brief Bus access */
#define ARM_PMU_MEMORY_ERROR 0x001A /*!< \brief Local memory error */
#define ARM_PMU_INST_SPEC 0x001B /*!< \brief Instruction speculatively executed */
#define ARM_PMU_BUS_CYCLES 0x001D /*!< \brief Bus cycles */
#define ARM_PMU_CHAIN 0x001E /*!< \brief For an odd numbered counter, increment when an overflow occurs on the preceding even-numbered counter on the same PE */
#define ARM_PMU_L1D_CACHE_ALLOCATE 0x001F /*!< \brief Level 1 data cache allocation without refill */
#define ARM_PMU_L2D_CACHE_ALLOCATE 0x0020 /*!< \brief Level 2 data cache allocation without refill */
#define ARM_PMU_BR_RETIRED 0x0021 /*!< \brief Branch instruction architecturally executed */
#define ARM_PMU_BR_MIS_PRED_RETIRED 0x0022 /*!< \brief Mispredicted branch instruction architecturally executed */
#define ARM_PMU_STALL_FRONTEND 0x0023 /*!< \brief No operation issued because of the frontend */
#define ARM_PMU_STALL_BACKEND 0x0024 /*!< \brief No operation issued because of the backend */
#define ARM_PMU_L2I_CACHE 0x0027 /*!< \brief Level 2 instruction cache access */
#define ARM_PMU_L2I_CACHE_REFILL 0x0028 /*!< \brief Level 2 instruction cache refill */
#define ARM_PMU_L3D_CACHE_ALLOCATE 0x0029 /*!< \brief Level 3 data cache allocation without refill */
#define ARM_PMU_L3D_CACHE_REFILL 0x002A /*!< \brief Level 3 data cache refill */
#define ARM_PMU_L3D_CACHE 0x002B /*!< \brief Level 3 data cache access */
#define ARM_PMU_L3D_CACHE_WB 0x002C /*!< \brief Level 3 data cache write-back */
#define ARM_PMU_LL_CACHE_RD 0x0036 /*!< \brief Last level data cache read */
#define ARM_PMU_LL_CACHE_MISS_RD 0x0037 /*!< \brief Last level data cache read miss */
#define ARM_PMU_L1D_CACHE_MISS_RD 0x0039 /*!< \brief Level 1 data cache read miss */
#define ARM_PMU_OP_COMPLETE 0x003A /*!< \brief Operation retired */
#define ARM_PMU_OP_SPEC 0x003B /*!< \brief Operation speculatively executed */
#define ARM_PMU_STALL 0x003C /*!< \brief Stall cycle for instruction or operation not sent for execution */
#define ARM_PMU_STALL_OP_BACKEND 0x003D /*!< \brief Stall cycle for instruction or operation not sent for execution due to pipeline backend */
#define ARM_PMU_STALL_OP_FRONTEND 0x003E /*!< \brief Stall cycle for instruction or operation not sent for execution due to pipeline frontend */
#define ARM_PMU_STALL_OP 0x003F /*!< \brief Instruction or operation slots not occupied each cycle */
#define ARM_PMU_L1D_CACHE_RD 0x0040 /*!< \brief Level 1 data cache read */
#define ARM_PMU_LE_RETIRED 0x0100 /*!< \brief Loop end instruction executed */
#define ARM_PMU_LE_SPEC 0x0101 /*!< \brief Loop end instruction speculatively executed */
#define ARM_PMU_BF_RETIRED 0x0104 /*!< \brief Branch future instruction architecturally executed and condition code check pass */
#define ARM_PMU_BF_SPEC 0x0105 /*!< \brief Branch future instruction speculatively executed and condition code check pass */
#define ARM_PMU_LE_CANCEL 0x0108 /*!< \brief Loop end instruction not taken */
#define ARM_PMU_BF_CANCEL 0x0109 /*!< \brief Branch future instruction not taken */
#define ARM_PMU_SE_CALL_S 0x0114 /*!< \brief Call to secure function, resulting in Security state change */
#define ARM_PMU_SE_CALL_NS 0x0115 /*!< \brief Call to non-secure function, resulting in Security state change */
#define ARM_PMU_DWT_CMPMATCH0 0x0118 /*!< \brief DWT comparator 0 match */
#define ARM_PMU_DWT_CMPMATCH1 0x0119 /*!< \brief DWT comparator 1 match */
#define ARM_PMU_DWT_CMPMATCH2 0x011A /*!< \brief DWT comparator 2 match */
#define ARM_PMU_DWT_CMPMATCH3 0x011B /*!< \brief DWT comparator 3 match */
#define ARM_PMU_MVE_INST_RETIRED 0x0200 /*!< \brief MVE instruction architecturally executed */
#define ARM_PMU_MVE_INST_SPEC 0x0201 /*!< \brief MVE instruction speculatively executed */
#define ARM_PMU_MVE_FP_RETIRED 0x0204 /*!< \brief MVE floating-point instruction architecturally executed */
#define ARM_PMU_MVE_FP_SPEC 0x0205 /*!< \brief MVE floating-point instruction speculatively executed */
#define ARM_PMU_MVE_FP_HP_RETIRED 0x0208 /*!< \brief MVE half-precision floating-point instruction architecturally executed */
#define ARM_PMU_MVE_FP_HP_SPEC 0x0209 /*!< \brief MVE half-precision floating-point instruction speculatively executed */
#define ARM_PMU_MVE_FP_SP_RETIRED 0x020C /*!< \brief MVE single-precision floating-point instruction architecturally executed */
#define ARM_PMU_MVE_FP_SP_SPEC 0x020D /*!< \brief MVE single-precision floating-point instruction speculatively executed */
#define ARM_PMU_MVE_FP_MAC_RETIRED 0x0214 /*!< \brief MVE floating-point multiply or multiply-accumulate instruction architecturally executed */
#define ARM_PMU_MVE_FP_MAC_SPEC 0x0215 /*!< \brief MVE floating-point multiply or multiply-accumulate instruction speculatively executed */
#define ARM_PMU_MVE_INT_RETIRED 0x0224 /*!< \brief MVE integer instruction architecturally executed */
#define ARM_PMU_MVE_INT_SPEC 0x0225 /*!< \brief MVE integer instruction speculatively executed */
#define ARM_PMU_MVE_INT_MAC_RETIRED 0x0228 /*!< \brief MVE multiply or multiply-accumulate instruction architecturally executed */
#define ARM_PMU_MVE_INT_MAC_SPEC 0x0229 /*!< \brief MVE multiply or multiply-accumulate instruction speculatively executed */
#define ARM_PMU_MVE_LDST_RETIRED 0x0238 /*!< \brief MVE load or store instruction architecturally executed */
#define ARM_PMU_MVE_LDST_SPEC 0x0239 /*!< \brief MVE load or store instruction speculatively executed */
#define ARM_PMU_MVE_LD_RETIRED 0x023C /*!< \brief MVE load instruction architecturally executed */
#define ARM_PMU_MVE_LD_SPEC 0x023D /*!< \brief MVE load instruction speculatively executed */
#define ARM_PMU_MVE_ST_RETIRED 0x0240 /*!< \brief MVE store instruction architecturally executed */
#define ARM_PMU_MVE_ST_SPEC 0x0241 /*!< \brief MVE store instruction speculatively executed */
#define ARM_PMU_MVE_LDST_CONTIG_RETIRED 0x0244 /*!< \brief MVE contiguous load or store instruction architecturally executed */
#define ARM_PMU_MVE_LDST_CONTIG_SPEC 0x0245 /*!< \brief MVE contiguous load or store instruction speculatively executed */
#define ARM_PMU_MVE_LD_CONTIG_RETIRED 0x0248 /*!< \brief MVE contiguous load instruction architecturally executed */
#define ARM_PMU_MVE_LD_CONTIG_SPEC 0x0249 /*!< \brief MVE contiguous load instruction speculatively executed */
#define ARM_PMU_MVE_ST_CONTIG_RETIRED 0x024C /*!< \brief MVE contiguous store instruction architecturally executed */
#define ARM_PMU_MVE_ST_CONTIG_SPEC 0x024D /*!< \brief MVE contiguous store instruction speculatively executed */
#define ARM_PMU_MVE_LDST_NONCONTIG_RETIRED 0x0250 /*!< \brief MVE non-contiguous load or store instruction architecturally executed */
#define ARM_PMU_MVE_LDST_NONCONTIG_SPEC 0x0251 /*!< \brief MVE non-contiguous load or store instruction speculatively executed */
#define ARM_PMU_MVE_LD_NONCONTIG_RETIRED 0x0254 /*!< \brief MVE non-contiguous load instruction architecturally executed */
#define ARM_PMU_MVE_LD_NONCONTIG_SPEC 0x0255 /*!< \brief MVE non-contiguous load instruction speculatively executed */
#define ARM_PMU_MVE_ST_NONCONTIG_RETIRED 0x0258 /*!< \brief MVE non-contiguous store instruction architecturally executed */
#define ARM_PMU_MVE_ST_NONCONTIG_SPEC 0x0259 /*!< \brief MVE non-contiguous store instruction speculatively executed */
#define ARM_PMU_MVE_LDST_MULTI_RETIRED 0x025C /*!< \brief MVE memory instruction targeting multiple registers architecturally executed */
#define ARM_PMU_MVE_LDST_MULTI_SPEC 0x025D /*!< \brief MVE memory instruction targeting multiple registers speculatively executed */
#define ARM_PMU_MVE_LD_MULTI_RETIRED 0x0260 /*!< \brief MVE memory load instruction targeting multiple registers architecturally executed */
#define ARM_PMU_MVE_LD_MULTI_SPEC 0x0261 /*!< \brief MVE memory load instruction targeting multiple registers speculatively executed */
#define ARM_PMU_MVE_ST_MULTI_RETIRED 0x0261 /*!< \brief MVE memory store instruction targeting multiple registers architecturally executed */
#define ARM_PMU_MVE_ST_MULTI_SPEC 0x0265 /*!< \brief MVE memory store instruction targeting multiple registers speculatively executed */
#define ARM_PMU_MVE_LDST_UNALIGNED_RETIRED 0x028C /*!< \brief MVE unaligned memory load or store instruction architecturally executed */
#define ARM_PMU_MVE_LDST_UNALIGNED_SPEC 0x028D /*!< \brief MVE unaligned memory load or store instruction speculatively executed */
#define ARM_PMU_MVE_LD_UNALIGNED_RETIRED 0x0290 /*!< \brief MVE unaligned load instruction architecturally executed */
#define ARM_PMU_MVE_LD_UNALIGNED_SPEC 0x0291 /*!< \brief MVE unaligned load instruction speculatively executed */
#define ARM_PMU_MVE_ST_UNALIGNED_RETIRED 0x0294 /*!< \brief MVE unaligned store instruction architecturally executed */
#define ARM_PMU_MVE_ST_UNALIGNED_SPEC 0x0295 /*!< \brief MVE unaligned store instruction speculatively executed */
#define ARM_PMU_MVE_LDST_UNALIGNED_NONCONTIG_RETIRED 0x0298 /*!< \brief MVE unaligned noncontiguous load or store instruction architecturally executed */
#define ARM_PMU_MVE_LDST_UNALIGNED_NONCONTIG_SPEC 0x0299 /*!< \brief MVE unaligned noncontiguous load or store instruction speculatively executed */
#define ARM_PMU_MVE_VREDUCE_RETIRED 0x02A0 /*!< \brief MVE vector reduction instruction architecturally executed */
#define ARM_PMU_MVE_VREDUCE_SPEC 0x02A1 /*!< \brief MVE vector reduction instruction speculatively executed */
#define ARM_PMU_MVE_VREDUCE_FP_RETIRED 0x02A4 /*!< \brief MVE floating-point vector reduction instruction architecturally executed */
#define ARM_PMU_MVE_VREDUCE_FP_SPEC 0x02A5 /*!< \brief MVE floating-point vector reduction instruction speculatively executed */
#define ARM_PMU_MVE_VREDUCE_INT_RETIRED 0x02A8 /*!< \brief MVE integer vector reduction instruction architecturally executed */
#define ARM_PMU_MVE_VREDUCE_INT_SPEC 0x02A9 /*!< \brief MVE integer vector reduction instruction speculatively executed */
#define ARM_PMU_MVE_PRED 0x02B8 /*!< \brief Cycles where one or more predicated beats architecturally executed */
#define ARM_PMU_MVE_STALL 0x02CC /*!< \brief Stall cycles caused by an MVE instruction */
#define ARM_PMU_MVE_STALL_RESOURCE 0x02CD /*!< \brief Stall cycles caused by an MVE instruction because of resource conflicts */
#define ARM_PMU_MVE_STALL_RESOURCE_MEM 0x02CE /*!< \brief Stall cycles caused by an MVE instruction because of memory resource conflicts */
#define ARM_PMU_MVE_STALL_RESOURCE_FP 0x02CF /*!< \brief Stall cycles caused by an MVE instruction because of floating-point resource conflicts */
#define ARM_PMU_MVE_STALL_RESOURCE_INT 0x02D0 /*!< \brief Stall cycles caused by an MVE instruction because of integer resource conflicts */
#define ARM_PMU_MVE_STALL_BREAK 0x02D3 /*!< \brief Stall cycles caused by an MVE chain break */
#define ARM_PMU_MVE_STALL_DEPENDENCY 0x02D4 /*!< \brief Stall cycles caused by MVE register dependency */
#define ARM_PMU_ITCM_ACCESS 0x4007 /*!< \brief Instruction TCM access */
#define ARM_PMU_DTCM_ACCESS 0x4008 /*!< \brief Data TCM access */
#define ARM_PMU_TRCEXTOUT0 0x4010 /*!< \brief ETM external output 0 */
#define ARM_PMU_TRCEXTOUT1 0x4011 /*!< \brief ETM external output 1 */
#define ARM_PMU_TRCEXTOUT2 0x4012 /*!< \brief ETM external output 2 */
#define ARM_PMU_TRCEXTOUT3 0x4013 /*!< \brief ETM external output 3 */
#define ARM_PMU_CTI_TRIGOUT4 0x4018 /*!< \brief Cross-trigger Interface output trigger 4 */
#define ARM_PMU_CTI_TRIGOUT5 0x4019 /*!< \brief Cross-trigger Interface output trigger 5 */
#define ARM_PMU_CTI_TRIGOUT6 0x401A /*!< \brief Cross-trigger Interface output trigger 6 */
#define ARM_PMU_CTI_TRIGOUT7 0x401B /*!< \brief Cross-trigger Interface output trigger 7 */
/** @} */
/**
\defgroup pmu8_events_armcm55 PMU Events for Cortex-M55
\ingroup pmu8_functions
\brief IDs for additional events defined for Cortex-M55.
\details
These events are available on a Cortex-M55 device including a PMU.
@{
*/
#define ARMCM55_PMU_ECC_ERR 0xC000 /*!< \brief Any ECC error */
#define ARMCM55_PMU_ECC_ERR_FATAL 0xC001 /*!< \brief Any fatal ECC error */
#define ARMCM55_PMU_ECC_ERR_DCACHE 0xC010 /*!< \brief Any ECC error in the data cache */
#define ARMCM55_PMU_ECC_ERR_ICACHE 0xC011 /*!< \brief Any ECC error in the instruction cache */
#define ARMCM55_PMU_ECC_ERR_FATAL_DCACHE 0xC012 /*!< \brief Any fatal ECC error in the data cache */
#define ARMCM55_PMU_ECC_ERR_FATAL_ICACHE 0xC013 /*!< \brief Any fatal ECC error in the instruction cache*/
#define ARMCM55_PMU_ECC_ERR_DTCM 0xC020 /*!< \brief Any ECC error in the DTCM */
#define ARMCM55_PMU_ECC_ERR_ITCM 0xC021 /*!< \brief Any ECC error in the ITCM */
#define ARMCM55_PMU_ECC_ERR_FATAL_DTCM 0xC022 /*!< \brief Any fatal ECC error in the DTCM */
#define ARMCM55_PMU_ECC_ERR_FATAL_ITCM 0xC023 /*!< \brief Any fatal ECC error in the ITCM */
#define ARMCM55_PMU_PF_LINEFILL 0xC100 /*!< \brief A prefetcher starts a line-fill */
#define ARMCM55_PMU_PF_CANCEL 0xC101 /*!< \brief A prefetcher stops prefetching */
#define ARMCM55_PMU_PF_DROP_LINEFILL 0xC102 /*!< \brief A linefill triggered by a prefetcher has been dropped because of lack of buffering */
#define ARMCM55_PMU_NWAMODE_ENTER 0xC200 /*!< \brief No write-allocate mode entry */
#define ARMCM55_PMU_NWAMODE 0xC201 /*!< \brief Write-allocate store is not allocated into the data cache due to no-write-allocate mode */
#define ARMCM55_PMU_SAHB_ACCESS 0xC300 /*!< \brief Read or write access on the S-AHB interface to the TCM */
#define ARMCM55_PMU_SAHB_ACCESS 0xC300 /*!< \brief Read or write access on the S-AHB interface to the TCM */
#define ARMCM55_PMU_PAHB_ACCESS 0xC301 /*!< \brief Read or write access on the P-AHB interface */
#define ARMCM55_PMU_AXI_WRITE_ACCESS 0xC302 /*!< \brief Any beat access to M-AXI write interface */
#define ARMCM55_PMU_AXI_READ_ACCESS 0xC303 /*!< \brief Any beat access to M-AXI read interface */
#define ARMCM55_PMU_DOSTIMEOUT_DOUBLE 0xC400 /*!< \brief Denial of Service timeout has fired twice and caused buffers to drain to allow forward progress */
#define ARMCM55_PMU_DOSTIMEOUT_TRIPLE 0xC401 /*!< \brief Denial of Service timeout has fired three times and blocked the LSU to force forward progress */
/** @} */
/**
\defgroup pmu8_events_armcm85 PMU Events for Cortex-M85
\ingroup pmu8_functions
\brief IDs for additional events defined for Cortex-M85.
\details
These events are available on a Cortex-M85 device including a PMU.
@{
*/
#define ARMCM85_PMU_ECC_ERR 0xC000 /*!< \brief Any ECC error */
#define ARMCM85_PMU_ECC_ERR_MBIT 0xC001 /*!< \brief Any multi-bit ECC error */
#define ARMCM85_PMU_ECC_ERR_DCACHE 0xC010 /*!< \brief Any ECC error in the data cache */
#define ARMCM85_PMU_ECC_ERR_ICACHE 0xC011 /*!< \brief Any ECC error in the instruction cache */
#define ARMCM85_PMU_ECC_ERR_MBIT_DCACHE 0xC012 /*!< \brief Any multi-bit ECC error in the data cache */
#define ARMCM85_PMU_ECC_ERR_MBIT_ICACHE 0xC013 /*!< \brief Any multi-biy ECC error in the instruction cache*/
#define ARMCM85_PMU_ECC_ERR_DTCM 0xC020 /*!< \brief Any ECC error in the DTCM */
#define ARMCM85_PMU_ECC_ERR_ITCM 0xC021 /*!< \brief Any ECC error in the ITCM */
#define ARMCM85_PMU_ECC_ERR_MBIT_DTCM 0xC022 /*!< \brief Any multi-bit ECC error in the DTCM */
#define ARMCM85_PMU_ECC_ERR_MBIT_ITCM 0xC023 /*!< \brief Any multi-bit ECC error in the ITCM */
#define ARMCM85_PMU_PF_LINEFILL 0xC100 /*!< \brief A prefetcher starts a line-fill */
#define ARMCM85_PMU_PF_CANCEL 0xC101 /*!< \brief A prefetcher stops prefetching */
#define ARMCM85_PMU_PF_DROP_LINEFILL 0xC102 /*!< \brief A linefill triggered by a prefetcher has been dropped because of lack of buffering */
#define ARMCM85_PMU_NWAMODE_ENTER 0xC200 /*!< \brief No write-allocate mode entry */
#define ARMCM85_PMU_NWAMODE 0xC201 /*!< \brief Write-allocate store is not allocated into the data cache due to no-write-allocate mode */
#define ARMCM85_PMU_SAHB_ACCESS 0xC300 /*!< \brief Read or write access on the S-AHB interface to the TCM */
#define ARMCM85_PMU_PAHB_ACCESS 0xC301 /*!< \brief Read or write access on the P-AHB interface */
#define ARMCM85_PMU_AXI_WRITE_ACCESS 0xC302 /*!< \brief Any beat access to M-AXI write interface */
#define ARMCM85_PMU_AXI_READ_ACCESS 0xC303 /*!< \brief Any beat access to M-AXI read interface */
#define ARMCM85_PMU_DOSTIMEOUT_DOUBLE 0xC400 /*!< \brief Denial of Service timeout has fired twice and caused buffers to drain to allow forward progress */
#define ARMCM85_PMU_DOSTIMEOUT_TRIPLE 0xC401 /*!< \brief Denial of Service timeout has fired three times and blocked the LSU to force forward progress */
/** @} */
/**
\brief Structure type to access the Performance Monitoring Unit (PMU).
*/
typedef struct
{
__IOM uint32_t EVCNTR[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x0 (R/W) \brief PMU Event Counter Registers \details Two up to 31 event counters, see device specific \ref __PMU_NUM_EVENTCNT */
// uint32_t RESERVED0[31U-__PMU_NUM_EVENTCNT];
__IOM uint32_t CCNTR; /*!< Offset: 0x7C (R/W) \brief PMU Cycle Counter Register */
// uint32_t RESERVED1[224];
__IOM uint32_t EVTYPER[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x400 (R/W) \brief PMU Event Type and Filter Registers \details Two up to 31 event counters, see device specific \ref __PMU_NUM_EVENTCNT */
// uint32_t RESERVED2[31U-__PMU_NUM_EVENTCNT];
__IOM uint32_t CCFILTR; /*!< Offset: 0x47C (R/W) \brief PMU Cycle Counter Filter Register */
// uint32_t RESERVED3[480];
__IOM uint32_t CNTENSET; /*!< Offset: 0xC00 (R/W) \brief PMU Count Enable Set Register */
// uint32_t RESERVED4[7];
__IOM uint32_t CNTENCLR; /*!< Offset: 0xC20 (R/W) \brief PMU Count Enable Clear Register */
// uint32_t RESERVED5[7];
__IOM uint32_t INTENSET; /*!< Offset: 0xC40 (R/W) \brief PMU Interrupt Enable Set Register */
// uint32_t RESERVED6[7];
__IOM uint32_t INTENCLR; /*!< Offset: 0xC60 (R/W) \brief PMU Interrupt Enable Clear Register */
// uint32_t RESERVED7[7];
__IOM uint32_t OVSCLR; /*!< Offset: 0xC80 (R/W) \brief PMU Overflow Flag Status Clear Register */
// uint32_t RESERVED8[7];
__IOM uint32_t SWINC; /*!< Offset: 0xCA0 (R/W) \brief PMU Software Increment Register */
// uint32_t RESERVED9[7];
__IOM uint32_t OVSSET; /*!< Offset: 0xCC0 (R/W) \brief PMU Overflow Flag Status Set Register */
// uint32_t RESERVED10[79];
__IOM uint32_t TYPE; /*!< Offset: 0xE00 (R/W) \brief PMU Type Register */
__IOM uint32_t CTRL; /*!< Offset: 0xE04 (R/W) \brief PMU Control Register */
// uint32_t RESERVED11[108];
__IOM uint32_t AUTHSTATUS; /*!< Offset: 0xFB8 (R/W) \brief PMU Authentication Status Register */
__IOM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/W) \brief PMU Device Architecture Register */
// uint32_t RESERVED12[4];
__IOM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/W) \brief PMU Device Type Register */
__IOM uint32_t PIDR4; /*!< Offset: 0xFD0 (R/W) \brief PMU Peripheral Identification Register 4 */
// uint32_t RESERVED13[3];
__IOM uint32_t PIDR0; /*!< Offset: 0xFE0 (R/W) \brief PMU Peripheral Identification Register 0 */
__IOM uint32_t PIDR1; /*!< Offset: 0xFE4 (R/W) \brief PMU Peripheral Identification Register 1 */
__IOM uint32_t PIDR2; /*!< Offset: 0xFE8 (R/W) \brief PMU Peripheral Identification Register 2 */
__IOM uint32_t PIDR3; /*!< Offset: 0xFEC (R/W) \brief PMU Peripheral Identification Register 3 */
// uint32_t RESERVED14[3];
__IOM uint32_t CIDR0; /*!< Offset: 0xFF0 (R/W) \brief PMU Component Identification Register 0 */
__IOM uint32_t CIDR1; /*!< Offset: 0xFF4 (R/W) \brief PMU Component Identification Register 1 */
__IOM uint32_t CIDR2; /*!< Offset: 0xFF8 (R/W) \brief PMU Component Identification Register 2 */
__IOM uint32_t CIDR3; /*!< Offset: 0xFFC (R/W) \brief PMU Component Identification Register 3 */
} PMU_Type;
/**
\brief PMU configuration struct
\details
This macro can be used to access the PMU registers, directly. For the common tasks
one should prefer using the control functions.
Example:
<b>Example:</b>
\code
PMU->CTRL |= PMU_CTRL_ENABLE_Msk; // Enable PMU
\endcode
*/
#define PMU
/**
\brief Enable the PMU
*/
__STATIC_INLINE void ARM_PMU_Enable(void);
/**
\brief Disable the PMU
*/
__STATIC_INLINE void ARM_PMU_Disable(void);
/**
\brief Set event to count for PMU event counter
\param [in] num Event counter (0-30) to configure
\param [in] type Event to count
*/
__STATIC_INLINE void ARM_PMU_Set_EVTYPER(uint32_t num, uint32_t type);
/**
\brief Reset cycle counter
*/
__STATIC_INLINE void ARM_PMU_CYCCNT_Reset(void);
/**
\brief Reset all event counters
*/
__STATIC_INLINE void ARM_PMU_EVCNTR_ALL_Reset(void);
/**
\brief Enable counters
\param [in] mask Counters to enable
\note Enables one or more of the following:
- event counters (0-30)
- cycle counter
*/
__STATIC_INLINE void ARM_PMU_CNTR_Enable(uint32_t mask);
/**
\brief Disable counters
\param [in] mask Counters to enable
\note Disables one or more of the following:
- event counters (0-30)
- cycle counter
*/
__STATIC_INLINE void ARM_PMU_CNTR_Disable(uint32_t mask);
/**
\brief Read cycle counter
\return Cycle count
*/
__STATIC_INLINE uint32_t ARM_PMU_Get_CCNTR(void);
/**
\brief Read event counter
\param [in] num Event counter (0-30) to read
\return Event count
*/
__STATIC_INLINE uint32_t ARM_PMU_Get_EVCNTR(uint32_t num);
/**
\brief Read counter overflow status
\return Counter overflow status bits for the following:
- event counters (0-30)
- cycle counter
*/
__STATIC_INLINE uint32_t ARM_PMU_Get_CNTR_OVS(void);
/**
\brief Clear counter overflow status
\param [in] mask Counter overflow status bits to clear
\note Clears overflow status bits for one or more of the following:
- event counters (0-30)
- cycle counter
*/
__STATIC_INLINE void ARM_PMU_Set_CNTR_OVS(uint32_t mask);
/**
\brief Enable counter overflow interrupt request
\param [in] mask Counter overflow interrupt request bits to set
\note Sets overflow interrupt request bits for one or more of the following:
- event counters (0-30)
- cycle counter
*/
__STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Enable(uint32_t mask);
/**
\brief Disable counter overflow interrupt request
\param [in] mask Counter overflow interrupt request bits to clear
\note Clears overflow interrupt request bits for one or more of the following:
- event counters (0-30)
- cycle counter
*/
__STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Disable(uint32_t mask);
/**
\brief Software increment event counter
\param [in] mask Counters to increment
\note Software increment bits for one or more event counters (0-30)
*/
__STATIC_INLINE void ARM_PMU_CNTR_Increment(uint32_t mask);
/** @} */

View File

@ -1,231 +0,0 @@
/**************************************************************************************************/
/**
\defgroup peripheral_gr Peripheral Access
\brief Naming conventions and optional features for accessing peripherals.
\details
The section below describes the naming conventions, requirements, and optional features for accessing device specific peripherals.
Most of the rules also apply to the core peripherals. The \ref device_h_pg contains typically these definition and also includes
the core specific header files.
\ifnot FuSaRTS
The definitions for \ref peripheral_gr can be generated using the <a href="../../SVD/html/index.html"><b>CMSIS-SVD</b></a> System View Description for Peripherals.
Refer to <a href="../../SVD/html/svd_SVDConv_pg.html"><b>SVDConv.exe</b></a> for more information.
\endif
Each peripheral provides a data type definition with a name that is composed of:
- an optional prefix <b>&lt;<i>device abbreviation&gt;</i>_</b>
- <b>&lt;<i>peripheral name</i>&gt;</b>
- postfix \b _Type or \b _TypeDef to identify a type definition.
Examples:
- \b UART_TypeDef for the peripheral \b UART.
- \b LPC_UART_TypeDef for the device family \b LPC and the peripheral \b UART.
The data type definition uses standard C data types defined by the ANSI C header file <stdint.h>.
- IO Type Qualifiers are used to specify the access to peripheral variables.
IO Type Qualifier | Type | Description
:------------------|:----------------|:------------
\b __IM | Struct member | Defines 'read only' permissions
\b __OM | Struct member | Defines 'write only' permissions
\b __IOM | Struct member | Defines 'read / write' permissions
\b __I | Scalar variable | Defines 'read only' permissions
\b __O | Scalar variable | Defines 'write only' permissions
\b __IO | Scalar variable | Defines 'read / write' permissions
\note
\b __IM, \b __OM, \b __IOM are added in CMSIS-Core V4.20 to enhance support for C++. Prior version used \b __I, \b __O, \b __IO also for struct member definitions.
The typedef <b>\<<i>device abbreviation</i>\>_UART_TypeDef</b> shown below defines the generic register layout for all UART channels in a device.
\code
typedef struct
{
union {
__IM uint8_t RBR; /* Offset: 0x000 (R/ ) Receiver Buffer Register */
__OM uint8_t THR; /* Offset: 0x000 ( /W) Transmit Holding Register */
__IOM uint8_t DLL; /* Offset: 0x000 (R/W) Divisor Latch LSB */
uint32_t RESERVED0;
};
union {
__IOM uint8_t DLM; /* Offset: 0x004 (R/W) Divisor Latch MSB */
__IOM uint32_t IER; /* Offset: 0x004 (R/W) Interrupt Enable Register */
};
union {
__IM uint32_t IIR; /* Offset: 0x008 (R/ ) Interrupt ID Register */
__OM uint8_t FCR; /* Offset: 0x008 ( /W) FIFO Control Register */
};
__IOM uint8_t LCR; /* Offset: 0x00C (R/W) Line Control Register */
uint8_t RESERVED1[7];
__IM uint8_t LSR; /* Offset: 0x014 (R/ ) Line Status Register */
uint8_t RESERVED2[7];
__IOM uint8_t SCR; /* Offset: 0x01C (R/W) Scratch Pad Register */
uint8_t RESERVED3[3];
__IOM uint32_t ACR; /* Offset: 0x020 (R/W) Autobaud Control Register */
__IOM uint8_t ICR; /* Offset: 0x024 (R/W) IrDA Control Register */
uint8_t RESERVED4[3];
__IOM uint8_t FDR; /* Offset: 0x028 (R/W) Fractional Divider Register */
uint8_t RESERVED5[7];
__IOM uint8_t TER; /* Offset: 0x030 (R/W) Transmit Enable Register */
uint8_t RESERVED6[39];
__IM uint8_t FIFOLVL; /* Offset: 0x058 (R/ ) FIFO Level Register */
} LPC_UART_TypeDef;
\endcode
To access the registers of the UART defined above, pointers to this register structure are defined.
If more instances of a peripheral exist, the variables have a postfix (digit or letter) that identifies the peripheral.
\b Example:
In this example \b LPC_UART2 and \b LPC_UART3 are two pointers to UARTs defined with above register structure.
\n
\code
#define LPC_UART2 ((LPC_UART_TypeDef *) LPC_UART2_BASE )
#define LPC_UART3 ((LPC_UART_TypeDef *) LPC_UART3_BASE )
\endcode
\note
- The prefix <b>LPC</b> is optional.
The registers in the various UARTs can now be referred in the user code as shown below:\n
\code
val = LPC_UART2->DR // is the data register of UART1.
\endcode
<hr>
\section core_cmsis_pal_min_reqs Minimal Requirements
\details
To access the peripheral registers and related function in a device, the files <b><i>device.h</i></b> and <b>core_cm<i>#</i>.h</b> define as a minimum:
\n\n
- The <b>Register Layout Typedef</b> for each peripheral that defines all register names.
RESERVED is used to introduce space into the structure for adjusting the addresses of
the peripheral registers.
\n\n
<b>Example:</b>
\code
typedef struct
{
__IOM uint32_t CTRL; /* Offset: 0x000 (R/W) SysTick Control and Status Register */
__IOM uint32_t LOAD; /* Offset: 0x004 (R/W) SysTick Reload Value Register */
__IOM uint32_t VAL; /* Offset: 0x008 (R/W) SysTick Current Value Register */
__IM uint32_t CALIB; /* Offset: 0x00C (R/ ) SysTick Calibration Register */
} SysTick_Type;
\endcode
- <b>Base Address</b> for each peripheral (in case of multiple peripherals
that use the same <b>register layout typedef</b> multiple base addresses are defined).
\n\n
<b>Example:</b>
\code
#define SysTick_BASE (SCS_BASE + 0x0010) /* SysTick Base Address */
\endcode
- <b>Access Definitions</b> for each peripheral. In case of multiple peripherals that are using the same
<b>register layout typdef</b>, multiple access definitions exist (LPC_UART0, LPC_UART2).
\n\n
<b>Example:</b>
\code
#define SysTick ((SysTick_Type *) Systick_BASE) /* SysTick access definition */
\endcode
These definitions allow accessing peripheral registers with simple assignments.
- <b>Example:</b>
\n
\code
SysTick->CTRL = 0;
\endcode
<hr>
\section core_cmsis_pal_opts Optional Features
\details
Optionally, the file <b><i>device</i>.h</b> may define:
- \ref core_cmsis_pal_bitfields and \#define constants that simplify access to peripheral registers.
These constants may define bit-positions or other specific patterns that are required for
programming peripheral registers. The identifiers should start with
<b>&lt;<i>device abbreviation</i>&gt;_</b> and <b>&lt;<i>peripheral name</i>&gt;_</b>.
It is recommended to use CAPITAL letters for \#define constants.
- More complex functions (i.e. status query before
a sending register is accessed). Again, these functions start with
<b>&lt;<i>device abbreviation</i>&gt;_</b> and <b>&lt;<i>peripheral name</i>&gt;_</b>.
<hr>
\section core_cmsis_pal_bitfields Register Bit Fields
\details
For Core Register, macros define the position and the mask value for a bit field. It is recommended to create such definitions also
for other peripheral registers.
<b>Example:</b>
Bit field definitions for register CPUID in SCB (System Control Block).
\code
/* SCB CPUID Register Definitions */
#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */
#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */
#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */
#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */
#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */
#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */
#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */
#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */
#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */
#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */
\endcode
The macros <b>_VAL2FLD(field, value)</b> and <b>_FLD2VAL(field, value)</b> enable access to bit fields.
@{
*/
/**
\def _VAL2FLD(field, value)
\param field name of bit field.
\param value value for the bit field. This parameter is interpreted as an uint32_t type.
\brief Mask and shift a bit field value for assigning the result to a peripheral register.
\details
The macro \ref _VAL2FLD uses the \#define's <i>_Pos</i> and <i>_Msk</i> of the related bit field to shift bit-field values for
assigning to a register.
<b>Example:</b>
\code
SCB->CPUID = _VAL2FLD(SCB_CPUID_REVISION, 0x3) | _VAL2FLD(SCB_CPUID_VARIANT, 0x3);
\endcode
*/
#define _VAL2FLD(field, value)
/**
\def _FLD2VAL(field, value)
\param field name of bit field.
\param value value of the register. This parameter is interpreted as an uint32_t type.
\brief Extract from a peripheral register value the a bit field value.
\details
The macro \ref _FLD2VAL uses the \#define's <i>_Pos</i> and <i>_Msk</i> of the related bit field to extract the value of a bit field from a register.
<b>Example:</b>
\code
id = _FLD2VAL(SCB_CPUID_REVISION, SCB->CPUID);
\endcode
*/
#define _FLD2VAL(field, value)
/**
@}
*/

View File

@ -1,95 +0,0 @@
/* ################################ System and Clock Configuration ########################### */
/**************************************************************************************************/
/**
\defgroup system_init_gr System and Clock Configuration
\brief Functions for system and clock setup available in system_<i>device</i>.c.
\details
Arm provides a template file <b>system_<i>device</i>.c</b> that must be adapted by
the silicon vendor to match their actual device. As a <b>minimum requirement</b>,
this file must provide:
- A device-specific system configuration function, \ref SystemInit().
- A global variable that contains the system frequency, \ref SystemCoreClock.
The file configures the device and, typically, initializes the oscillator (PLL) that is part
of the microcontroller device. This file might export other functions or variables that provide
a more flexible configuration of the microcontroller system.
\note Please pay special attention to the static variable \c SystemCoreClock. This variable might be
used throughout the whole system initialization and runtime to calculate frequency/time related values.
Thus one must assure that the variable always reflects the actual system clock speed. Be aware that
a value stored to \c SystemCoreClock during low level initialization (i.e. \c SystemInit()) might get
overwritten by C library startup code and/or .bss section initialization.
Thus its highly recommended to call \ref SystemCoreClockUpdate at the beginning of the user \c main() routine.
\section system_init_code_ex_sec Code Example
The code below shows the usage of the variable \ref SystemCoreClock and the functions
SystemInit() and SystemCoreClockUpdate() with an LPC1700.
\code
#include "LPC17xx.h"
uint32_t coreClock_1 = 0; /* Variables to store core clock values */
uint32_t coreClock_2 = 0;
int main (void) {
coreClock_1 = SystemCoreClock; /* Store value of predefined SystemCoreClock */
SystemCoreClockUpdate(); /* Update SystemCoreClock according to register settings */
coreClock_2 = SystemCoreClock; /* Store value of calculated SystemCoreClock */
if (coreClock_2 != coreClock_1) { /* Without changing the clock setting both core clock values should be the same */
// Error Handling
}
while(1);
}
\endcode
@{
*/
/**************************************************************************************************/
/**
\brief Variable to hold the system core clock value
\details
Holds the system core clock, which is the system clock frequency supplied to the SysTick
timer and the processor core clock. This variable can be used by debuggers to query the
frequency of the debug timer or to configure the trace clock speed.
\attention Compilers must be configured to avoid removing this variable in case the application
program is not using it. Debugging systems require the variable to be physically
present in memory so that it can be examined to configure the debugger.
*/
uint32_t SystemCoreClock;
/**************************************************************************************************/
/**
\brief Function to Initialize the system.
\details
Initializes the microcontroller system. Typically, this function configures the
oscillator (PLL) that is part of the microcontroller device. For systems
with a variable clock speed, it updates the variable \ref SystemCoreClock.
SystemInit is called from the file <b>startup<i>_device</i></b>.
*/
void SystemInit (void);
/**************************************************************************************************/
/**
\brief Function to update the variable \ref SystemCoreClock
\details
Updates the variable \ref SystemCoreClock and must be called whenever the core clock is changed
during program execution. The function evaluates the clock register settings and calculates
the current core clock.
*/
void SystemCoreClockUpdate (void);
/** @} */ /* end group system_init_gr */

View File

@ -1,60 +0,0 @@
/* ################################## SysTick function ###################################### */
/**
\defgroup SysTick_gr Systick Timer (SYSTICK)
\brief Initialize and start the SysTick timer.
\details
The System Tick Time (SysTick) generates interrupt requests on a regular basis.
This allows an OS to carry out context switching to support multiple tasking. For applications
that do not require an OS, the SysTick can be used for time keeping, time measurement, or as an
interrupt source for tasks that need to be executed regularly.
\section SysTick_code_ex_sec Code Example
The code below shows the usage of the function SysTick_Config() with an LPC1700.
\code
#include "LPC17xx.h"
volatile uint32_t msTicks = 0; /* Variable to store millisecond ticks */
void SysTick_Handler(void) { /* SysTick interrupt Handler. */
msTicks++; /* See startup file startup_LPC17xx.s for SysTick vector */
}
int main (void) {
uint32_t returnCode;
returnCode = SysTick_Config(SystemCoreClock / 1000); /* Configure SysTick to generate an interrupt every millisecond */
if (returnCode != 0) { /* Check return code for errors */
// Error Handling
}
while(1);
}
\endcode
@{
*/
/**************************************************************************************************/
/** \brief System Tick Timer Configuration
\details
Initialises and starts the System Tick Timer and its interrupt.
After this call, the SysTick timer creates interrupts with the specified time interval.
Counter is in free running mode to generate periodical interrupts.
\param [in] ticks Number of ticks between two interrupts
\returns 0 - success
\returns 1 - failure
\note
When \ref __Vendor_SysTickConfig is defined to 1, the standard function <b>SysTick_Config</b>
is excluded. In this case, the \ref device_h_pg must contain a vendor specific implementation
of this function.
*/
uint32_t SysTick_Config(uint32_t ticks);
/** @} */

View File

@ -1,493 +0,0 @@
/**
\cond (ARMv8M)
*/
/**
\defgroup trustzone_functions TrustZone for Armv8-M/v8.1-M
\brief Functions that related to optional Armv8-M and Armv8.1-M security extension
@{
\details
The Armv8-M architecture has optional Armv8-M security extension based on Arm TrustZone technology.
To access Arm TrustZone extensions for Armv8-M additional CMSIS functions are provided:
- \ref coreregister_trustzone_functions
- \ref nvic_trustzone_functions
- \ref systick_trustzone_functions
- \ref sau_trustzone_functions
- \ref stacksealing_support_trustzone_functions
- \ref context_trustzone_functions
*/
/**
\defgroup coreregister_trustzone_functions Core Register Access Functions
\brief Core register Access functions related to TrustZone for Armv8-M.
@{
*/
/**
\brief Get Control register (non-secure)
\details Returns the content of the non-secure Control register when in secure mode.
\return non-secure Control register value
\sa
- \ref __get_CONTROL; CONTROL_Type
*/
uint32_t __TZ_get_CONTROL_NS(void);
/**
\brief Set Control register (non-secure)
\details Writes the given value to the non-secure Control register when in secure state.
\param [in] control Control register value to set
\sa
- \ref __set_CONTROL; CONTROL_Type
*/
void __TZ_set_CONTROL_NS(uint32_t control);
/**
\brief Get Process Stack Pointer (non-secure)
\details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state.
\return PSP register value
\sa
- \ref __get_PSP
*/
uint32_t __TZ_get_PSP_NS(void);
/**
\brief Set Process Stack Pointer (non-secure)
\details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state.
\param [in] topOfProcStack Process Stack Pointer value to set
\sa
- \ref __set_PSP
*/
void __TZ_set_PSP_NS(uint32_t topOfProcStack);
/**
\brief Get Main Stack Pointer (non-secure)
\details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state.
\return MSP register value
\sa
- \ref __get_MSP
*/
uint32_t __TZ_get_MSP_NS(void);
/**
\brief Set Main Stack Pointer (non-secure)
\details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state.
\param [in] topOfMainStack Main Stack Pointer value to set
\sa
- \ref __set_MSP
*/
void __TZ_set_MSP_NS(uint32_t topOfMainStack);
/**
\brief Get Stack Pointer (non-secure)
\details Returns the current value of the non-secure Stack Pointer (SP) when in secure state.
\return SP register value
*/
uint32_t __TZ_get_SP_NS(void);
/**
\brief Set Stack Pointer (non-secure)
\details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state.
\param [in] topOfStack Stack Pointer value to set
*/
void __TZ_set_SP_NS(uint32_t topOfStack);
/**
\brief Get Priority Mask (non-secure)
\details Returns the current state of the non-secure priority mask bit from the Priority Mask register when in secure state.
\return Priority Mask value
\sa
- \ref __get_PRIMASK
*/
uint32_t __TZ_get_PRIMASK_NS(void);
/**
\brief Set Priority Mask (non-secure)
\details Assigns the given value to the non-secure Priority Mask register when in secure state.
\param [in] priMask Priority Mask
\sa
- \ref __set_PRIMASK
*/
void __TZ_set_PRIMASK_NS(uint32_t priMask);
/**
\brief Get Base Priority (non-secure)
\details Returns the current value of the non-secure Base Priority register when in secure state.
\return Base Priority register value
\sa
- \ref __get_BASEPRI
*/
uint32_t __TZ_get_BASEPRI_NS(void);
/**
\brief Set Base Priority (non-secure)
\details Assigns the given value to the non-secure Base Priority register when in secure state.
\param [in] basePri Base Priority value to set
\sa
- \ref __set_BASEPRI
*/
void __TZ_set_BASEPRI_NS(uint32_t basePri);
/**
\brief Get Fault Mask (non-secure)
\details Returns the current value of the non-secure Fault Mask register when in secure state.
\return Fault Mask register value
\sa
- \ref __get_FAULTMASK
*/
uint32_t __TZ_get_FAULTMASK_NS(void);
/**
\brief Set Fault Mask (non-secure)
\details Assigns the given value to the non-secure Fault Mask register when in secure state.
\param [in] faultMask Fault Mask value to set
\sa
- \ref __set_FAULTMASK
*/
void __TZ_set_FAULTMASK_NS(uint32_t faultMask);
/**
\brief Get Process Stack Pointer Limit (non-secure)
Devices without Armv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
Stack Pointer Limit register hence zero is returned always.
\details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state.
\return PSPLIM register value
*/
uint32_t __TZ_get_PSPLIM_NS(void);
/**
\brief Set Process Stack Pointer (non-secure)
Devices without Armv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
Stack Pointer Limit register hence zero is returned always.
\details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state.
\param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set
*/
void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit);
/**
\brief Get Main Stack Pointer Limit (non-secure)
Devices without Armv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
Stack Pointer Limit register hence zero is returned always.
\details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state.
\return MSPLIM register value
*/
uint32_t __TZ_get_MSPLIM_NS(void);
/**
\brief Set Main Stack Pointer Limit (non-secure)
Devices without Armv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
Stack Pointer Limit register hence zero is returned always.
\details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state.
\param [in] MainStackPtrLimit Main Stack Pointer value to set
*/
void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit);
/** close coreregister_trustzone_functions
@}
*/
/**
\defgroup nvic_trustzone_functions NVIC Functions
\brief Nested Vector Interrupt Controller (NVIC) functions related to TrustZone for Armv8-M
@{
*/
/**
\brief Set Priority Grouping (non-secure)
\details Sets the non-secure priority grouping field when in secure state using the required unlock sequence.
The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field.
Only values from 0..7 are used.
In case of a conflict between priority grouping and available
priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.
\param [in] PriorityGroup Priority grouping field.
\note Only available for Armv8-M Mainline.
\sa
- \ref NVIC_SetPriorityGrouping
*/
void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup);
/**
\brief Get Priority Grouping (non-secure)
\details Reads the priority grouping field from the non-secure NVIC when in secure state.
\return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).
\note Only available for Armv8-M Mainline.
\sa
- \ref NVIC_GetPriorityGrouping
*/
uint32_t TZ_NVIC_GetPriorityGrouping_NS(void);
/**
\brief Enable External Interrupt (non-secure)
\details Enables a device-specific interrupt in the non-secure NVIC when in secure state.
\param [in] IRQn External interrupt number. Value cannot be negative.
\sa
- \ref NVIC_EnableIRQ
*/
void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn);
/**
\brief Get Interrupt Enable status (non-secure)
\details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state.
\param [in] IRQn Interrupt number.
\return 0 Interrupt is not enabled.
\return 1 Interrupt is enabled.
\sa
- \ref NVIC_EnableIRQ; NVIC_DisableIRQ;
*/
uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn);
/**
\brief Disable External Interrupt (non-secure)
\details Disables a device-specific interrupt in the non-secure NVIC when in secure state.
\param [in] IRQn External interrupt number. Value cannot be negative.
\sa
- \ref NVIC_DisableIRQ
*/
void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn);
/**
\brief Get Pending Interrupt (non-secure)
\details Reads the pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified interrupt.
\param [in] IRQn Interrupt number.
\return 0 Interrupt status is not pending.
\return 1 Interrupt status is pending.
\sa
- \ref NVIC_GetPendingIRQ
*/
uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn);
/**
\brief Set Pending Interrupt (non-secure)
\details Sets the pending bit of an non-secure external interrupt when in secure state.
\param [in] IRQn Interrupt number. Value cannot be negative.
\sa
- \ref NVIC_SetPendingIRQ
*/
void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn);
/**
\brief Clear Pending Interrupt (non-secure)
\details Clears the pending bit of an non-secure external interrupt when in secure state.
\param [in] IRQn External interrupt number. Value cannot be negative.
\sa
- \ref NVIC_ClearPendingIRQ
*/
void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn);
/**
\brief Get Active Interrupt (non-secure)
\details Reads the active register in non-secure NVIC when in secure state and returns the active bit.
\param [in] IRQn Interrupt number.
\return 0 Interrupt status is not active.
\return 1 Interrupt status is active.
\sa
- \ref NVIC_GetActive
*/
uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn);
/**
\brief Set Interrupt Priority (non-secure)
\details Sets the priority of an non-secure interrupt when in secure state.
\note The priority cannot be set for every core interrupt.
\param [in] IRQn Interrupt number.
\param [in] priority Priority to set.
\sa
- \ref NVIC_SetPriority
*/
void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority);
/**
\brief Get Interrupt Priority (non-secure)
\details Reads the priority of an non-secure interrupt when in secure state.
The interrupt number can be positive to specify an external (device specific) interrupt,
or negative to specify an internal (core) interrupt.
\param [in] IRQn Interrupt number.
\return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller.
\sa
- \ref NVIC_GetPriority
*/
uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn);
/** close nvic_trustzone_functions
@}
*/
/**
\defgroup systick_trustzone_functions SysTick Functions
\brief SysTick functions related to TrustZone for Armv8-M.
@{
*/
/**
\brief System Tick Configuration (non-secure)
\details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer.
Counter is in free running mode to generate periodic interrupts.
\param [in] ticks Number of ticks between two interrupts.
\return 0 Function succeeded.
\return 1 Function failed.
\note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
function <b>TZ_SysTick_Config_NS</b> is not included. In this case, the file <b><i>device</i>.h</b>
must contain a vendor-specific implementation of this function.
\sa
- \ref SysTick_Config
*/
uint32_t TZ_SysTick_Config_NS(uint32_t ticks);
/** close systick_trustzone_functions
@}
*/
/**
\defgroup sau_trustzone_functions SAU Functions
\brief Secure Attribution Unit (SAU) functions related to TrustZone for Armv8-M.
@{
\details
The Secure Attribution Unit (SAU) functions SAU
\note
A SAU is always present if the security extension is available.
The functionality differs if the SAU contains SAU regions.
If SAU regions are available is configured with the macro __SAUREGION_PRESENT (see \ref core_config_sect).
*/
/**
\brief Setup Secure Attribute Unit (SAU) and non-secure interrupts
\details
The function \ref TZ_SAU_Setup uses the settings in the \ref partition_h_pg to initialize
the Secure Attribute Unit (SAU) and define non-secure interrupts. It is called from
the function \ref SystemInit.
*/
void TZ_SAU_Setup (void);
/**
\brief Enable Security Attribution Unit (SAU)
\details Enables the Security Attribution Unit (SAU).
*/
void TZ_SAU_Enable(void);
/**
\brief Disable Security Attribution Unit (SAU)
\details Disables the Security Attribution Unit (SAU).
*/
void TZ_SAU_Disable(void);
/** close sau_trustzone_functions
@}
*/
/**
\defgroup stacksealing_support_trustzone_functions Stack Sealing Support Functions
\brief Stack sealing macros and helper functions.
@{
\details
See \ref RTOS_TrustZone_stacksealing for details on stack sealing technique.
*/
/**
\brief Set stack seal at given address (secure)
\details Writes the stack seal values (2 x 0xFEF5EDA5U) to the given address when in secure state.
\param [in] stackTop address to write stackseal
*/
void __TZ_set_STACKSEAL_S (uint32_t *stackTop);
/**
\def __STACK_SEAL
\brief Compiler/linker symbol specifying the location of the stack seal.
\details
The address of the specified symbol is used to set the stack seal during low level init.
This is compiler/linker specific. CMSIS specifies common default for supported compilers.
\note This define is only intended to be used by the \ref startup_c_pg.
*/
#define __STACK_SEAL
/** close stacksealing_support_trustzone_functions
@}
*/
/**
\defgroup context_trustzone_functions RTOS Context Management
\brief RTOS Thread Context Management for Armv8-M TrustZone.
@{
\details The CMSIS-Core provides the file <b>tz_context.h</b> which defines an API to standardize the context memory system for real-time operating systems. For more information refer to \ref RTOS_TrustZone.
*/
/**
\brief Initialize secure context memory system
\details Initializes the memory allocation management for the secure memory regions. As a minimum the secure thread mode stack will be provided.
\return execution status (1: success, 0: error)
*/
uint32_t TZ_InitContextSystem_S (void);
/**
\brief Allocate context memory for calling secure software modules in TrustZone
\details
Allocates the secure memory regions for thread execution. The parameter \em module describes
the set of secure functions that are called by the non-secure thread.
Set \em module to zero if no secure calls are used/allowed. This leads to no secure memory to be assigned
which results in zero being returned as memory id as well.
This function should be called by an RTOS kernel at the start of a thread.
\param[in] module A non-zero value identifies software modules called from non-secure mode. zero is used if no secure calls are used/allowed.
\return value != 0 id TrustZone memory slot identify
\return value 0 no memory available or internal error
*/
TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module);
/**
\brief Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S
\details
De-allocates the secure memory regions.
The parameter \em id refers to a TrustZone memory slot that has been obtained with \ref TZ_AllocModuleContext_S.
This function should be called by an RTOS kernel at the termination of a thread.
\param[in] id TrustZone memory slot identifier
\return execution status (1: success, 0: error)
*/
uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id);
/**
\brief Load secure context (called on RTOS thread context switch)
\details
Prepare the secure context for execution so that a thread in the non-secure state can
call secure library modules. The parameter \em id refers to a TrustZone memory slot that has been
obtained with \ref TZ_AllocModuleContext_S which might be zero if not used.
This function should be called by an RTOS kernel at thread context switch before running a thread.
\param[in] id TrustZone memory slot identifier
\return execution status (1: success, 0: error)
*/
uint32_t TZ_LoadContext_S (TZ_MemoryId_t id);
/**
\brief Store secure context (called on RTOS thread context switch)
\details
Free the secure context that has been previously loaded with \ref TZ_LoadContext_S. The parameter
\em id refers to a TrustZone memory slot that has been obtained with \ref TZ_AllocModuleContext_S
which might be zero if not used.
This function should be called by an RTOS kernel at thread context switch after running a thread.
\param[in] id TrustZone memory slot identifier
\return execution status (1: success, 0: error)
*/
uint32_t TZ_StoreContext_S (TZ_MemoryId_t id);
/** close context_trustzone_functions
@}
*/
/** close trustzone_functions
@}
*/
/**
\endcond
*/

View File

@ -1,131 +0,0 @@
/**************************************************************************************************/
/**
\defgroup version_control_gr Version Control
\brief Version \#define symbols for CMSIS release specific C/C++ source code
\details
The header file <b>cmsis_version.h</b> is included by each core header so that these definitions are available.
<b>Code Example:</b>
\code
#if defined(__CM_CMSIS_VERSION) && \
(__CM_CMSIS_VERSION >= 0x00050001)
#error Yes, we have CMSIS 5.1 or later
#else
#error We need CMSIS 5.1 or later!
#endif
\endcode
<b>Deprecated</b>
The following macros are deprecated:
- \b __XXX_CMSIS_VERSION_MAIN which is replaced by \ref __CM_CMSIS_VERSION_MAIN.
- \b __XXX_CMSIS_VERSION_SUB which is replaced by \ref __CM_CMSIS_VERSION_SUB.
- \b __XXX_CMSIS_VERSION which is replaced by \ref __CM_CMSIS_VERSION.
@{
*/
/**
\brief Contains the CMSIS major version
\details The CMSIS major version can be used to differentiate between CMSIS major releases.
*/
#define __CM_CMSIS_VERSION_MAIN
/**
\brief Contains the CMSIS minor version
\details The CMSIS minor version can be used to query a CMSIS release update level.
*/
#define __CM_CMSIS_VERSION_SUB
/**
\brief Contains the CMSIS version
\details The CMSIS version is a combination of the \ref __CM_CMSIS_VERSION_MAIN (bits 31..15) and \ref __CM_CMSIS_VERSION_SUB (bits 14..0).
*/
#define __CM_CMSIS_VERSION
/**
\brief Contains the core version for a Cortex-M class controller.
\details This define can be used to differentiate between the various available Cortex-M controllers.
Possible values are:
- 0 for a Cortex-M0 or Cortex-M0+
- 1 for a Cortex-M1
- 3 for a Cortex-M3
- 4 for a Cortex-M4
- 7 for a Cortex-M7
\if ARMv8M
- 23 for a Cortex-M23
- 33 for a Cortex-M33
- 35 for a Cortex-M35P
- 55 for a Cortex-M55
- 85 for a Cortex-M85
- 2 for a Armv8-M Base Line device
- 80 for a Armv8-M Main Line device
- 81 for a Armv8.1-M Main Line device
\endif
This define is only available for Cortex-M class controllers.
<b>Code Example:</b>
\code
#if defined(__CORTEX_M) && (__CORTEX_M == 4)
#error Yes, we have an Cortex-M4 controller.
#else
#error We need a Cortex-M4 controller!
#endif
\endcode
*/
#define __CORTEX_M
/**
\cond (ARMSC)
*/
/**
\brief Contains the core version for a Cortex Secure Core controller.
\details This define can be used to differentiate between the various available Cortex Secure Core controllers.
Possible values are:
- 000 for a Cortex-SC000
- 300 for a Cortex-SC300
This define is only available for Cortex Secure Core controllers.
<b>Code Example:</b>
\code
#if defined(__CORTEX_SC) && (__CORTEX_SC == 300U)
#error Yes, we have an Cortex SC300 controller.
#else
#error We need a Cortex SC300 controller!
#endif
\endcode
*/
#define __CORTEX_SC
/**
\endcond
*/
/**
\cond (STAR)
*/
/**
\brief Contains the core version for a STAR-MC controller.
\details This define can be used to differentiate between the various available STAR-MC controllers.
Possible values are:
- 1 for a STAR-MC1
This define is only available for STAR-MC controllers.
<b>Code Example:</b>
\code
#if defined(__STAR_MC) && (__STAR_MC == 1U)
#error Yes, we have a STAR-MC1 controller.
#else
#error We need a STAR-MC1 controller!
#endif
\endcode
*/
#define __STAR_MC
/**
\endcond
*/
/**
@}
*/

File diff suppressed because it is too large Load Diff

View File

@ -1,485 +0,0 @@
/**
\defgroup intrinsic_CPU_gr Intrinsic Functions for CPU Instructions
@{
\brief Functions that generate specific Cortex-M CPU Instructions.
\details
The following functions generate specific Cortex-M instructions that cannot be directly accessed by the C/C++ Compiler.
Refer to the \ref ref_man_sec for detailed information about these Cortex-M instructions.
\note
When using the <b>Arm Compiler Version 5 Toolchain</b> the following \ref intrinsic_CPU_gr are implemented using the Embedded Assembler.
As the Embedded Assembler may cause side effects (Refer to <b>Arm Compiler v5.xx User Guide - Using the Inline and Embedded Assemblers of the Arm Compiler</b> for more information)
it is possible to disable the following intrinsic functions and therefore the usage of the Embedded Assembler with the <b><i>define __NO_EMBEDDED_ASM</i></b>:
- \ref __REV16
- \ref __REVSH
- \ref __RRX
*/
/**************************************************************************************************/
/** \brief No Operation
This function does nothing. This instruction can be used for code alignment purposes.
*/
void __NOP(void);
/**************************************************************************************************/
/** \brief Wait For Interrupt
WFI is a hint instruction that suspends execution until one of the following events occurs:
- A non-masked interrupt occurs and is taken.
- An interrupt masked by PRIMASK becomes pending.
- A Debug Entry request.
*/
void __WFI(void);
/**************************************************************************************************/
/** \brief Wait For Event
Wait For Event is a hint instruction that permits the processor to enter
a low-power state until an events occurs:
\li If the <b>event register is 0</b>, then WFE suspends execution until one of the following events occurs:
- An exception, unless masked by the exception mask registers or the current priority level.
- An exception enters the Pending state, if SEVONPEND in the System Control Register is set.
- A Debug Entry request, if Debug is enabled.
- An event signaled by a peripheral or another processor in a multiprocessor system using
the SEV instruction.
\li If the <b>event register is 1</b>, then WFE clears it to 0 and returns immediately.
*/
void __WFE(void);
/**************************************************************************************************/
/** \brief Send Event
Send Event is a hint instruction. It causes an event to be signaled to the CPU.
*/
void __SEV(void);
/**************************************************************************************************/
/** \brief Set Breakpoint
This function causes the processor to enter Debug state.
Debug tools can use this to investigate system state when the instruction at a particular address is reached.
\param [in] value is ignored by the processor. If required, a debugger can use it to obtain additional information about the breakpoint.
*/
void __BKPT(uint8_t value);
/**************************************************************************************************/
/** \brief Instruction Synchronization Barrier
Instruction Synchronization Barrier flushes the pipeline in the processor,
so that all instructions following the ISB are fetched from cache or
memory, after the instruction has been completed.
*/
void __ISB(void);
/**************************************************************************************************/
/** \brief Data Synchronization Barrier
\details
This function acts as a special kind of Data Memory Barrier.
It completes when all explicit memory accesses before this instruction complete.
*/
void __DSB(void);
/**************************************************************************************************/
/** \brief Data Memory Barrier
\details
This function ensures the apparent order of the explicit memory operations before
and after the instruction, without ensuring their completion.
*/
void __DMB(void);
/**************************************************************************************************/
/**
\brief Reverse byte order (32 bit)
\details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412.
\param [in] value Value to reverse
\return Reversed value
*/
uint32_t __REV(uint32_t value);
/**************************************************************************************************/
/**
\brief Reverse byte order (16 bit)
\details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856.
\param [in] value Value to reverse
\return Reversed value
*/
uint32_t __REV16(uint32_t value);
/**************************************************************************************************/
/**
\brief Reverse byte order (16 bit)
\details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000.
\param [in] value Value to reverse
\return Reversed value
*/
int16_t __REVSH(int16_t value);
/**************************************************************************************************/
/**
\brief Reverse bit order of value
\param [in] value Value to reverse
\return Reversed value
*/
uint32_t __RBIT(uint32_t value);
/**************************************************************************************************/
/** \brief Rotate a value right by a number of bits
This function rotates a value right by a specified number of bits.
\param [in] value Value to be shifted right
\param [in] shift Number of bits in the range [1..31]
\return Rotated value
*/
uint32_t __ROR(uint32_t value, uint32_t shift);
/**************************************************************************************************/
/** \brief LDR Exclusive (8 bit) [not for Cortex-M0, Cortex-M0+, or SC000]
This function executed an exclusive LDR command for 8 bit value [not for Cortex-M0, Cortex-M0+, or SC000].
\param [in] *addr Pointer to data
\return value of type uint8_t at (*addr)
*/
uint8_t __LDREXB(volatile uint8_t *addr);
/**************************************************************************************************/
/** \brief LDR Exclusive (16 bit) [not for Cortex-M0, Cortex-M0+, or SC000]
This function executed an exclusive LDR command for 16 bit values [not for Cortex-M0, Cortex-M0+, or SC000].
\param [in] *addr Pointer to data
\return value of type uint16_t at (*addr)
*/
uint16_t __LDREXH(volatile uint16_t *addr);
/**************************************************************************************************/
/** \brief LDR Exclusive (32 bit) [not for Cortex-M0, Cortex-M0+, or SC000]
This function executed an exclusive LDR command for 32 bit values [not for Cortex-M0, Cortex-M0+, or SC000].
\param [in] *addr Pointer to data
\return value of type uint32_t at (*addr)
*/
uint32_t __LDREXW(volatile uint32_t *addr);
/**************************************************************************************************/
/** \brief STR Exclusive (8 bit) [not for Cortex-M0, Cortex-M0+, or SC000]
This function executed an exclusive STR command for 8 bit values [not for Cortex-M0, Cortex-M0+, or SC000].
\param [in] value Value to store
\param [in] *addr Pointer to location
\return 0 Function succeeded
\return 1 Function failed
*/
uint32_t __STREXB(uint8_t value, volatile uint8_t *addr);
/**************************************************************************************************/
/** \brief STR Exclusive (16 bit) [not for Cortex-M0, Cortex-M0+, or SC000]
This function executed an exclusive STR command for 16 bit values [not for Cortex-M0, Cortex-M0+, or SC000].
\param [in] value Value to store
\param [in] *addr Pointer to location
\return 0 Function succeeded
\return 1 Function failed
*/
uint32_t __STREXH(uint16_t value, volatile uint16_t *addr);
/**************************************************************************************************/
/** \brief STR Exclusive (32 bit) [not for Cortex-M0, Cortex-M0+, or SC000]
This function executed an exclusive STR command for 32 bit values [not for Cortex-M0, Cortex-M0+, or SC000].
\param [in] value Value to store
\param [in] *addr Pointer to location
\return 0 Function succeeded
\return 1 Function failed
*/
uint32_t __STREXW(uint32_t value, volatile uint32_t *addr);
/**************************************************************************************************/
/** \brief Remove the exclusive lock [not for Cortex-M0, Cortex-M0+, or SC000]
This function removes the exclusive lock which is created by LDREX [not for Cortex-M0, Cortex-M0+, or SC000].
*/
void __CLREX(void);
/**************************************************************************************************/
/** \brief Signed Saturate
This function saturates a signed value.
The Q bit is set if saturation occurs [not for Cortex-M0, Cortex-M0+, or SC000].
On Armv6-M (Cortex-M0, Cortex-M0+, and SC000) this function is not available as a core instruction
instruction and thus __SSAT is implemented in software.
\param [in] value Value to be saturated
\param [in] sat Bit position to saturate to [1..32]
\return Saturated value
*/
int32_t __SSAT(int32_t value, uint32_t sat);
/**************************************************************************************************/
/** \brief Unsigned Saturate
This function saturates an unsigned value.
The Q bit is set if saturation occurs [not for Cortex-M0, Cortex-M0+, or SC000].
On Armv6-M (Cortex-M0, Cortex-M0+, and SC000) this function is not available as a core instruction
instruction and thus __USAT is implemented in software.
\param [in] value Value to be saturated
\param [in] sat Bit position to saturate to [0..31]
\return Saturated value
*/
uint32_t __USAT(int32_t value, uint32_t sat);
/**************************************************************************************************/
/** \brief Count leading zeros
This function counts the number of leading zeros of a data value.
On Armv6-M (Cortex-M0, Cortex-M0+, and SC000) this function is not available as a core instruction
instruction and thus __CLZ is implemented in software.
\param [in] value Value to count the leading zeros
\return number of leading zeros in value
*/
uint8_t __CLZ(uint32_t value);
/**************************************************************************************************/
/** \brief Rotate Right with Extend (32 bit)
This function moves each bit of a bitstring right by one bit. The carry input is shifted in at the left end of the bitstring.
\param [in] value Value to rotate
\return Rotated value
*/
uint32_t __RRX(uint32_t value);
/**************************************************************************************************/
/** \brief LDRT Unprivileged (8 bit)
This function executed an Unprivileged LDRT command for 8 bit value.
\param [in] ptr Pointer to data
\return value of type uint8_t at (*ptr)
*/
uint8_t __LDRBT(uint8_t ptr);
/**************************************************************************************************/
/** \brief LDRT Unprivileged (16 bit)
This function executed an Unprivileged LDRT command for 16 bit values.
\param [in] ptr Pointer to data
\return value of type uint16_t at (*ptr)
*/
uint16_t __LDRHT(uint16_t ptr);
/**************************************************************************************************/
/** \brief LDRT Unprivileged (32 bit)
This function executed an Unprivileged LDRT command for 32 bit values.
\param [in] ptr Pointer to data
\return value of type uint32_t at (*ptr)
*/
uint32_t __LDRT(uint32_t ptr);
/**************************************************************************************************/
/** \brief STRT Unprivileged (8 bit)
This function executed an Unprivileged STRT command for 8 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
*/
void __STRBT(uint8_t value, uint8_t ptr);
/**************************************************************************************************/
/** \brief STRT Unprivileged (16 bit)
This function executed an Unprivileged STRT command for 16 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
*/
void __STRHT(uint16_t value, uint16_t ptr);
/**************************************************************************************************/
/** \brief STRT Unprivileged (32 bit)
This function executed an Unprivileged STRT command for 32 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
*/
void __STRT(uint32_t value, uint32_t ptr);
/**
\cond (ARMv8M)
*/
/**
\brief Load-Acquire (8 bit)
\details Executes a LDAB instruction for 8 bit value.
\param [in] ptr Pointer to data
\return value of type uint8_t at (*ptr)
\note Only available for Armv8-M Architecture.
*/
uint8_t __LDAB(volatile uint8_t *ptr);
/**
\brief Load-Acquire (16 bit)
\details Executes a LDAH instruction for 16 bit values.
\param [in] ptr Pointer to data
\return value of type uint16_t at (*ptr)
\note Only available for Armv8-M Architecture.
*/
uint16_t __LDAH(volatile uint16_t *ptr);
/**
\brief Load-Acquire (32 bit)
\details Executes a LDA instruction for 32 bit values.
\param [in] ptr Pointer to data
\return value of type uint32_t at (*ptr)
\note Only available for Armv8-M Architecture.
*/
uint32_t __LDA(volatile uint32_t *ptr);
/**
\brief Store-Release (8 bit)
\details Executes a STLB instruction for 8 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
\note Only available for Armv8-M Architecture.
*/
void __STLB(uint8_t value, volatile uint8_t *ptr);
/**
\brief Store-Release (16 bit)
\details Executes a STLH instruction for 16 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
\note Only available for Armv8-M Architecture.
*/
void __STLH(uint16_t value, volatile uint16_t *ptr);
/**
\brief Store-Release (32 bit)
\details Executes a STL instruction for 32 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
\note Only available for Armv8-M Architecture.
*/
void __STL(uint32_t value, volatile uint32_t *ptr);
/**
\brief Load-Acquire Exclusive (8 bit)
\details Executes a LDAB exclusive instruction for 8 bit value.
\param [in] ptr Pointer to data
\return value of type uint8_t at (*ptr)
\note Only available for Armv8-M Architecture.
*/
uint8_t __LDAEXB(volatile uint32_t *ptr);
/**
\brief Load-Acquire Exclusive (16 bit)
\details Executes a LDAH exclusive instruction for 16 bit values.
\param [in] ptr Pointer to data
\return value of type uint16_t at (*ptr)
\note Only available for Armv8-M Architecture.
*/
uint16_t __LDAEXH(volatile uint32_t *ptr);
/**
\brief Load-Acquire Exclusive (32 bit)
\details Executes a LDA exclusive instruction for 32 bit values.
\param [in] ptr Pointer to data
\return value of type uint32_t at (*ptr)
\note Only available for Armv8-M Architecture.
*/
uint32_t __LDAEX(volatile uint32_t *ptr);
/**
\brief Store-Release Exclusive (8 bit)
\details Executes a STLB exclusive instruction for 8 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
\return 0 Function succeeded
\return 1 Function failed
\note Only available for Armv8-M Architecture.
*/
uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr);
/**
\brief Store-Release Exclusive (16 bit)
\details Executes a STLH exclusive instruction for 16 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
\return 0 Function succeeded
\return 1 Function failed
\note Only available for Armv8-M Architecture.
*/
uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr);
/**
\brief Store-Release Exclusive (32 bit)
\details Executes a STL exclusive instruction for 32 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
\return 0 Function succeeded
\return 1 Function failed
\note Only available for Armv8-M Architecture.
*/
uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr);
/**
\endcond
*/
/*@}*/ /* end of group Intrisic_CPU */

Some files were not shown because too many files have changed in this diff Show More