clean ups
2964
external/CMSIS_5/ARM.CMSIS.pdsc
vendored
5
external/CMSIS_5/CMSIS/DSP/README.md
vendored
@ -1,5 +0,0 @@
|
||||
# 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).
|
Before Width: | Height: | Size: 68 KiB |
Before Width: | Height: | Size: 5.7 KiB |
@ -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>
|
BIN
external/CMSIS_5/CMSIS/DoxyGen/Build/html/bc_s.png
vendored
Before Width: | Height: | Size: 676 B |
BIN
external/CMSIS_5/CMSIS/DoxyGen/Build/html/bdwn.png
vendored
Before Width: | Height: | Size: 147 B |
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
BIN
external/CMSIS_5/CMSIS/DoxyGen/Build/html/closed.png
vendored
Before Width: | Height: | Size: 132 B |
@ -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>
|
1282
external/CMSIS_5/CMSIS/DoxyGen/Build/html/cmsis.css
vendored
@ -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.');
|
||||
};
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
1366
external/CMSIS_5/CMSIS/DoxyGen/Build/html/doxygen.css
vendored
Before Width: | Height: | Size: 3.7 KiB |
@ -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');
|
||||
}
|
||||
}
|
||||
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
Before Width: | Height: | Size: 86 B |
BIN
external/CMSIS_5/CMSIS/DoxyGen/Build/html/ftv2cl.png
vendored
Before Width: | Height: | Size: 453 B |
Before Width: | Height: | Size: 746 B |
Before Width: | Height: | Size: 616 B |
Before Width: | Height: | Size: 597 B |
Before Width: | Height: | Size: 86 B |
Before Width: | Height: | Size: 746 B |
Before Width: | Height: | Size: 246 B |
Before Width: | Height: | Size: 246 B |
BIN
external/CMSIS_5/CMSIS/DoxyGen/Build/html/ftv2mo.png
vendored
Before Width: | Height: | Size: 403 B |
Before Width: | Height: | Size: 86 B |
BIN
external/CMSIS_5/CMSIS/DoxyGen/Build/html/ftv2ns.png
vendored
Before Width: | Height: | Size: 388 B |
Before Width: | Height: | Size: 229 B |
Before Width: | Height: | Size: 229 B |
Before Width: | Height: | Size: 314 B |
Before Width: | Height: | Size: 86 B |
173
external/CMSIS_5/CMSIS/DoxyGen/Build/html/index.html
vendored
@ -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
|
||||
 <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 Page</span></a></li>
|
||||
<li><a href="pages.html"><span>Usage and 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"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </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>
|
@ -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>
|
BIN
external/CMSIS_5/CMSIS/DoxyGen/Build/html/nav_f.png
vendored
Before Width: | Height: | Size: 153 B |
BIN
external/CMSIS_5/CMSIS/DoxyGen/Build/html/nav_g.png
vendored
Before Width: | Height: | Size: 95 B |
BIN
external/CMSIS_5/CMSIS/DoxyGen/Build/html/nav_h.png
vendored
Before Width: | Height: | Size: 98 B |
@ -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; }
|
||||
}
|
||||
|
527
external/CMSIS_5/CMSIS/DoxyGen/Build/html/navtree.js
vendored
@ -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 = ' ';
|
||||
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);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -1,4 +0,0 @@
|
||||
var NAVTREEINDEX0 =
|
||||
{
|
||||
|
||||
};
|
BIN
external/CMSIS_5/CMSIS/DoxyGen/Build/html/open.png
vendored
Before Width: | Height: | Size: 123 B |
@ -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>
|
@ -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
|
||||
}
|
||||
}
|
||||
};
|
@ -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>
|
@ -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();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 273 B |
Before Width: | Height: | Size: 563 B |
@ -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>
|
@ -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;
|
||||
}
|
@ -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='•';
|
||||
}
|
||||
else
|
||||
{
|
||||
node.innerHTML=' ';
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 604 B |
Before Width: | Height: | Size: 158 B |
Before Width: | Height: | Size: 612 B |
Before Width: | Height: | Size: 853 B |
Before Width: | Height: | Size: 845 B |
BIN
external/CMSIS_5/CMSIS/DoxyGen/Build/html/tab_a.png
vendored
Before Width: | Height: | Size: 142 B |
BIN
external/CMSIS_5/CMSIS/DoxyGen/Build/html/tab_b.png
vendored
Before Width: | Height: | Size: 169 B |
BIN
external/CMSIS_5/CMSIS/DoxyGen/Build/html/tab_h.png
vendored
Before Width: | Height: | Size: 177 B |
BIN
external/CMSIS_5/CMSIS/DoxyGen/Build/html/tab_s.png
vendored
Before Width: | Height: | Size: 184 B |
Before Width: | Height: | Size: 232 B |
@ -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);
|
||||
}
|
2340
external/CMSIS_5/CMSIS/DoxyGen/Core/core.dxy
vendored
2335
external/CMSIS_5/CMSIS/DoxyGen/Core/core_CM0-7.dxy
vendored
@ -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.
|
||||
|
||||
|
||||
|
||||
<device>.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.
|
||||
*/
|
||||
|
457
external/CMSIS_5/CMSIS/DoxyGen/Core/src/Overview.txt
vendored
@ -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® 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_<device>.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>
|
||||
|
||||
*/
|
||||
|
||||
|
@ -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 **/
|
@ -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 **/
|
@ -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;
|
@ -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 --> 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 --> 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);
|
||||
|
||||
/** @} */
|
@ -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);
|
||||
|
||||
/**
|
||||
@}
|
||||
*/
|
||||
|
||||
|
373
external/CMSIS_5/CMSIS/DoxyGen/Core/src/Ref_MPU.txt
vendored
@ -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.
|
||||
|
||||
*/
|
300
external/CMSIS_5/CMSIS/DoxyGen/Core/src/Ref_MPU8.txt
vendored
@ -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);
|
||||
|
||||
/** @} */
|
||||
|
@ -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);
|
||||
|
||||
/**
|
||||
@}
|
||||
*/
|
||||
|
||||
|
836
external/CMSIS_5/CMSIS/DoxyGen/Core/src/Ref_NVIC.txt
vendored
@ -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> </td>
|
||||
<td><img src="check.png" alt="available"></td>
|
||||
\if ARMv8M
|
||||
<td> </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> </td>
|
||||
<td><img src="check.png" alt="available"></td>
|
||||
\if ARMv8M
|
||||
<td> </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> </td>
|
||||
<td><img src="check.png" alt="available"></td>
|
||||
\if ARMv8M
|
||||
<td> </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> </td>
|
||||
<td> </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> </td>
|
||||
<td><img src="check.png" alt="available"></td>
|
||||
\if ARMv8M
|
||||
<td> </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 */
|
||||
|
||||
|
428
external/CMSIS_5/CMSIS/DoxyGen/Core/src/Ref_PMU8.txt
vendored
@ -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);
|
||||
|
||||
/** @} */
|
@ -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><<i>device abbreviation></i>_</b>
|
||||
- <b><<i>peripheral name</i>></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><<i>device abbreviation</i>>_</b> and <b><<i>peripheral name</i>>_</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><<i>device abbreviation</i>>_</b> and <b><<i>peripheral name</i>>_</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)
|
||||
|
||||
/**
|
||||
@}
|
||||
|
||||
*/
|
@ -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 */
|
||||
|
@ -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);
|
||||
|
||||
/** @} */
|
@ -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
|
||||
*/
|
@ -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
|
||||
*/
|
||||
|
||||
/**
|
||||
@}
|
||||
*/
|
1960
external/CMSIS_5/CMSIS/DoxyGen/Core/src/Ref_cm4_simd.txt
vendored
@ -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 */
|
||||
|
||||
|