Add GCC project for Infineon XMC4500 Hexagon kit CPU board.
parent
c86abdb67c
commit
b22ee3c997
@ -0,0 +1,115 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<?fileVersion 4.0.0?>
|
||||
|
||||
<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||
<cconfiguration id="com.atollic.truestudio.exe.debug.1093719381">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.atollic.truestudio.exe.debug.1093719381" moduleId="org.eclipse.cdt.core.settings" name="Debug">
|
||||
<externalSettings/>
|
||||
<extensions>
|
||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="com.atollic.truestudio.exe.debug.1093719381" name="Debug" parent="com.atollic.truestudio.exe.debug">
|
||||
<folderInfo id="com.atollic.truestudio.exe.debug.1093719381." name="/" resourcePath="">
|
||||
<toolChain id="com.atollic.truestudio.exe.debug.toolchain.1223840042" name="Atollic ARM Tools" superClass="com.atollic.truestudio.exe.debug.toolchain">
|
||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.atollic.truestudio.exe.debug.toolchain.platform.249629441" isAbstract="false" name="Debug platform" superClass="com.atollic.truestudio.exe.debug.toolchain.platform"/>
|
||||
<builder buildPath="${workspace_loc:/RTOSDemo/Debug}" id="com.atollic.truestudio.mbs.builder1.1843440538" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" superClass="com.atollic.truestudio.mbs.builder1"/>
|
||||
<tool id="com.atollic.truestudio.exe.debug.toolchain.as.699369800" name="Assembler" superClass="com.atollic.truestudio.exe.debug.toolchain.as">
|
||||
<option id="com.atollic.truestudio.common_options.target.endianess.536840484" name="Endianess" superClass="com.atollic.truestudio.common_options.target.endianess"/>
|
||||
<option id="com.atollic.truestudio.common_options.target.mcpu.2092541146" name="Microcontroller" superClass="com.atollic.truestudio.common_options.target.mcpu" value="XMC4500-E144x1024" valueType="enumerated"/>
|
||||
<option id="com.atollic.truestudio.common_options.target.instr_set.847291779" name="Instruction set" superClass="com.atollic.truestudio.common_options.target.instr_set" value="com.atollic.truestudio.common_options.target.instr_set.thumb2" valueType="enumerated"/>
|
||||
<option id="com.atollic.truestudio.common_options.target.fpu.1871429884" name="Floating point" superClass="com.atollic.truestudio.common_options.target.fpu" value="com.atollic.truestudio.common_options.target.fpu.hard" valueType="enumerated"/>
|
||||
<option id="com.atollic.truestudio.as.symbols.defined.688371665" name="Defined symbols" superClass="com.atollic.truestudio.as.symbols.defined"/>
|
||||
<option id="com.atollic.truestudio.as.general.incpath.1336066885" name="Include path" superClass="com.atollic.truestudio.as.general.incpath"/>
|
||||
<inputType id="com.atollic.truestudio.as.input.1935321946" name="Input" superClass="com.atollic.truestudio.as.input"/>
|
||||
</tool>
|
||||
<tool id="com.atollic.truestudio.exe.debug.toolchain.gcc.1937815028" name="C Compiler" superClass="com.atollic.truestudio.exe.debug.toolchain.gcc">
|
||||
<option id="com.atollic.truestudio.gcc.symbols.defined.281776924" name="Defined symbols" superClass="com.atollic.truestudio.gcc.symbols.defined" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="XMC4500"/>
|
||||
</option>
|
||||
<option id="com.atollic.truestudio.gcc.directories.select.1613177955" name="Include path" superClass="com.atollic.truestudio.gcc.directories.select" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value="..\CMSIS\Infineon\XMC4500_series\Include"/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src/Common_Demo_Source/include}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src/FreeRTOS_Source/include}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src/FreeRTOS_Source/portable/GCC/ARM_CM4F}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}}""/>
|
||||
<listOptionValue builtIn="false" value="..\CMSIS\Include"/>
|
||||
<listOptionValue builtIn="false" value="..\src"/>
|
||||
</option>
|
||||
<option id="com.atollic.truestudio.common_options.target.endianess.1042191422" name="Endianess" superClass="com.atollic.truestudio.common_options.target.endianess"/>
|
||||
<option id="com.atollic.truestudio.common_options.target.mcpu.743754068" name="Microcontroller" superClass="com.atollic.truestudio.common_options.target.mcpu" value="XMC4500-E144x1024" valueType="enumerated"/>
|
||||
<option id="com.atollic.truestudio.common_options.target.instr_set.1493838486" name="Instruction set" superClass="com.atollic.truestudio.common_options.target.instr_set" value="com.atollic.truestudio.common_options.target.instr_set.thumb2" valueType="enumerated"/>
|
||||
<option id="com.atollic.truestudio.common_options.target.fpu.1800960383" name="Floating point" superClass="com.atollic.truestudio.common_options.target.fpu" value="com.atollic.truestudio.common_options.target.fpu.hard" valueType="enumerated"/>
|
||||
<option id="com.atollic.truestudio.gcc.optimization.prep_garbage.305290930" name="Prepare dead code removal" superClass="com.atollic.truestudio.gcc.optimization.prep_garbage" value="true" valueType="boolean"/>
|
||||
<option id="com.atollic.truestudio.gcc.optimization.prep_data.1820686367" name="Prepare dead data removal" superClass="com.atollic.truestudio.gcc.optimization.prep_data" value="true" valueType="boolean"/>
|
||||
<inputType id="com.atollic.truestudio.gcc.input.1622256194" superClass="com.atollic.truestudio.gcc.input"/>
|
||||
</tool>
|
||||
<tool id="com.atollic.truestudio.exe.debug.toolchain.ld.2072222753" name="C Linker" superClass="com.atollic.truestudio.exe.debug.toolchain.ld">
|
||||
<option id="com.atollic.truestudio.common_options.target.endianess.764599665" name="Endianess" superClass="com.atollic.truestudio.common_options.target.endianess"/>
|
||||
<option id="com.atollic.truestudio.common_options.target.mcpu.249055242" name="Microcontroller" superClass="com.atollic.truestudio.common_options.target.mcpu" value="XMC4500-E144x1024" valueType="enumerated"/>
|
||||
<option id="com.atollic.truestudio.common_options.target.instr_set.1910809364" name="Instruction set" superClass="com.atollic.truestudio.common_options.target.instr_set" value="com.atollic.truestudio.common_options.target.instr_set.thumb2" valueType="enumerated"/>
|
||||
<option id="com.atollic.truestudio.common_options.target.fpu.164546999" name="Floating point" superClass="com.atollic.truestudio.common_options.target.fpu" value="com.atollic.truestudio.common_options.target.fpu.hard" valueType="enumerated"/>
|
||||
<option id="com.atollic.truestudio.ld.general.scriptfile.15700890" name="Linker script" superClass="com.atollic.truestudio.ld.general.scriptfile" value="..\xmc4500_flash.ld" valueType="string"/>
|
||||
<option id="com.atollic.truestudio.ld.optimization.do_garbage.1646972606" name="Dead code removal" superClass="com.atollic.truestudio.ld.optimization.do_garbage" value="true" valueType="boolean"/>
|
||||
<option id="com.atollic.truestudio.ld.libraries.list.297865905" name="Libraries" superClass="com.atollic.truestudio.ld.libraries.list" valueType="libs">
|
||||
<listOptionValue builtIn="false" value="m"/>
|
||||
</option>
|
||||
<inputType id="com.atollic.truestudio.ld.input.1523596231" name="Input" superClass="com.atollic.truestudio.ld.input">
|
||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
||||
</inputType>
|
||||
</tool>
|
||||
<tool id="com.atollic.truestudio.exe.debug.toolchain.gpp.743835398" name="C++ Compiler" superClass="com.atollic.truestudio.exe.debug.toolchain.gpp">
|
||||
<option id="com.atollic.truestudio.gpp.symbols.defined.2046881997" name="Defined symbols" superClass="com.atollic.truestudio.gpp.symbols.defined" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="XMC4500"/>
|
||||
</option>
|
||||
<option id="com.atollic.truestudio.gpp.directories.select.294331646" name="Include path" superClass="com.atollic.truestudio.gpp.directories.select" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value="..\CMSIS\Infineon\XMC4500_series\Include"/>
|
||||
<listOptionValue builtIn="false" value="..\CMSIS\Include"/>
|
||||
<listOptionValue builtIn="false" value="..\src"/>
|
||||
</option>
|
||||
<option id="com.atollic.truestudio.common_options.target.endianess.1268954692" name="Endianess" superClass="com.atollic.truestudio.common_options.target.endianess"/>
|
||||
<option id="com.atollic.truestudio.common_options.target.mcpu.1122815674" name="Microcontroller" superClass="com.atollic.truestudio.common_options.target.mcpu" value="XMC4500-E144x1024" valueType="enumerated"/>
|
||||
<option id="com.atollic.truestudio.common_options.target.instr_set.606520317" name="Instruction set" superClass="com.atollic.truestudio.common_options.target.instr_set" value="com.atollic.truestudio.common_options.target.instr_set.thumb2" valueType="enumerated"/>
|
||||
<option id="com.atollic.truestudio.common_options.target.fpu.706430268" name="Floating point" superClass="com.atollic.truestudio.common_options.target.fpu" value="com.atollic.truestudio.common_options.target.fpu.hard" valueType="enumerated"/>
|
||||
<option id="com.atollic.truestudio.gpp.optimization.prep_garbage.142923558" name="Prepare dead code removal" superClass="com.atollic.truestudio.gpp.optimization.prep_garbage" value="true" valueType="boolean"/>
|
||||
<option id="com.atollic.truestudio.gpp.optimization.prep_data.894874038" name="Prepare dead data removal" superClass="com.atollic.truestudio.gpp.optimization.prep_data" value="true" valueType="boolean"/>
|
||||
<option id="com.atollic.truestudio.gpp.optimization.fno_rtti.644722888" name="Disable RTTI" superClass="com.atollic.truestudio.gpp.optimization.fno_rtti"/>
|
||||
<option id="com.atollic.truestudio.gpp.optimization.fno_exceptions.1350296863" name="Disable exception handling" superClass="com.atollic.truestudio.gpp.optimization.fno_exceptions"/>
|
||||
</tool>
|
||||
<tool id="com.atollic.truestudio.exe.debug.toolchain.ldcc.1634459788" name="C++ Linker" superClass="com.atollic.truestudio.exe.debug.toolchain.ldcc">
|
||||
<option id="com.atollic.truestudio.common_options.target.endianess.1557444967" name="Endianess" superClass="com.atollic.truestudio.common_options.target.endianess"/>
|
||||
<option id="com.atollic.truestudio.common_options.target.mcpu.1833717897" name="Microcontroller" superClass="com.atollic.truestudio.common_options.target.mcpu" value="XMC4500-E144x1024" valueType="enumerated"/>
|
||||
<option id="com.atollic.truestudio.common_options.target.instr_set.2067325499" name="Instruction set" superClass="com.atollic.truestudio.common_options.target.instr_set" value="com.atollic.truestudio.common_options.target.instr_set.thumb2" valueType="enumerated"/>
|
||||
<option id="com.atollic.truestudio.common_options.target.fpu.847754675" name="Floating point" superClass="com.atollic.truestudio.common_options.target.fpu" value="com.atollic.truestudio.common_options.target.fpu.hard" valueType="enumerated"/>
|
||||
<option id="com.atollic.truestudio.ldcc.optimization.do_garbage.397663737" name="Dead code removal" superClass="com.atollic.truestudio.ldcc.optimization.do_garbage" value="true" valueType="boolean"/>
|
||||
<option id="com.atollic.truestudio.ldcc.general.scriptfile.537773074" name="Linker script" superClass="com.atollic.truestudio.ldcc.general.scriptfile" value="..\xmc4500_flash.ld" valueType="string"/>
|
||||
<option id="com.atollic.truestudio.ldcc.libraries.list.504150198" name="Libraries" superClass="com.atollic.truestudio.ldcc.libraries.list" valueType="libs">
|
||||
<listOptionValue builtIn="false" value="m"/>
|
||||
</option>
|
||||
</tool>
|
||||
<tool id="com.atollic.truestudio.exe.debug.toolchain.secoutput.379264594" name="Other" superClass="com.atollic.truestudio.exe.debug.toolchain.secoutput"/>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
<sourceEntries>
|
||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
|
||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="CMSIS"/>
|
||||
</sourceEntries>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
</cconfiguration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<project id="RTOSDemo.com.atollic.truestudio.exe.493639064" name="Executable" projectType="com.atollic.truestudio.exe"/>
|
||||
</storageModule>
|
||||
<storageModule moduleId="scannerConfiguration">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
|
||||
</cproject>
|
@ -0,0 +1,70 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>RTOSDemo</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
|
||||
<triggers>clean,full,incremental,</triggers>
|
||||
<arguments>
|
||||
<dictionary>
|
||||
<key>?name?</key>
|
||||
<value></value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.append_environment</key>
|
||||
<value>true</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.buildArguments</key>
|
||||
<value></value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.buildCommand</key>
|
||||
<value>make</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.buildLocation</key>
|
||||
<value>${workspace_loc:/RTOSDemo/Debug}</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.contents</key>
|
||||
<value>org.eclipse.cdt.make.core.activeConfigSettings</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
|
||||
<value>false</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
|
||||
<value>true</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.enableFullBuild</key>
|
||||
<value>true</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.stopOnError</key>
|
||||
<value>true</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
|
||||
<value>true</value>
|
||||
</dictionary>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
|
||||
<triggers>full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.cdt.core.cnature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
@ -0,0 +1,12 @@
|
||||
#Mon Mar 05 15:53:25 GMT 2012
|
||||
BOARD=IFX_XMC4500
|
||||
CODE_LOCATION=FLASH
|
||||
ENDIAN=Little-endian
|
||||
MCU=XMC4500-E144x1024
|
||||
MCU_VENDOR=Infineon
|
||||
MODEL=Pro
|
||||
PROBE=IAR J-LINK
|
||||
PROJECT_FORMAT_VERSION=2
|
||||
TARGET=ARM\u00AE
|
||||
VERSION=3.0.0
|
||||
eclipse.preferences.version=1
|
@ -0,0 +1,12 @@
|
||||
#Mon Mar 05 15:57:25 GMT 2012
|
||||
eclipse.preferences.version=1
|
||||
environment/buildEnvironmentInclude/com.atollic.truestudio.exe.debug.1093719381/CPATH/delimiter=;
|
||||
environment/buildEnvironmentInclude/com.atollic.truestudio.exe.debug.1093719381/CPATH/operation=remove
|
||||
environment/buildEnvironmentInclude/com.atollic.truestudio.exe.debug.1093719381/C_INCLUDE_PATH/delimiter=;
|
||||
environment/buildEnvironmentInclude/com.atollic.truestudio.exe.debug.1093719381/C_INCLUDE_PATH/operation=remove
|
||||
environment/buildEnvironmentInclude/com.atollic.truestudio.exe.debug.1093719381/append=true
|
||||
environment/buildEnvironmentInclude/com.atollic.truestudio.exe.debug.1093719381/appendContributed=true
|
||||
environment/buildEnvironmentLibrary/com.atollic.truestudio.exe.debug.1093719381/LIBRARY_PATH/delimiter=;
|
||||
environment/buildEnvironmentLibrary/com.atollic.truestudio.exe.debug.1093719381/LIBRARY_PATH/operation=remove
|
||||
environment/buildEnvironmentLibrary/com.atollic.truestudio.exe.debug.1093719381/append=true
|
||||
environment/buildEnvironmentLibrary/com.atollic.truestudio.exe.debug.1093719381/appendContributed=true
|
@ -0,0 +1,35 @@
|
||||
/* ----------------------------------------------------------------------
|
||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
||||
*
|
||||
* $Date: 11. November 2010
|
||||
* $Revision: V1.0.2
|
||||
*
|
||||
* Project: CMSIS DSP Library
|
||||
* Title: arm_common_tables.h
|
||||
*
|
||||
* Description: This file has extern declaration for common tables like Bitreverse, reciprocal etc which are used across different functions
|
||||
*
|
||||
* Target Processor: Cortex-M4/Cortex-M3
|
||||
*
|
||||
* Version 1.0.2 2010/11/11
|
||||
* Documentation updated.
|
||||
*
|
||||
* Version 1.0.1 2010/10/05
|
||||
* Production release and review comments incorporated.
|
||||
*
|
||||
* Version 1.0.0 2010/09/20
|
||||
* Production release and review comments incorporated.
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#ifndef _ARM_COMMON_TABLES_H
|
||||
#define _ARM_COMMON_TABLES_H
|
||||
|
||||
#include "arm_math.h"
|
||||
|
||||
extern uint16_t armBitRevTable[256];
|
||||
extern q15_t armRecipTableQ15[64];
|
||||
extern q31_t armRecipTableQ31[64];
|
||||
extern const q31_t realCoefAQ31[1024];
|
||||
extern const q31_t realCoefBQ31[1024];
|
||||
|
||||
#endif /* ARM_COMMON_TABLES_H */
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,701 @@
|
||||
/**************************************************************************//**
|
||||
* @file core_cm4_simd.h
|
||||
* @brief CMSIS Cortex-M4 SIMD Header File
|
||||
* @version V2.10
|
||||
* @date 19. July 2011
|
||||
*
|
||||
* @note
|
||||
* Copyright (C) 2010-2011 ARM Limited. All rights reserved.
|
||||
*
|
||||
* @par
|
||||
* ARM Limited (ARM) is supplying this software for use with Cortex-M
|
||||
* processor based microcontrollers. This file can be freely distributed
|
||||
* within development tools that are supporting such ARM based processors.
|
||||
*
|
||||
* @par
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
||||
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
||||
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
|
||||
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef __CORE_CM4_SIMD_H
|
||||
#define __CORE_CM4_SIMD_H
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* Hardware Abstraction Layer
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
/* ################### Compiler specific Intrinsics ########################### */
|
||||
/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics
|
||||
Access to dedicated SIMD instructions
|
||||
@{
|
||||
*/
|
||||
|
||||
#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
|
||||
/* ARM armcc specific functions */
|
||||
|
||||
/*------ CM4 SOMD Intrinsics -----------------------------------------------------*/
|
||||
#define __SADD8 __sadd8
|
||||
#define __QADD8 __qadd8
|
||||
#define __SHADD8 __shadd8
|
||||
#define __UADD8 __uadd8
|
||||
#define __UQADD8 __uqadd8
|
||||
#define __UHADD8 __uhadd8
|
||||
#define __SSUB8 __ssub8
|
||||
#define __QSUB8 __qsub8
|
||||
#define __SHSUB8 __shsub8
|
||||
#define __USUB8 __usub8
|
||||
#define __UQSUB8 __uqsub8
|
||||
#define __UHSUB8 __uhsub8
|
||||
#define __SADD16 __sadd16
|
||||
#define __QADD16 __qadd16
|
||||
#define __SHADD16 __shadd16
|
||||
#define __UADD16 __uadd16
|
||||
#define __UQADD16 __uqadd16
|
||||
#define __UHADD16 __uhadd16
|
||||
#define __SSUB16 __ssub16
|
||||
#define __QSUB16 __qsub16
|
||||
#define __SHSUB16 __shsub16
|
||||
#define __USUB16 __usub16
|
||||
#define __UQSUB16 __uqsub16
|
||||
#define __UHSUB16 __uhsub16
|
||||
#define __SASX __sasx
|
||||
#define __QASX __qasx
|
||||
#define __SHASX __shasx
|
||||
#define __UASX __uasx
|
||||
#define __UQASX __uqasx
|
||||
#define __UHASX __uhasx
|
||||
#define __SSAX __ssax
|
||||
#define __QSAX __qsax
|
||||
#define __SHSAX __shsax
|
||||
#define __USAX __usax
|
||||
#define __UQSAX __uqsax
|
||||
#define __UHSAX __uhsax
|
||||
#define __USAD8 __usad8
|
||||
#define __USADA8 __usada8
|
||||
#define __SSAT16 __ssat16
|
||||
#define __USAT16 __usat16
|
||||
#define __UXTB16 __uxtb16
|
||||
#define __UXTAB16 __uxtab16
|
||||
#define __SXTB16 __sxtb16
|
||||
#define __SXTAB16 __sxtab16
|
||||
#define __SMUAD __smuad
|
||||
#define __SMUADX __smuadx
|
||||
#define __SMLAD __smlad
|
||||
#define __SMLADX __smladx
|
||||
#define __SMLALD __smlald
|
||||
#define __SMLALDX __smlaldx
|
||||
#define __SMUSD __smusd
|
||||
#define __SMUSDX __smusdx
|
||||
#define __SMLSD __smlsd
|
||||
#define __SMLSDX __smlsdx
|
||||
#define __SMLSLD __smlsld
|
||||
#define __SMLSLDX __smlsldx
|
||||
#define __SEL __sel
|
||||
#define __QADD __qadd
|
||||
#define __QSUB __qsub
|
||||
|
||||
#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \
|
||||
((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) )
|
||||
|
||||
#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \
|
||||
((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) )
|
||||
|
||||
|
||||
/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
|
||||
|
||||
|
||||
|
||||
#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
|
||||
/* IAR iccarm specific functions */
|
||||
|
||||
#include <cmsis_iar.h>
|
||||
|
||||
/*------ CM4 SIMDDSP Intrinsics -----------------------------------------------------*/
|
||||
/* intrinsic __SADD8 see intrinsics.h */
|
||||
/* intrinsic __QADD8 see intrinsics.h */
|
||||
/* intrinsic __SHADD8 see intrinsics.h */
|
||||
/* intrinsic __UADD8 see intrinsics.h */
|
||||
/* intrinsic __UQADD8 see intrinsics.h */
|
||||
/* intrinsic __UHADD8 see intrinsics.h */
|
||||
/* intrinsic __SSUB8 see intrinsics.h */
|
||||
/* intrinsic __QSUB8 see intrinsics.h */
|
||||
/* intrinsic __SHSUB8 see intrinsics.h */
|
||||
/* intrinsic __USUB8 see intrinsics.h */
|
||||
/* intrinsic __UQSUB8 see intrinsics.h */
|
||||
/* intrinsic __UHSUB8 see intrinsics.h */
|
||||
/* intrinsic __SADD16 see intrinsics.h */
|
||||
/* intrinsic __QADD16 see intrinsics.h */
|
||||
/* intrinsic __SHADD16 see intrinsics.h */
|
||||
/* intrinsic __UADD16 see intrinsics.h */
|
||||
/* intrinsic __UQADD16 see intrinsics.h */
|
||||
/* intrinsic __UHADD16 see intrinsics.h */
|
||||
/* intrinsic __SSUB16 see intrinsics.h */
|
||||
/* intrinsic __QSUB16 see intrinsics.h */
|
||||
/* intrinsic __SHSUB16 see intrinsics.h */
|
||||
/* intrinsic __USUB16 see intrinsics.h */
|
||||
/* intrinsic __UQSUB16 see intrinsics.h */
|
||||
/* intrinsic __UHSUB16 see intrinsics.h */
|
||||
/* intrinsic __SASX see intrinsics.h */
|
||||
/* intrinsic __QASX see intrinsics.h */
|
||||
/* intrinsic __SHASX see intrinsics.h */
|
||||
/* intrinsic __UASX see intrinsics.h */
|
||||
/* intrinsic __UQASX see intrinsics.h */
|
||||
/* intrinsic __UHASX see intrinsics.h */
|
||||
/* intrinsic __SSAX see intrinsics.h */
|
||||
/* intrinsic __QSAX see intrinsics.h */
|
||||
/* intrinsic __SHSAX see intrinsics.h */
|
||||
/* intrinsic __USAX see intrinsics.h */
|
||||
/* intrinsic __UQSAX see intrinsics.h */
|
||||
/* intrinsic __UHSAX see intrinsics.h */
|
||||
/* intrinsic __USAD8 see intrinsics.h */
|
||||
/* intrinsic __USADA8 see intrinsics.h */
|
||||
/* intrinsic __SSAT16 see intrinsics.h */
|
||||
/* intrinsic __USAT16 see intrinsics.h */
|
||||
/* intrinsic __UXTB16 see intrinsics.h */
|
||||
/* intrinsic __SXTB16 see intrinsics.h */
|
||||
/* intrinsic __UXTAB16 see intrinsics.h */
|
||||
/* intrinsic __SXTAB16 see intrinsics.h */
|
||||
/* intrinsic __SMUAD see intrinsics.h */
|
||||
/* intrinsic __SMUADX see intrinsics.h */
|
||||
/* intrinsic __SMLAD see intrinsics.h */
|
||||
/* intrinsic __SMLADX see intrinsics.h */
|
||||
/* intrinsic __SMLALD see intrinsics.h */
|
||||
/* intrinsic __SMLALDX see intrinsics.h */
|
||||
/* intrinsic __SMUSD see intrinsics.h */
|
||||
/* intrinsic __SMUSDX see intrinsics.h */
|
||||
/* intrinsic __SMLSD see intrinsics.h */
|
||||
/* intrinsic __SMLSDX see intrinsics.h */
|
||||
/* intrinsic __SMLSLD see intrinsics.h */
|
||||
/* intrinsic __SMLSLDX see intrinsics.h */
|
||||
/* intrinsic __SEL see intrinsics.h */
|
||||
/* intrinsic __QADD see intrinsics.h */
|
||||
/* intrinsic __QSUB see intrinsics.h */
|
||||
/* intrinsic __PKHBT see intrinsics.h */
|
||||
/* intrinsic __PKHTB see intrinsics.h */
|
||||
|
||||
/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
|
||||
|
||||
|
||||
|
||||
#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
|
||||
/* GNU gcc specific functions */
|
||||
|
||||
/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SASX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __QASX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __UASX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __USAX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
#define __SSAT16(ARG1,ARG2) \
|
||||
({ \
|
||||
uint32_t __RES, __ARG1 = (ARG1); \
|
||||
__ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
|
||||
__RES; \
|
||||
})
|
||||
|
||||
#define __USAT16(ARG1,ARG2) \
|
||||
({ \
|
||||
uint32_t __RES, __ARG1 = (ARG1); \
|
||||
__ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
|
||||
__RES; \
|
||||
})
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __UXTB16(uint32_t op1)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1));
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SXTB16(uint32_t op1)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1));
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
#define __SMLALD(ARG1,ARG2,ARG3) \
|
||||
({ \
|
||||
uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \
|
||||
__ASM volatile ("smlald %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \
|
||||
(uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \
|
||||
})
|
||||
|
||||
#define __SMLALDX(ARG1,ARG2,ARG3) \
|
||||
({ \
|
||||
uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \
|
||||
__ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \
|
||||
(uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \
|
||||
})
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
#define __SMLSLD(ARG1,ARG2,ARG3) \
|
||||
({ \
|
||||
uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \
|
||||
__ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \
|
||||
(uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \
|
||||
})
|
||||
|
||||
#define __SMLSLDX(ARG1,ARG2,ARG3) \
|
||||
({ \
|
||||
uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \
|
||||
__ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \
|
||||
(uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \
|
||||
})
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __SEL (uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __QADD(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __QSUB(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
#define __PKHBT(ARG1,ARG2,ARG3) \
|
||||
({ \
|
||||
uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
|
||||
__ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \
|
||||
__RES; \
|
||||
})
|
||||
|
||||
#define __PKHTB(ARG1,ARG2,ARG3) \
|
||||
({ \
|
||||
uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
|
||||
if (ARG3 == 0) \
|
||||
__ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \
|
||||
else \
|
||||
__ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \
|
||||
__RES; \
|
||||
})
|
||||
|
||||
/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
|
||||
|
||||
|
||||
|
||||
#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
|
||||
/* TASKING carm specific functions */
|
||||
|
||||
|
||||
/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/
|
||||
/* not yet supported */
|
||||
/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
/*@} end of group CMSIS_SIMD_intrinsics */
|
||||
|
||||
|
||||
#endif /* __CORE_CM4_SIMD_H */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
@ -0,0 +1,609 @@
|
||||
/**************************************************************************//**
|
||||
* @file core_cmFunc.h
|
||||
* @brief CMSIS Cortex-M Core Function Access Header File
|
||||
* @version V2.10
|
||||
* @date 26. July 2011
|
||||
*
|
||||
* @note
|
||||
* Copyright (C) 2009-2011 ARM Limited. All rights reserved.
|
||||
*
|
||||
* @par
|
||||
* ARM Limited (ARM) is supplying this software for use with Cortex-M
|
||||
* processor based microcontrollers. This file can be freely distributed
|
||||
* within development tools that are supporting such ARM based processors.
|
||||
*
|
||||
* @par
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
||||
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
||||
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
|
||||
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __CORE_CMFUNC_H
|
||||
#define __CORE_CMFUNC_H
|
||||
|
||||
|
||||
/* ########################### Core Function Access ########################### */
|
||||
/** \ingroup CMSIS_Core_FunctionInterface
|
||||
\defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions
|
||||
@{
|
||||
*/
|
||||
|
||||
#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
|
||||
/* ARM armcc specific functions */
|
||||
|
||||
#if (__ARMCC_VERSION < 400677)
|
||||
#error "Please use ARM Compiler Toolchain V4.0.677 or later!"
|
||||
#endif
|
||||
|
||||
/* intrinsic void __enable_irq(); */
|
||||
/* intrinsic void __disable_irq(); */
|
||||
|
||||
/** \brief Get Control Register
|
||||
|
||||
This function returns the content of the Control Register.
|
||||
|
||||
\return Control Register value
|
||||
*/
|
||||
static __INLINE uint32_t __get_CONTROL(void)
|
||||
{
|
||||
register uint32_t __regControl __ASM("control");
|
||||
return(__regControl);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Control Register
|
||||
|
||||
This function writes the given value to the Control Register.
|
||||
|
||||
\param [in] control Control Register value to set
|
||||
*/
|
||||
static __INLINE void __set_CONTROL(uint32_t control)
|
||||
{
|
||||
register uint32_t __regControl __ASM("control");
|
||||
__regControl = control;
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get ISPR Register
|
||||
|
||||
This function returns the content of the ISPR Register.
|
||||
|
||||
\return ISPR Register value
|
||||
*/
|
||||
static __INLINE uint32_t __get_IPSR(void)
|
||||
{
|
||||
register uint32_t __regIPSR __ASM("ipsr");
|
||||
return(__regIPSR);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get APSR Register
|
||||
|
||||
This function returns the content of the APSR Register.
|
||||
|
||||
\return APSR Register value
|
||||
*/
|
||||
static __INLINE uint32_t __get_APSR(void)
|
||||
{
|
||||
register uint32_t __regAPSR __ASM("apsr");
|
||||
return(__regAPSR);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get xPSR Register
|
||||
|
||||
This function returns the content of the xPSR Register.
|
||||
|
||||
\return xPSR Register value
|
||||
*/
|
||||
static __INLINE uint32_t __get_xPSR(void)
|
||||
{
|
||||
register uint32_t __regXPSR __ASM("xpsr");
|
||||
return(__regXPSR);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get Process Stack Pointer
|
||||
|
||||
This function returns the current value of the Process Stack Pointer (PSP).
|
||||
|
||||
\return PSP Register value
|
||||
*/
|
||||
static __INLINE uint32_t __get_PSP(void)
|
||||
{
|
||||
register uint32_t __regProcessStackPointer __ASM("psp");
|
||||
return(__regProcessStackPointer);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Process Stack Pointer
|
||||
|
||||
This function assigns the given value to the Process Stack Pointer (PSP).
|
||||
|
||||
\param [in] topOfProcStack Process Stack Pointer value to set
|
||||
*/
|
||||
static __INLINE void __set_PSP(uint32_t topOfProcStack)
|
||||
{
|
||||
register uint32_t __regProcessStackPointer __ASM("psp");
|
||||
__regProcessStackPointer = topOfProcStack;
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get Main Stack Pointer
|
||||
|
||||
This function returns the current value of the Main Stack Pointer (MSP).
|
||||
|
||||
\return MSP Register value
|
||||
*/
|
||||
static __INLINE uint32_t __get_MSP(void)
|
||||
{
|
||||
register uint32_t __regMainStackPointer __ASM("msp");
|
||||
return(__regMainStackPointer);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Main Stack Pointer
|
||||
|
||||
This function assigns the given value to the Main Stack Pointer (MSP).
|
||||
|
||||
\param [in] topOfMainStack Main Stack Pointer value to set
|
||||
*/
|
||||
static __INLINE void __set_MSP(uint32_t topOfMainStack)
|
||||
{
|
||||
register uint32_t __regMainStackPointer __ASM("msp");
|
||||
__regMainStackPointer = topOfMainStack;
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get Priority Mask
|
||||
|
||||
This function returns the current state of the priority mask bit from the Priority Mask Register.
|
||||
|
||||
\return Priority Mask value
|
||||
*/
|
||||
static __INLINE uint32_t __get_PRIMASK(void)
|
||||
{
|
||||
register uint32_t __regPriMask __ASM("primask");
|
||||
return(__regPriMask);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Priority Mask
|
||||
|
||||
This function assigns the given value to the Priority Mask Register.
|
||||
|
||||
\param [in] priMask Priority Mask
|
||||
*/
|
||||
static __INLINE void __set_PRIMASK(uint32_t priMask)
|
||||
{
|
||||
register uint32_t __regPriMask __ASM("primask");
|
||||
__regPriMask = (priMask);
|
||||
}
|
||||
|
||||
|
||||
#if (__CORTEX_M >= 0x03)
|
||||
|
||||
/** \brief Enable FIQ
|
||||
|
||||
This function enables FIQ interrupts by clearing the F-bit in the CPSR.
|
||||
Can only be executed in Privileged modes.
|
||||
*/
|
||||
#define __enable_fault_irq __enable_fiq
|
||||
|
||||
|
||||
/** \brief Disable FIQ
|
||||
|
||||
This function disables FIQ interrupts by setting the F-bit in the CPSR.
|
||||
Can only be executed in Privileged modes.
|
||||
*/
|
||||
#define __disable_fault_irq __disable_fiq
|
||||
|
||||
|
||||
/** \brief Get Base Priority
|
||||
|
||||
This function returns the current value of the Base Priority register.
|
||||
|
||||
\return Base Priority register value
|
||||
*/
|
||||
static __INLINE uint32_t __get_BASEPRI(void)
|
||||
{
|
||||
register uint32_t __regBasePri __ASM("basepri");
|
||||
return(__regBasePri);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Base Priority
|
||||
|
||||
This function assigns the given value to the Base Priority register.
|
||||
|
||||
\param [in] basePri Base Priority value to set
|
||||
*/
|
||||
static __INLINE void __set_BASEPRI(uint32_t basePri)
|
||||
{
|
||||
register uint32_t __regBasePri __ASM("basepri");
|
||||
__regBasePri = (basePri & 0xff);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get Fault Mask
|
||||
|
||||
This function returns the current value of the Fault Mask register.
|
||||
|
||||
\return Fault Mask register value
|
||||
*/
|
||||
static __INLINE uint32_t __get_FAULTMASK(void)
|
||||
{
|
||||
register uint32_t __regFaultMask __ASM("faultmask");
|
||||
return(__regFaultMask);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Fault Mask
|
||||
|
||||
This function assigns the given value to the Fault Mask register.
|
||||
|
||||
\param [in] faultMask Fault Mask value to set
|
||||
*/
|
||||
static __INLINE void __set_FAULTMASK(uint32_t faultMask)
|
||||
{
|
||||
register uint32_t __regFaultMask __ASM("faultmask");
|
||||
__regFaultMask = (faultMask & (uint32_t)1);
|
||||
}
|
||||
|
||||
#endif /* (__CORTEX_M >= 0x03) */
|
||||
|
||||
|
||||
#if (__CORTEX_M == 0x04)
|
||||
|
||||
/** \brief Get FPSCR
|
||||
|
||||
This function returns the current value of the Floating Point Status/Control register.
|
||||
|
||||
\return Floating Point Status/Control register value
|
||||
*/
|
||||
static __INLINE uint32_t __get_FPSCR(void)
|
||||
{
|
||||
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
||||
register uint32_t __regfpscr __ASM("fpscr");
|
||||
return(__regfpscr);
|
||||
#else
|
||||
return(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set FPSCR
|
||||
|
||||
This function assigns the given value to the Floating Point Status/Control register.
|
||||
|
||||
\param [in] fpscr Floating Point Status/Control value to set
|
||||
*/
|
||||
static __INLINE void __set_FPSCR(uint32_t fpscr)
|
||||
{
|
||||
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
||||
register uint32_t __regfpscr __ASM("fpscr");
|
||||
__regfpscr = (fpscr);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* (__CORTEX_M == 0x04) */
|
||||
|
||||
|
||||
#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
|
||||
/* IAR iccarm specific functions */
|
||||
|
||||
#include <cmsis_iar.h>
|
||||
|
||||
#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
|
||||
/* GNU gcc specific functions */
|
||||
|
||||
/** \brief Enable IRQ Interrupts
|
||||
|
||||
This function enables IRQ interrupts by clearing the I-bit in the CPSR.
|
||||
Can only be executed in Privileged modes.
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE void __enable_irq(void)
|
||||
{
|
||||
__ASM volatile ("cpsie i");
|
||||
}
|
||||
|
||||
|
||||
/** \brief Disable IRQ Interrupts
|
||||
|
||||
This function disables IRQ interrupts by setting the I-bit in the CPSR.
|
||||
Can only be executed in Privileged modes.
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE void __disable_irq(void)
|
||||
{
|
||||
__ASM volatile ("cpsid i");
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get Control Register
|
||||
|
||||
This function returns the content of the Control Register.
|
||||
|
||||
\return Control Register value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_CONTROL(void)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("MRS %0, control" : "=r" (result) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Control Register
|
||||
|
||||
This function writes the given value to the Control Register.
|
||||
|
||||
\param [in] control Control Register value to set
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE void __set_CONTROL(uint32_t control)
|
||||
{
|
||||
__ASM volatile ("MSR control, %0" : : "r" (control) );
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get ISPR Register
|
||||
|
||||
This function returns the content of the ISPR Register.
|
||||
|
||||
\return ISPR Register value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_IPSR(void)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("MRS %0, ipsr" : "=r" (result) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get APSR Register
|
||||
|
||||
This function returns the content of the APSR Register.
|
||||
|
||||
\return APSR Register value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_APSR(void)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("MRS %0, apsr" : "=r" (result) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get xPSR Register
|
||||
|
||||
This function returns the content of the xPSR Register.
|
||||
|
||||
\return xPSR Register value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_xPSR(void)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("MRS %0, xpsr" : "=r" (result) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get Process Stack Pointer
|
||||
|
||||
This function returns the current value of the Process Stack Pointer (PSP).
|
||||
|
||||
\return PSP Register value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_PSP(void)
|
||||
{
|
||||
register uint32_t result;
|
||||
|
||||
__ASM volatile ("MRS %0, psp\n" : "=r" (result) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Process Stack Pointer
|
||||
|
||||
This function assigns the given value to the Process Stack Pointer (PSP).
|
||||
|
||||
\param [in] topOfProcStack Process Stack Pointer value to set
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE void __set_PSP(uint32_t topOfProcStack)
|
||||
{
|
||||
__ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) );
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get Main Stack Pointer
|
||||
|
||||
This function returns the current value of the Main Stack Pointer (MSP).
|
||||
|
||||
\return MSP Register value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_MSP(void)
|
||||
{
|
||||
register uint32_t result;
|
||||
|
||||
__ASM volatile ("MRS %0, msp\n" : "=r" (result) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Main Stack Pointer
|
||||
|
||||
This function assigns the given value to the Main Stack Pointer (MSP).
|
||||
|
||||
\param [in] topOfMainStack Main Stack Pointer value to set
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE void __set_MSP(uint32_t topOfMainStack)
|
||||
{
|
||||
__ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) );
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get Priority Mask
|
||||
|
||||
This function returns the current state of the priority mask bit from the Priority Mask Register.
|
||||
|
||||
\return Priority Mask value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_PRIMASK(void)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("MRS %0, primask" : "=r" (result) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Priority Mask
|
||||
|
||||
This function assigns the given value to the Priority Mask Register.
|
||||
|
||||
\param [in] priMask Priority Mask
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE void __set_PRIMASK(uint32_t priMask)
|
||||
{
|
||||
__ASM volatile ("MSR primask, %0" : : "r" (priMask) );
|
||||
}
|
||||
|
||||
|
||||
#if (__CORTEX_M >= 0x03)
|
||||
|
||||
/** \brief Enable FIQ
|
||||
|
||||
This function enables FIQ interrupts by clearing the F-bit in the CPSR.
|
||||
Can only be executed in Privileged modes.
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE void __enable_fault_irq(void)
|
||||
{
|
||||
__ASM volatile ("cpsie f");
|
||||
}
|
||||
|
||||
|
||||
/** \brief Disable FIQ
|
||||
|
||||
This function disables FIQ interrupts by setting the F-bit in the CPSR.
|
||||
Can only be executed in Privileged modes.
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE void __disable_fault_irq(void)
|
||||
{
|
||||
__ASM volatile ("cpsid f");
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get Base Priority
|
||||
|
||||
This function returns the current value of the Base Priority register.
|
||||
|
||||
\return Base Priority register value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_BASEPRI(void)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("MRS %0, basepri_max" : "=r" (result) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Base Priority
|
||||
|
||||
This function assigns the given value to the Base Priority register.
|
||||
|
||||
\param [in] basePri Base Priority value to set
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE void __set_BASEPRI(uint32_t value)
|
||||
{
|
||||
__ASM volatile ("MSR basepri, %0" : : "r" (value) );
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get Fault Mask
|
||||
|
||||
This function returns the current value of the Fault Mask register.
|
||||
|
||||
\return Fault Mask register value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_FAULTMASK(void)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("MRS %0, faultmask" : "=r" (result) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Fault Mask
|
||||
|
||||
This function assigns the given value to the Fault Mask register.
|
||||
|
||||
\param [in] faultMask Fault Mask value to set
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE void __set_FAULTMASK(uint32_t faultMask)
|
||||
{
|
||||
__ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) );
|
||||
}
|
||||
|
||||
#endif /* (__CORTEX_M >= 0x03) */
|
||||
|
||||
|
||||
#if (__CORTEX_M == 0x04)
|
||||
|
||||
/** \brief Get FPSCR
|
||||
|
||||
This function returns the current value of the Floating Point Status/Control register.
|
||||
|
||||
\return Floating Point Status/Control register value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_FPSCR(void)
|
||||
{
|
||||
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("VMRS %0, fpscr" : "=r" (result) );
|
||||
return(result);
|
||||
#else
|
||||
return(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set FPSCR
|
||||
|
||||
This function assigns the given value to the Floating Point Status/Control register.
|
||||
|
||||
\param [in] fpscr Floating Point Status/Control value to set
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE void __set_FPSCR(uint32_t fpscr)
|
||||
{
|
||||
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
||||
__ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) );
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* (__CORTEX_M == 0x04) */
|
||||
|
||||
|
||||
#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
|
||||
/* TASKING carm specific functions */
|
||||
|
||||
/*
|
||||
* The CMSIS functions have been implemented as intrinsics in the compiler.
|
||||
* Please use "carm -?i" to get an up to date list of all instrinsics,
|
||||
* Including the CMSIS ones.
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
||||
/*@} end of CMSIS_Core_RegAccFunctions */
|
||||
|
||||
|
||||
#endif /* __CORE_CMFUNC_H */
|
@ -0,0 +1,585 @@
|
||||
/**************************************************************************//**
|
||||
* @file core_cmInstr.h
|
||||
* @brief CMSIS Cortex-M Core Instruction Access Header File
|
||||
* @version V2.10
|
||||
* @date 19. July 2011
|
||||
*
|
||||
* @note
|
||||
* Copyright (C) 2009-2011 ARM Limited. All rights reserved.
|
||||
*
|
||||
* @par
|
||||
* ARM Limited (ARM) is supplying this software for use with Cortex-M
|
||||
* processor based microcontrollers. This file can be freely distributed
|
||||
* within development tools that are supporting such ARM based processors.
|
||||
*
|
||||
* @par
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
||||
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
||||
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
|
||||
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __CORE_CMINSTR_H
|
||||
#define __CORE_CMINSTR_H
|
||||
|
||||
|
||||
/* ########################## Core Instruction Access ######################### */
|
||||
/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
|
||||
Access to dedicated instructions
|
||||
@{
|
||||
*/
|
||||
|
||||
#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
|
||||
/* ARM armcc specific functions */
|
||||
|
||||
#if (__ARMCC_VERSION < 400677)
|
||||
#error "Please use ARM Compiler Toolchain V4.0.677 or later!"
|
||||
#endif
|
||||
|
||||
|
||||
/** \brief No Operation
|
||||
|
||||
No Operation does nothing. This instruction can be used for code alignment purposes.
|
||||
*/
|
||||
#define __NOP __nop
|
||||
|
||||
|
||||
/** \brief Wait For Interrupt
|
||||
|
||||
Wait For Interrupt is a hint instruction that suspends execution
|
||||
until one of a number of events occurs.
|
||||
*/
|
||||
#define __WFI __wfi
|
||||
|
||||
|
||||
/** \brief Wait For Event
|
||||
|
||||
Wait For Event is a hint instruction that permits the processor to enter
|
||||
a low-power state until one of a number of events occurs.
|
||||
*/
|
||||
#define __WFE __wfe
|
||||
|
||||
|
||||
/** \brief Send Event
|
||||
|
||||
Send Event is a hint instruction. It causes an event to be signaled to the CPU.
|
||||
*/
|
||||
#define __SEV __sev
|
||||
|
||||
|
||||
/** \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.
|
||||
*/
|
||||
#define __ISB() __isb(0xF)
|
||||
|
||||
|
||||
/** \brief Data Synchronization Barrier
|
||||
|
||||
This function acts as a special kind of Data Memory Barrier.
|
||||
It completes when all explicit memory accesses before this instruction complete.
|
||||
*/
|
||||
#define __DSB() __dsb(0xF)
|
||||
|
||||
|
||||
/** \brief Data Memory Barrier
|
||||
|
||||
This function ensures the apparent order of the explicit memory operations before
|
||||
and after the instruction, without ensuring their completion.
|
||||
*/
|
||||
#define __DMB() __dmb(0xF)
|
||||
|
||||
|
||||
/** \brief Reverse byte order (32 bit)
|
||||
|
||||
This function reverses the byte order in integer value.
|
||||
|
||||
\param [in] value Value to reverse
|
||||
\return Reversed value
|
||||
*/
|
||||
#define __REV __rev
|
||||
|
||||
|
||||
/** \brief Reverse byte order (16 bit)
|
||||
|
||||
This function reverses the byte order in two unsigned short values.
|
||||
|
||||
\param [in] value Value to reverse
|
||||
\return Reversed value
|
||||
*/
|
||||
static __INLINE __ASM uint32_t __REV16(uint32_t value)
|
||||
{
|
||||
rev16 r0, r0
|
||||
bx lr
|
||||
}
|
||||
|
||||
|
||||
/** \brief Reverse byte order in signed short value
|
||||
|
||||
This function reverses the byte order in a signed short value with sign extension to integer.
|
||||
|
||||
\param [in] value Value to reverse
|
||||
\return Reversed value
|
||||
*/
|
||||
static __INLINE __ASM int32_t __REVSH(int32_t value)
|
||||
{
|
||||
revsh r0, r0
|
||||
bx lr
|
||||
}
|
||||
|
||||
|
||||
#if (__CORTEX_M >= 0x03)
|
||||
|
||||
/** \brief Reverse bit order of value
|
||||
|
||||
This function reverses the bit order of the given value.
|
||||
|
||||
\param [in] value Value to reverse
|
||||
\return Reversed value
|
||||
*/
|
||||
#define __RBIT __rbit
|
||||
|
||||
|
||||
/** \brief LDR Exclusive (8 bit)
|
||||
|
||||
This function performs a exclusive LDR command for 8 bit value.
|
||||
|
||||
\param [in] ptr Pointer to data
|
||||
\return value of type uint8_t at (*ptr)
|
||||
*/
|
||||
#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr))
|
||||
|
||||
|
||||
/** \brief LDR Exclusive (16 bit)
|
||||
|
||||
This function performs a exclusive LDR command for 16 bit values.
|
||||
|
||||
\param [in] ptr Pointer to data
|
||||
\return value of type uint16_t at (*ptr)
|
||||
*/
|
||||
#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr))
|
||||
|
||||
|
||||
/** \brief LDR Exclusive (32 bit)
|
||||
|
||||
This function performs a exclusive LDR command for 32 bit values.
|
||||
|
||||
\param [in] ptr Pointer to data
|
||||
\return value of type uint32_t at (*ptr)
|
||||
*/
|
||||
#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr))
|
||||
|
||||
|
||||
/** \brief STR Exclusive (8 bit)
|
||||
|
||||
This function performs a exclusive STR command for 8 bit values.
|
||||
|
||||
\param [in] value Value to store
|
||||
\param [in] ptr Pointer to location
|
||||
\return 0 Function succeeded
|
||||
\return 1 Function failed
|
||||
*/
|
||||
#define __STREXB(value, ptr) __strex(value, ptr)
|
||||
|
||||
|
||||
/** \brief STR Exclusive (16 bit)
|
||||
|
||||
This function performs a exclusive STR command for 16 bit values.
|
||||
|
||||
\param [in] value Value to store
|
||||
\param [in] ptr Pointer to location
|
||||
\return 0 Function succeeded
|
||||
\return 1 Function failed
|
||||
*/
|
||||
#define __STREXH(value, ptr) __strex(value, ptr)
|
||||
|
||||
|
||||
/** \brief STR Exclusive (32 bit)
|
||||
|
||||
This function performs a exclusive STR command for 32 bit values.
|
||||
|
||||
\param [in] value Value to store
|
||||
\param [in] ptr Pointer to location
|
||||
\return 0 Function succeeded
|
||||
\return 1 Function failed
|
||||
*/
|
||||
#define __STREXW(value, ptr) __strex(value, ptr)
|
||||
|
||||
|
||||
/** \brief Remove the exclusive lock
|
||||
|
||||
This function removes the exclusive lock which is created by LDREX.
|
||||
|
||||
*/
|
||||
#define __CLREX __clrex
|
||||
|
||||
|
||||
/** \brief Signed Saturate
|
||||
|
||||
This function saturates a signed value.
|
||||
|
||||
\param [in] value Value to be saturated
|
||||
\param [in] sat Bit position to saturate to (1..32)
|
||||
\return Saturated value
|
||||
*/
|
||||
#define __SSAT __ssat
|
||||
|
||||
|
||||
/** \brief Unsigned Saturate
|
||||
|
||||
This function saturates an unsigned value.
|
||||
|
||||
\param [in] value Value to be saturated
|
||||
\param [in] sat Bit position to saturate to (0..31)
|
||||
\return Saturated value
|
||||
*/
|
||||
#define __USAT __usat
|
||||
|
||||
|
||||
/** \brief Count leading zeros
|
||||
|
||||
This function counts the number of leading zeros of a data value.
|
||||
|
||||
\param [in] value Value to count the leading zeros
|
||||
\return number of leading zeros in value
|
||||
*/
|
||||
#define __CLZ __clz
|
||||
|
||||
#endif /* (__CORTEX_M >= 0x03) */
|
||||
|
||||
|
||||
|
||||
#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
|
||||
/* IAR iccarm specific functions */
|
||||
|
||||
#include <cmsis_iar.h>
|
||||
|
||||
|
||||
#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
|
||||
/* GNU gcc specific functions */
|
||||
|
||||
/** \brief No Operation
|
||||
|
||||
No Operation does nothing. This instruction can be used for code alignment purposes.
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE void __NOP(void)
|
||||
{
|
||||
__ASM volatile ("nop");
|
||||
}
|
||||
|
||||
|
||||
/** \brief Wait For Interrupt
|
||||
|
||||
Wait For Interrupt is a hint instruction that suspends execution
|
||||
until one of a number of events occurs.
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE void __WFI(void)
|
||||
{
|
||||
__ASM volatile ("wfi");
|
||||
}
|
||||
|
||||
|
||||
/** \brief Wait For Event
|
||||
|
||||
Wait For Event is a hint instruction that permits the processor to enter
|
||||
a low-power state until one of a number of events occurs.
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE void __WFE(void)
|
||||
{
|
||||
__ASM volatile ("wfe");
|
||||
}
|
||||
|
||||
|
||||
/** \brief Send Event
|
||||
|
||||
Send Event is a hint instruction. It causes an event to be signaled to the CPU.
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE void __SEV(void)
|
||||
{
|
||||
__ASM volatile ("sev");
|
||||
}
|
||||
|
||||
|
||||
/** \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.
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE void __ISB(void)
|
||||
{
|
||||
__ASM volatile ("isb");
|
||||
}
|
||||
|
||||
|
||||
/** \brief Data Synchronization Barrier
|
||||
|
||||
This function acts as a special kind of Data Memory Barrier.
|
||||
It completes when all explicit memory accesses before this instruction complete.
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE void __DSB(void)
|
||||
{
|
||||
__ASM volatile ("dsb");
|
||||
}
|
||||
|
||||
|
||||
/** \brief Data Memory Barrier
|
||||
|
||||
This function ensures the apparent order of the explicit memory operations before
|
||||
and after the instruction, without ensuring their completion.
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE void __DMB(void)
|
||||
{
|
||||
__ASM volatile ("dmb");
|
||||
}
|
||||
|
||||
|
||||
/** \brief Reverse byte order (32 bit)
|
||||
|
||||
This function reverses the byte order in integer value.
|
||||
|
||||
\param [in] value Value to reverse
|
||||
\return Reversed value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __REV(uint32_t value)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Reverse byte order (16 bit)
|
||||
|
||||
This function reverses the byte order in two unsigned short values.
|
||||
|
||||
\param [in] value Value to reverse
|
||||
\return Reversed value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __REV16(uint32_t value)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Reverse byte order in signed short value
|
||||
|
||||
This function reverses the byte order in a signed short value with sign extension to integer.
|
||||
|
||||
\param [in] value Value to reverse
|
||||
\return Reversed value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE int32_t __REVSH(int32_t value)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
#if (__CORTEX_M >= 0x03)
|
||||
|
||||
/** \brief Reverse bit order of value
|
||||
|
||||
This function reverses the bit order of the given value.
|
||||
|
||||
\param [in] value Value to reverse
|
||||
\return Reversed 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);
|
||||
}
|
||||
|
||||
|
||||
/** \brief LDR Exclusive (8 bit)
|
||||
|
||||
This function performs a exclusive LDR command for 8 bit value.
|
||||
|
||||
\param [in] ptr Pointer to data
|
||||
\return value of type uint8_t at (*ptr)
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint8_t __LDREXB(volatile uint8_t *addr)
|
||||
{
|
||||
uint8_t result;
|
||||
|
||||
__ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief LDR Exclusive (16 bit)
|
||||
|
||||
This function performs a exclusive LDR command for 16 bit values.
|
||||
|
||||
\param [in] ptr Pointer to data
|
||||
\return value of type uint16_t at (*ptr)
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint16_t __LDREXH(volatile uint16_t *addr)
|
||||
{
|
||||
uint16_t result;
|
||||
|
||||
__ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief LDR Exclusive (32 bit)
|
||||
|
||||
This function performs a exclusive LDR command for 32 bit values.
|
||||
|
||||
\param [in] ptr Pointer to data
|
||||
\return value of type uint32_t at (*ptr)
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __LDREXW(volatile uint32_t *addr)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief STR Exclusive (8 bit)
|
||||
|
||||
This function performs a exclusive STR command for 8 bit values.
|
||||
|
||||
\param [in] value Value to store
|
||||
\param [in] ptr Pointer to location
|
||||
\return 0 Function succeeded
|
||||
\return 1 Function failed
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief STR Exclusive (16 bit)
|
||||
|
||||
This function performs a exclusive STR command for 16 bit values.
|
||||
|
||||
\param [in] value Value to store
|
||||
\param [in] ptr Pointer to location
|
||||
\return 0 Function succeeded
|
||||
\return 1 Function failed
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief STR Exclusive (32 bit)
|
||||
|
||||
This function performs a exclusive STR command for 32 bit values.
|
||||
|
||||
\param [in] value Value to store
|
||||
\param [in] ptr Pointer to location
|
||||
\return 0 Function succeeded
|
||||
\return 1 Function failed
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("strex %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Remove the exclusive lock
|
||||
|
||||
This function removes the exclusive lock which is created by LDREX.
|
||||
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE void __CLREX(void)
|
||||
{
|
||||
__ASM volatile ("clrex");
|
||||
}
|
||||
|
||||
|
||||
/** \brief Signed Saturate
|
||||
|
||||
This function saturates a signed value.
|
||||
|
||||
\param [in] value Value to be saturated
|
||||
\param [in] sat Bit position to saturate to (1..32)
|
||||
\return Saturated value
|
||||
*/
|
||||
#define __SSAT(ARG1,ARG2) \
|
||||
({ \
|
||||
uint32_t __RES, __ARG1 = (ARG1); \
|
||||
__ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
|
||||
__RES; \
|
||||
})
|
||||
|
||||
|
||||
/** \brief Unsigned Saturate
|
||||
|
||||
This function saturates an unsigned value.
|
||||
|
||||
\param [in] value Value to be saturated
|
||||
\param [in] sat Bit position to saturate to (0..31)
|
||||
\return Saturated value
|
||||
*/
|
||||
#define __USAT(ARG1,ARG2) \
|
||||
({ \
|
||||
uint32_t __RES, __ARG1 = (ARG1); \
|
||||
__ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
|
||||
__RES; \
|
||||
})
|
||||
|
||||
|
||||
/** \brief Count leading zeros
|
||||
|
||||
This function counts the number of leading zeros of a data value.
|
||||
|
||||
\param [in] value Value to count the leading zeros
|
||||
\return number of leading zeros in value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) static __INLINE uint8_t __CLZ(uint32_t value)
|
||||
{
|
||||
uint8_t result;
|
||||
|
||||
__ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
#endif /* (__CORTEX_M >= 0x03) */
|
||||
|
||||
|
||||
|
||||
|
||||
#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
|
||||
/* TASKING carm specific functions */
|
||||
|
||||
/*
|
||||
* The CMSIS functions have been implemented as intrinsics in the compiler.
|
||||
* Please use "carm -?i" to get an up to date list of all intrinsics,
|
||||
* Including the CMSIS ones.
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/ /* end of group CMSIS_Core_InstructionInterface */
|
||||
|
||||
#endif /* __CORE_CMINSTR_H */
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,479 @@
|
||||
//*****************************************************************************
|
||||
// To configure the same pin 1 of port 0, write
|
||||
// Control_P0_1(mode, drivestrength); where the mode is INPUT, INPUT_PD ...
|
||||
// OUTPUT_PP_GP ... OUTPUT_ODAF4. (see definitions below)
|
||||
// and drivestrength is WEAK, MEDIUM, STRONG or VERYSTRONG
|
||||
//
|
||||
// To toggle reset or set a pin you need to call the macro and put in brackets
|
||||
// the name of the port pin.
|
||||
// Example: you want to toggle, reset and set pin 1 of port:
|
||||
// Toggle(P0_1);
|
||||
// Reset(P0_1);
|
||||
// Set(P0_1);
|
||||
//*****************************************************************************
|
||||
|
||||
#ifndef __GPIO_H__
|
||||
#define __GPIO_H__
|
||||
|
||||
#include <XMC4500.h>
|
||||
|
||||
#define INPUT 0x00
|
||||
#define INPUT_PD 0x01
|
||||
#define INPUT_PU 0x02
|
||||
#define INPUT_PPS 0x03
|
||||
#define INPUT_INV 0x04
|
||||
#define INPUT_INV_PD 0x05
|
||||
#define INPUT_INV_PU 0x06
|
||||
#define INPUT_INV_PPS 0x07
|
||||
#define OUTPUT_PP_GP 0x10
|
||||
#define OUTPUT_PP_AF1 0x11
|
||||
#define OUTPUT_PP_AF2 0x12
|
||||
#define OUTPUT_PP_AF3 0x13
|
||||
#define OUTPUT_PP_AF4 0x14
|
||||
#define OUTPUT_OD_GP 0x18
|
||||
#define OUTPUT_OD_AF1 0x19
|
||||
#define OUTPUT_OD_AF2 0x1A
|
||||
#define OUTPUT_OD_AF3 0x1B
|
||||
#define OUTPUT_OD_AF4 0X1C
|
||||
|
||||
#define WEAK 0x7
|
||||
#define MEDIUM 0x4
|
||||
#define STRONG 0x2
|
||||
#define VERYSTRONG 0x0
|
||||
|
||||
#define Set(PinName) SET_##PinName
|
||||
#define Reset(PinName) RESET_##PinName
|
||||
#define Toggle(PinName) TOGGLE_##PinName
|
||||
|
||||
#define SET_P0_0 PORT0->OMR = 0x00000001
|
||||
#define SET_P0_1 PORT0->OMR = 0x00000002
|
||||
#define SET_P0_2 PORT0->OMR = 0x00000004
|
||||
#define SET_P0_3 PORT0->OMR = 0x00000008
|
||||
#define SET_P0_4 PORT0->OMR = 0x00000010
|
||||
#define SET_P0_5 PORT0->OMR = 0x00000020
|
||||
#define SET_P0_6 PORT0->OMR = 0x00000040
|
||||
#define SET_P0_7 PORT0->OMR = 0x00000080
|
||||
#define SET_P0_8 PORT0->OMR = 0x00000100
|
||||
#define SET_P0_9 PORT0->OMR = 0x00000200
|
||||
#define SET_P0_10 PORT0->OMR = 0x00000400
|
||||
#define SET_P0_11 PORT0->OMR = 0x00000800
|
||||
#define SET_P0_12 PORT0->OMR = 0x00001000
|
||||
#define SET_P0_13 PORT0->OMR = 0x00002000
|
||||
#define SET_P0_14 PORT0->OMR = 0x00004000
|
||||
#define SET_P0_15 PORT0->OMR = 0x00008000
|
||||
|
||||
#define RESET_P0_0 PORT0->OMR = 0x00010000
|
||||
#define RESET_P0_1 PORT0->OMR = 0x00020000
|
||||
#define RESET_P0_2 PORT0->OMR = 0x00040000
|
||||
#define RESET_P0_3 PORT0->OMR = 0x00080000
|
||||
#define RESET_P0_4 PORT0->OMR = 0x00100000
|
||||
#define RESET_P0_5 PORT0->OMR = 0x00200000
|
||||
#define RESET_P0_6 PORT0->OMR = 0x00400000
|
||||
#define RESET_P0_7 PORT0->OMR = 0x00800000
|
||||
#define RESET_P0_8 PORT0->OMR = 0x01000000
|
||||
#define RESET_P0_9 PORT0->OMR = 0x02000000
|
||||
#define RESET_P0_10 PORT0->OMR = 0x04000000
|
||||
#define RESET_P0_11 PORT0->OMR= 0x08000000
|
||||
#define RESET_P0_12 PORT0->OMR = 0x10000000
|
||||
#define RESET_P0_13 PORT0->OMR = 0x20000000
|
||||
#define RESET_P0_14 PORT0->OMR = 0x40000000
|
||||
#define RESET_P0_15 PORT0->OMR = 0x80000000
|
||||
|
||||
#define TOGGLE_P0_0 PORT0->OMR = 0x00010001
|
||||
#define TOGGLE_P0_1 PORT0->OMR = 0x00020002
|
||||
#define TOGGLE_P0_2 PORT0->OMR = 0x00040004
|
||||
#define TOGGLE_P0_3 PORT0->OMR = 0x00080008
|
||||
#define TOGGLE_P0_4 PORT0->OMR = 0x00100010
|
||||
#define TOGGLE_P0_5 PORT0->OMR = 0x00200020
|
||||
#define TOGGLE_P0_6 PORT0->OMR = 0x00400040
|
||||
#define TOGGLE_P0_7 PORT0->OMR = 0x00800080
|
||||
#define TOGGLE_P0_8 PORT0->OMR = 0x01000100
|
||||
#define TOGGLE_P0_9 PORT0->OMR = 0x02000200
|
||||
#define TOGGLE_P0_10 PORT0->OMR = 0x04000400
|
||||
#define TOGGLE_P0_11 PORT0->OMR = 0x08000800
|
||||
#define TOGGLE_P0_12 PORT0->OMR = 0x10001000
|
||||
#define TOGGLE_P0_13 PORT0->OMR = 0x20002000
|
||||
#define TOGGLE_P0_14 PORT0->OMR = 0x40004000
|
||||
#define TOGGLE_P0_15 PORT0->OMR = 0x80008000
|
||||
|
||||
#define Control_P0_0(Mode, DriveStrength) PORT0->IOCR0 = (PORT0->IOCR0 & ~0x000000F8) | (Mode << 3); PORT0->PDR0 = (PORT0->PDR0 & ~0x00000007) | (DriveStrength)
|
||||
#define Control_P0_1(Mode, DriveStrength) PORT0->IOCR0 = (PORT0->IOCR0 & ~0x0000F800) | (Mode << 11); PORT0->PDR0 = (PORT0->PDR0 & ~0x00000070) | (DriveStrength << 4)
|
||||
#define Control_P0_2(Mode, DriveStrength) PORT0->IOCR0 = (PORT0->IOCR0 & ~0x00F80000) | (Mode << 19); PORT0->PDR0 = (PORT0->PDR0 & ~0x00000700) | (DriveStrength << 8)
|
||||
#define Control_P0_3(Mode, DriveStrength) PORT0->IOCR0 = (PORT0->IOCR0 & ~0xF8000000) | (Mode << 27); PORT0->PDR0 = (PORT0->PDR0 & ~0x00007000) | (DriveStrength << 12)
|
||||
#define Control_P0_4(Mode, DriveStrength) PORT0->IOCR4 = (PORT0->IOCR4 & ~0x000000F8) | (Mode << 3); PORT0->PDR0 = (PORT0->PDR0 & ~0x00070000) | (DriveStrength << 16)
|
||||
#define Control_P0_5(Mode, DriveStrength) PORT0->IOCR4 = (PORT0->IOCR4 & ~0x0000F800) | (Mode << 11); PORT0->PDR0 = (PORT0->PDR0 & ~0x00700000) | (DriveStrength << 20)
|
||||
#define Control_P0_6(Mode, DriveStrength) PORT0->IOCR4 = (PORT0->IOCR4 & ~0x00F80000) | (Mode << 19); PORT0->PDR0 = (PORT0->PDR0 & ~0x07000000) | (DriveStrength << 24)
|
||||
#define Control_P0_7(Mode, DriveStrength) PORT0->IOCR4 = (PORT0->IOCR4 & ~0xF8000000) | (Mode << 27); PORT0->PDR0 = (PORT0->PDR0 & ~0x70000000) | (DriveStrength << 28)
|
||||
#define Control_P0_8(Mode, DriveStrength) PORT0->IOCR8 = (PORT0->IOCR8 & ~0x000000F8) | (Mode << 3); PORT0->PDR1 = (PORT0->PDR1 & ~0x00000007) | (DriveStrength)
|
||||
#define Control_P0_9(Mode, DriveStrength) PORT0->IOCR8 = (PORT0->IOCR8 & ~0x0000F800) | (Mode << 11); PORT0->PDR1 = (PORT0->PDR1 & ~0x00000070) | (DriveStrength << 4)
|
||||
#define Control_P0_10(Mode, DriveStrength) PORT0->IOCR8 = (PORT0->IOCR8 & ~0x00F80000) | (Mode << 19); PORT0->PDR1 = (PORT0->PDR1 & ~0x00000700) | (DriveStrength << 8)
|
||||
#define Control_P0_11(Mode, DriveStrength) PORT0->IOCR8 = (PORT0->IOCR8 & ~0xF8000000) | (Mode << 27); PORT0->PDR1 = (PORT0->PDR1 & ~0x00007000) | (DriveStrength << 12)
|
||||
#define Control_P0_12(Mode, DriveStrength) PORT0->IOCR12 = (PORT0->IOCR12 & ~0x000000F8) | (Mode << 3); PORT0->PDR1 = (PORT0->PDR1 & ~0x00070000) | (DriveStrength << 16)
|
||||
#define Control_P0_13(Mode, DriveStrength) PORT0->IOCR12 = (PORT0->IOCR12 & ~0x0000F800) | (Mode << 11); PORT0->PDR1 = (PORT0->PDR1 & ~0x00700000) | (DriveStrength << 20)
|
||||
#define Control_P0_14(Mode, DriveStrength) PORT0->IOCR12 = (PORT0->IOCR12 & ~0x00F80000) | (Mode << 19); PORT0->PDR1 = (PORT0->PDR1 & ~0x07000000) | (DriveStrength << 24)
|
||||
#define Control_P0_15(Mode, DriveStrength) PORT0->IOCR12 = (PORT0->IOCR12 & ~0xF8000000) | (Mode << 27); PORT0->PDR1 = (PORT0->PDR1 & ~0x70000000) | (DriveStrength << 28)
|
||||
|
||||
//********************************************
|
||||
|
||||
#define SET_P1_0 PORT1->OMR = 0x00000001
|
||||
#define SET_P1_1 PORT1->OMR = 0x00000002
|
||||
#define SET_P1_2 PORT1->OMR = 0x00000004
|
||||
#define SET_P1_3 PORT1->OMR = 0x00000008
|
||||
#define SET_P1_4 PORT1->OMR = 0x00000010
|
||||
#define SET_P1_5 PORT1->OMR = 0x00000020
|
||||
#define SET_P1_6 PORT1->OMR = 0x00000040
|
||||
#define SET_P1_7 PORT1->OMR = 0x00000080
|
||||
#define SET_P1_8 PORT1->OMR = 0x00000100
|
||||
#define SET_P1_9 PORT1->OMR = 0x00000200
|
||||
#define SET_P1_10 PORT1->OMR = 0x00000400
|
||||
#define SET_P1_11 PORT1->OMR = 0x00000800
|
||||
#define SET_P1_12 PORT1->OMR = 0x00001000
|
||||
#define SET_P1_13 PORT1->OMR = 0x00002000
|
||||
#define SET_P1_14 PORT1->OMR = 0x00004000
|
||||
#define SET_P1_15 PORT1->OMR = 0x00008000
|
||||
|
||||
#define RESET_P1_0 PORT1->OMR = 0x00010000
|
||||
#define RESET_P1_1 PORT1->OMR = 0x00020000
|
||||
#define RESET_P1_2 PORT1->OMR = 0x00040000
|
||||
#define RESET_P1_3 PORT1->OMR = 0x00080000
|
||||
#define RESET_P1_4 PORT1->OMR = 0x00100000
|
||||
#define RESET_P1_5 PORT1->OMR = 0x00200000
|
||||
#define RESET_P1_6 PORT1->OMR = 0x00400000
|
||||
#define RESET_P1_7 PORT1->OMR = 0x00800000
|
||||
#define RESET_P1_8 PORT1->OMR = 0x01000000
|
||||
#define RESET_P1_9 PORT1->OMR = 0x02000000
|
||||
#define RESET_P1_10 PORT1->OMR = 0x04000000
|
||||
#define RESET_P1_11 PORT1->OMR= 0x08000000
|
||||
#define RESET_P1_12 PORT1->OMR = 0x10000000
|
||||
#define RESET_P1_13 PORT1->OMR = 0x20000000
|
||||
#define RESET_P1_14 PORT1->OMR = 0x40000000
|
||||
#define RESET_P1_15 PORT1->OMR = 0x80000000
|
||||
|
||||
#define TOGGLE_P1_0 PORT1->OMR = 0x00010001
|
||||
#define TOGGLE_P1_1 PORT1->OMR = 0x00020002
|
||||
#define TOGGLE_P1_2 PORT1->OMR = 0x00040004
|
||||
#define TOGGLE_P1_3 PORT1->OMR = 0x00080008
|
||||
#define TOGGLE_P1_4 PORT1->OMR = 0x00100010
|
||||
#define TOGGLE_P1_5 PORT1->OMR = 0x00200020
|
||||
#define TOGGLE_P1_6 PORT1->OMR = 0x00400040
|
||||
#define TOGGLE_P1_7 PORT1->OMR = 0x00800080
|
||||
#define TOGGLE_P1_8 PORT1->OMR = 0x01000100
|
||||
#define TOGGLE_P1_9 PORT1->OMR = 0x02000200
|
||||
#define TOGGLE_P1_10 PORT1->OMR = 0x04000400
|
||||
#define TOGGLE_P1_11 PORT1->OMR = 0x08000800
|
||||
#define TOGGLE_P1_12 PORT1->OMR = 0x10001000
|
||||
#define TOGGLE_P1_13 PORT1->OMR = 0x20002000
|
||||
#define TOGGLE_P1_14 PORT1->OMR = 0x40004000
|
||||
#define TOGGLE_P1_15 PORT1->OMR = 0x80008000
|
||||
|
||||
#define Control_P1_0(Mode, DriveStrength) PORT1->IOCR0 = (PORT1->IOCR0 & ~0x000000F8) | (Mode << 3); PORT1->PDR0 = (PORT1->PDR0 & ~0x00000007) | (DriveStrength)
|
||||
#define Control_P1_1(Mode, DriveStrength) PORT1->IOCR0 = (PORT1->IOCR0 & ~0x0000F800) | (Mode << 11); PORT1->PDR0 = (PORT1->PDR0 & ~0x00000070) | (DriveStrength << 4)
|
||||
#define Control_P1_2(Mode, DriveStrength) PORT1->IOCR0 = (PORT1->IOCR0 & ~0x00F80000) | (Mode << 19); PORT1->PDR0 = (PORT1->PDR0 & ~0x00000700) | (DriveStrength << 8)
|
||||
#define Control_P1_3(Mode, DriveStrength) PORT1->IOCR0 = (PORT1->IOCR0 & ~0xF8000000) | (Mode << 27); PORT1->PDR0 = (PORT1->PDR0 & ~0x00007000) | (DriveStrength << 12)
|
||||
#define Control_P1_4(Mode, DriveStrength) PORT1->IOCR4 = (PORT1->IOCR4 & ~0x000000F8) | (Mode << 3); PORT1->PDR0 = (PORT1->PDR0 & ~0x00070000) | (DriveStrength << 16)
|
||||
#define Control_P1_5(Mode, DriveStrength) PORT1->IOCR4 = (PORT1->IOCR4 & ~0x0000F800) | (Mode << 11); PORT1->PDR0 = (PORT1->PDR0 & ~0x00700000) | (DriveStrength << 20)
|
||||
#define Control_P1_6(Mode, DriveStrength) PORT1->IOCR4 = (PORT1->IOCR4 & ~0x00F80000) | (Mode << 19); PORT1->PDR0 = (PORT1->PDR0 & ~0x07000000) | (DriveStrength << 24)
|
||||
#define Control_P1_7(Mode, DriveStrength) PORT1->IOCR4 = (PORT1->IOCR4 & ~0xF8000000) | (Mode << 27); PORT1->PDR0 = (PORT1->PDR0 & ~0x70000000) | (DriveStrength << 28)
|
||||
#define Control_P1_8(Mode, DriveStrength) PORT1->IOCR8 = (PORT1->IOCR8 & ~0x000000F8) | (Mode << 3); PORT1->PDR1 = (PORT1->PDR1 & ~0x00000007) | (DriveStrength)
|
||||
#define Control_P1_9(Mode, DriveStrength) PORT1->IOCR8 = (PORT1->IOCR8 & ~0x0000F800) | (Mode << 11); PORT1->PDR1 = (PORT1->PDR1 & ~0x00000070) | (DriveStrength << 4)
|
||||
#define Control_P1_10(Mode, DriveStrength) PORT1->IOCR8 = (PORT1->IOCR8 & ~0x00F80000) | (Mode << 19); PORT1->PDR1 = (PORT1->PDR1 & ~0x00000700) | (DriveStrength << 8)
|
||||
#define Control_P1_11(Mode, DriveStrength) PORT1->IOCR8 = (PORT1->IOCR8 & ~0xF8000000) | (Mode << 27); PORT1->PDR1 = (PORT1->PDR1 & ~0x00007000) | (DriveStrength << 12)
|
||||
#define Control_P1_12(Mode, DriveStrength) PORT1->IOCR12 = (PORT1->IOCR12 & ~0x000000F8) | (Mode << 3); PORT1->PDR1 = (PORT1->PDR1 & ~0x00070000) | (DriveStrength << 16)
|
||||
#define Control_P1_13(Mode, DriveStrength) PORT1->IOCR12 = (PORT1->IOCR12 & ~0x0000F800) | (Mode << 11); PORT1->PDR1 = (PORT1->PDR1 & ~0x00700000) | (DriveStrength << 20)
|
||||
#define Control_P1_14(Mode, DriveStrength) PORT1->IOCR12 = (PORT1->IOCR12 & ~0x00F80000) | (Mode << 19); PORT1->PDR1 = (PORT1->PDR1 & ~0x07000000) | (DriveStrength << 24)
|
||||
#define Control_P1_15(Mode, DriveStrength) PORT1->IOCR12 = (PORT1->IOCR12 & ~0xF8000000) | (Mode << 27); PORT1->PDR1 = (PORT1->PDR1 & ~0x70000000) | (DriveStrength << 28)
|
||||
|
||||
//********************************************
|
||||
|
||||
#define SET_P2_0 PORT2->OMR = 0x00000001
|
||||
#define SET_P2_1 PORT2->OMR = 0x00000002
|
||||
#define SET_P2_2 PORT2->OMR = 0x00000004
|
||||
#define SET_P2_3 PORT2->OMR = 0x00000008
|
||||
#define SET_P2_4 PORT2->OMR = 0x00000010
|
||||
#define SET_P2_5 PORT2->OMR = 0x00000020
|
||||
#define SET_P2_6 PORT2->OMR = 0x00000040
|
||||
#define SET_P2_7 PORT2->OMR = 0x00000080
|
||||
#define SET_P2_8 PORT2->OMR = 0x00000100
|
||||
#define SET_P2_9 PORT2->OMR = 0x00000200
|
||||
#define SET_P2_10 PORT2->OMR = 0x00000400
|
||||
#define SET_P2_11 PORT2->OMR = 0x00000800
|
||||
#define SET_P2_12 PORT2->OMR = 0x00001000
|
||||
#define SET_P2_13 PORT2->OMR = 0x00002000
|
||||
#define SET_P2_14 PORT2->OMR = 0x00004000
|
||||
#define SET_P2_15 PORT2->OMR = 0x00008000
|
||||
|
||||
#define RESET_P2_0 PORT2->OMR = 0x00010000
|
||||
#define RESET_P2_1 PORT2->OMR = 0x00020000
|
||||
#define RESET_P2_2 PORT2->OMR = 0x00040000
|
||||
#define RESET_P2_3 PORT2->OMR = 0x00080000
|
||||
#define RESET_P2_4 PORT2->OMR = 0x00100000
|
||||
#define RESET_P2_5 PORT2->OMR = 0x00200000
|
||||
#define RESET_P2_6 PORT2->OMR = 0x00400000
|
||||
#define RESET_P2_7 PORT2->OMR = 0x00800000
|
||||
#define RESET_P2_8 PORT2->OMR = 0x01000000
|
||||
#define RESET_P2_9 PORT2->OMR = 0x02000000
|
||||
#define RESET_P2_10 PORT2->OMR = 0x04000000
|
||||
#define RESET_P2_11 PORT2->OMR= 0x08000000
|
||||
#define RESET_P2_12 PORT2->OMR = 0x10000000
|
||||
#define RESET_P2_13 PORT2->OMR = 0x20000000
|
||||
#define RESET_P2_14 PORT2->OMR = 0x40000000
|
||||
#define RESET_P2_15 PORT2->OMR = 0x80000000
|
||||
|
||||
#define TOGGLE_P2_0 PORT2->OMR = 0x00010001
|
||||
#define TOGGLE_P2_1 PORT2->OMR = 0x00020002
|
||||
#define TOGGLE_P2_2 PORT2->OMR = 0x00040004
|
||||
#define TOGGLE_P2_3 PORT2->OMR = 0x00080008
|
||||
#define TOGGLE_P2_4 PORT2->OMR = 0x00100010
|
||||
#define TOGGLE_P2_5 PORT2->OMR = 0x00200020
|
||||
#define TOGGLE_P2_6 PORT2->OMR = 0x00400040
|
||||
#define TOGGLE_P2_7 PORT2->OMR = 0x00800080
|
||||
#define TOGGLE_P2_8 PORT2->OMR = 0x01000100
|
||||
#define TOGGLE_P2_9 PORT2->OMR = 0x02000200
|
||||
#define TOGGLE_P2_10 PORT2->OMR = 0x04000400
|
||||
#define TOGGLE_P2_11 PORT2->OMR = 0x08000800
|
||||
#define TOGGLE_P2_12 PORT2->OMR = 0x10001000
|
||||
#define TOGGLE_P2_13 PORT2->OMR = 0x20002000
|
||||
#define TOGGLE_P2_14 PORT2->OMR = 0x40004000
|
||||
#define TOGGLE_P2_15 PORT2->OMR = 0x80008000
|
||||
|
||||
#define Control_P2_0(Mode, DriveStrength) PORT2->IOCR0 = (PORT2->IOCR0 & ~0x000000F8) | (Mode << 3); PORT2->PDR0 = (PORT2->PDR0 & ~0x00000007) | (DriveStrength)
|
||||
#define Control_P2_1(Mode, DriveStrength) PORT2->IOCR0 = (PORT2->IOCR0 & ~0x0000F800) | (Mode << 11); PORT2->PDR0 = (PORT2->PDR0 & ~0x00000070) | (DriveStrength << 4)
|
||||
#define Control_P2_2(Mode, DriveStrength) PORT2->IOCR0 = (PORT2->IOCR0 & ~0x00F80000) | (Mode << 19); PORT2->PDR0 = (PORT2->PDR0 & ~0x00000700) | (DriveStrength << 8)
|
||||
#define Control_P2_3(Mode, DriveStrength) PORT2->IOCR0 = (PORT2->IOCR0 & ~0xF8000000) | (Mode << 27); PORT2->PDR0 = (PORT2->PDR0 & ~0x00007000) | (DriveStrength << 12)
|
||||
#define Control_P2_4(Mode, DriveStrength) PORT2->IOCR4 = (PORT2->IOCR4 & ~0x000000F8) | (Mode << 3); PORT2->PDR0 = (PORT2->PDR0 & ~0x00070000) | (DriveStrength << 16)
|
||||
#define Control_P2_5(Mode, DriveStrength) PORT2->IOCR4 = (PORT2->IOCR4 & ~0x0000F800) | (Mode << 11); PORT2->PDR0 = (PORT2->PDR0 & ~0x00700000) | (DriveStrength << 20)
|
||||
#define Control_P2_6(Mode, DriveStrength) PORT2->IOCR4 = (PORT2->IOCR4 & ~0x00F80000) | (Mode << 19); PORT2->PDR0 = (PORT2->PDR0 & ~0x07000000) | (DriveStrength << 24)
|
||||
#define Control_P2_7(Mode, DriveStrength) PORT2->IOCR4 = (PORT2->IOCR4 & ~0xF8000000) | (Mode << 27); PORT2->PDR0 = (PORT2->PDR0 & ~0x70000000) | (DriveStrength << 28)
|
||||
#define Control_P2_8(Mode, DriveStrength) PORT2->IOCR8 = (PORT2->IOCR8 & ~0x000000F8) | (Mode << 3); PORT2->PDR1 = (PORT2->PDR1 & ~0x00000007) | (DriveStrength)
|
||||
#define Control_P2_9(Mode, DriveStrength) PORT2->IOCR8 = (PORT2->IOCR8 & ~0x0000F800) | (Mode << 11); PORT2->PDR1 = (PORT2->PDR1 & ~0x00000070) | (DriveStrength << 4)
|
||||
#define Control_P2_10(Mode, DriveStrength) PORT2->IOCR8 = (PORT2->IOCR8 & ~0x00F80000) | (Mode << 19); PORT2->PDR1 = (PORT2->PDR1 & ~0x00000700) | (DriveStrength << 8)
|
||||
#define Control_P2_11(Mode, DriveStrength) PORT2->IOCR8 = (PORT2->IOCR8 & ~0xF8000000) | (Mode << 27); PORT2->PDR1 = (PORT2->PDR1 & ~0x00007000) | (DriveStrength << 12)
|
||||
#define Control_P2_12(Mode, DriveStrength) PORT2->IOCR12 = (PORT2->IOCR12 & ~0x000000F8) | (Mode << 3); PORT2->PDR1 = (PORT2->PDR1 & ~0x00070000) | (DriveStrength << 16)
|
||||
#define Control_P2_13(Mode, DriveStrength) PORT2->IOCR12 = (PORT2->IOCR12 & ~0x0000F800) | (Mode << 11); PORT2->PDR1 = (PORT2->PDR1 & ~0x00700000) | (DriveStrength << 20)
|
||||
#define Control_P2_14(Mode, DriveStrength) PORT2->IOCR12 = (PORT2->IOCR12 & ~0x00F80000) | (Mode << 19); PORT2->PDR1 = (PORT2->PDR1 & ~0x07000000) | (DriveStrength << 24)
|
||||
#define Control_P2_15(Mode, DriveStrength) PORT2->IOCR12 = (PORT2->IOCR12 & ~0xF8000000) | (Mode << 27); PORT2->PDR1 = (PORT2->PDR1 & ~0x70000000) | (DriveStrength << 28)
|
||||
|
||||
//********************************************
|
||||
|
||||
#define SET_P3_0 PORT3->OMR = 0x00000001
|
||||
#define SET_P3_1 PORT3->OMR = 0x00000002
|
||||
#define SET_P3_2 PORT3->OMR = 0x00000004
|
||||
#define SET_P3_3 PORT3->OMR = 0x00000008
|
||||
#define SET_P3_4 PORT3->OMR = 0x00000010
|
||||
#define SET_P3_5 PORT3->OMR = 0x00000020
|
||||
#define SET_P3_6 PORT3->OMR = 0x00000040
|
||||
#define SET_P3_7 PORT3->OMR = 0x00000080
|
||||
#define SET_P3_8 PORT3->OMR = 0x00000100
|
||||
#define SET_P3_9 PORT3->OMR = 0x00000200
|
||||
#define SET_P3_10 PORT3->OMR = 0x00000400
|
||||
#define SET_P3_11 PORT3->OMR = 0x00000800
|
||||
#define SET_P3_12 PORT3->OMR = 0x00001000
|
||||
#define SET_P3_13 PORT3->OMR = 0x00002000
|
||||
#define SET_P3_14 PORT3->OMR = 0x00004000
|
||||
#define SET_P3_15 PORT3->OMR = 0x00008000
|
||||
|
||||
#define RESET_P3_0 PORT3->OMR = 0x00010000
|
||||
#define RESET_P3_1 PORT3->OMR = 0x00020000
|
||||
#define RESET_P3_2 PORT3->OMR = 0x00040000
|
||||
#define RESET_P3_3 PORT3->OMR = 0x00080000
|
||||
#define RESET_P3_4 PORT3->OMR = 0x00100000
|
||||
#define RESET_P3_5 PORT3->OMR = 0x00200000
|
||||
#define RESET_P3_6 PORT3->OMR = 0x00400000
|
||||
#define RESET_P3_7 PORT3->OMR = 0x00800000
|
||||
#define RESET_P3_8 PORT3->OMR = 0x01000000
|
||||
#define RESET_P3_9 PORT3->OMR = 0x02000000
|
||||
#define RESET_P3_10 PORT3->OMR = 0x04000000
|
||||
#define RESET_P3_11 PORT3->OMR= 0x08000000
|
||||
#define RESET_P3_12 PORT3->OMR = 0x10000000
|
||||
#define RESET_P3_13 PORT3->OMR = 0x20000000
|
||||
#define RESET_P3_14 PORT3->OMR = 0x40000000
|
||||
#define RESET_P3_15 PORT3->OMR = 0x80000000
|
||||
|
||||
#define TOGGLE_P3_0 PORT3->OMR = 0x00010001
|
||||
#define TOGGLE_P3_1 PORT3->OMR = 0x00020002
|
||||
#define TOGGLE_P3_2 PORT3->OMR = 0x00040004
|
||||
#define TOGGLE_P3_3 PORT3->OMR = 0x00080008
|
||||
#define TOGGLE_P3_4 PORT3->OMR = 0x00100010
|
||||
#define TOGGLE_P3_5 PORT3->OMR = 0x00200020
|
||||
#define TOGGLE_P3_6 PORT3->OMR = 0x00400040
|
||||
#define TOGGLE_P3_7 PORT3->OMR = 0x00800080
|
||||
#define TOGGLE_P3_8 PORT3->OMR = 0x01000100
|
||||
#define TOGGLE_P3_9 PORT3->OMR = 0x02000200
|
||||
#define TOGGLE_P3_10 PORT3->OMR = 0x04000400
|
||||
#define TOGGLE_P3_11 PORT3->OMR = 0x08000800
|
||||
#define TOGGLE_P3_12 PORT3->OMR = 0x10001000
|
||||
#define TOGGLE_P3_13 PORT3->OMR = 0x20002000
|
||||
#define TOGGLE_P3_14 PORT3->OMR = 0x40004000
|
||||
#define TOGGLE_P3_15 PORT3->OMR = 0x80008000
|
||||
|
||||
#define Control_P3_0(Mode, DriveStrength) PORT3->IOCR0 = (PORT3->IOCR0 & ~0x000000F8) | (Mode << 3); PORT3->PDR0 = (PORT3->PDR0 & ~0x00000007) | (DriveStrength)
|
||||
#define Control_P3_1(Mode, DriveStrength) PORT3->IOCR0 = (PORT3->IOCR0 & ~0x0000F800) | (Mode << 11); PORT3->PDR0 = (PORT3->PDR0 & ~0x00000070) | (DriveStrength << 4)
|
||||
#define Control_P3_2(Mode, DriveStrength) PORT3->IOCR0 = (PORT3->IOCR0 & ~0x00F80000) | (Mode << 19); PORT3->PDR0 = (PORT3->PDR0 & ~0x00000700) | (DriveStrength << 8)
|
||||
#define Control_P3_3(Mode, DriveStrength) PORT3->IOCR0 = (PORT3->IOCR0 & ~0xF8000000) | (Mode << 27); PORT3->PDR0 = (PORT3->PDR0 & ~0x00007000) | (DriveStrength << 12)
|
||||
#define Control_P3_4(Mode, DriveStrength) PORT3->IOCR4 = (PORT3->IOCR4 & ~0x000000F8) | (Mode << 3); PORT3->PDR0 = (PORT3->PDR0 & ~0x00070000) | (DriveStrength << 16)
|
||||
#define Control_P3_5(Mode, DriveStrength) PORT3->IOCR4 = (PORT3->IOCR4 & ~0x0000F800) | (Mode << 11); PORT3->PDR0 = (PORT3->PDR0 & ~0x00700000) | (DriveStrength << 20)
|
||||
#define Control_P3_6(Mode, DriveStrength) PORT3->IOCR4 = (PORT3->IOCR4 & ~0x00F80000) | (Mode << 19); PORT3->PDR0 = (PORT3->PDR0 & ~0x07000000) | (DriveStrength << 24)
|
||||
#define Control_P3_7(Mode, DriveStrength) PORT3->IOCR4 = (PORT3->IOCR4 & ~0xF8000000) | (Mode << 27); PORT3->PDR0 = (PORT3->PDR0 & ~0x70000000) | (DriveStrength << 28)
|
||||
#define Control_P3_8(Mode, DriveStrength) PORT3->IOCR8 = (PORT3->IOCR8 & ~0x000000F8) | (Mode << 3); PORT3->PDR1 = (PORT3->PDR1 & ~0x00000007) | (DriveStrength)
|
||||
#define Control_P3_9(Mode, DriveStrength) PORT3->IOCR8 = (PORT3->IOCR8 & ~0x0000F800) | (Mode << 11); PORT3->PDR1 = (PORT3->PDR1 & ~0x00000070) | (DriveStrength << 4)
|
||||
#define Control_P3_10(Mode, DriveStrength) PORT3->IOCR8 = (PORT3->IOCR8 & ~0x00F80000) | (Mode << 19); PORT3->PDR1 = (PORT3->PDR1 & ~0x00000700) | (DriveStrength << 8)
|
||||
#define Control_P3_11(Mode, DriveStrength) PORT3->IOCR8 = (PORT3->IOCR8 & ~0xF8000000) | (Mode << 27); PORT3->PDR1 = (PORT3->PDR1 & ~0x00007000) | (DriveStrength << 12)
|
||||
#define Control_P3_12(Mode, DriveStrength) PORT3->IOCR12 = (PORT3->IOCR12 & ~0x000000F8) | (Mode << 3); PORT3->PDR1 = (PORT3->PDR1 & ~0x00070000) | (DriveStrength << 16)
|
||||
#define Control_P3_13(Mode, DriveStrength) PORT3->IOCR12 = (PORT3->IOCR12 & ~0x0000F800) | (Mode << 11); PORT3->PDR1 = (PORT3->PDR1 & ~0x00700000) | (DriveStrength << 20)
|
||||
#define Control_P3_14(Mode, DriveStrength) PORT3->IOCR12 = (PORT3->IOCR12 & ~0x00F80000) | (Mode << 19); PORT3->PDR1 = (PORT3->PDR1 & ~0x07000000) | (DriveStrength << 24)
|
||||
#define Control_P3_15(Mode, DriveStrength) PORT3->IOCR12 = (PORT3->IOCR12 & ~0xF8000000) | (Mode << 27); PORT3->PDR1 = (PORT3->PDR1 & ~0x70000000) | (DriveStrength << 28)
|
||||
|
||||
//********************************************
|
||||
|
||||
#define SET_P4_0 PORT4->OMR = 0x00000001
|
||||
#define SET_P4_1 PORT4->OMR = 0x00000002
|
||||
#define SET_P4_2 PORT4->OMR = 0x00000004
|
||||
#define SET_P4_3 PORT4->OMR = 0x00000008
|
||||
#define SET_P4_4 PORT4->OMR = 0x00000010
|
||||
#define SET_P4_5 PORT4->OMR = 0x00000020
|
||||
#define SET_P4_6 PORT4->OMR = 0x00000040
|
||||
#define SET_P4_7 PORT4->OMR = 0x00000080
|
||||
|
||||
#define RESET_P4_0 PORT4->OMR = 0x00010000
|
||||
#define RESET_P4_1 PORT4->OMR = 0x00020000
|
||||
#define RESET_P4_2 PORT4->OMR = 0x00040000
|
||||
#define RESET_P4_3 PORT4->OMR = 0x00080000
|
||||
#define RESET_P4_4 PORT4->OMR = 0x00100000
|
||||
#define RESET_P4_5 PORT4->OMR = 0x00200000
|
||||
#define RESET_P4_6 PORT4->OMR = 0x00400000
|
||||
#define RESET_P4_7 PORT4->OMR = 0x00800000
|
||||
|
||||
#define TOGGLE_P4_0 PORT4->OMR = 0x00010001
|
||||
#define TOGGLE_P4_1 PORT4->OMR = 0x00020002
|
||||
#define TOGGLE_P4_2 PORT4->OMR = 0x00040004
|
||||
#define TOGGLE_P4_3 PORT4->OMR = 0x00080008
|
||||
#define TOGGLE_P4_4 PORT4->OMR = 0x00100010
|
||||
#define TOGGLE_P4_5 PORT4->OMR = 0x00200020
|
||||
#define TOGGLE_P4_6 PORT4->OMR = 0x00400040
|
||||
#define TOGGLE_P4_7 PORT4->OMR = 0x00800080
|
||||
|
||||
#define Control_P4_0(Mode, DriveStrength) PORT4->IOCR0 = (PORT4->IOCR0 & ~0x000000F8) | (Mode << 3); PORT4->PDR0 = (PORT4->PDR0 & ~0x00000007) | (DriveStrength)
|
||||
#define Control_P4_1(Mode, DriveStrength) PORT4->IOCR0 = (PORT4->IOCR0 & ~0x0000F800) | (Mode << 11); PORT4->PDR0 = (PORT4->PDR0 & ~0x00000070) | (DriveStrength << 4)
|
||||
#define Control_P4_2(Mode, DriveStrength) PORT4->IOCR0 = (PORT4->IOCR0 & ~0x00F80000) | (Mode << 19); PORT4->PDR0 = (PORT4->PDR0 & ~0x00000700) | (DriveStrength << 8)
|
||||
#define Control_P4_3(Mode, DriveStrength) PORT4->IOCR0 = (PORT4->IOCR0 & ~0xF8000000) | (Mode << 27); PORT4->PDR0 = (PORT4->PDR0 & ~0x00007000) | (DriveStrength << 12)
|
||||
#define Control_P4_4(Mode, DriveStrength) PORT4->IOCR4 = (PORT4->IOCR4 & ~0x000000F8) | (Mode << 3); PORT4->PDR0 = (PORT4->PDR0 & ~0x00070000) | (DriveStrength << 16)
|
||||
#define Control_P4_5(Mode, DriveStrength) PORT4->IOCR4 = (PORT4->IOCR4 & ~0x0000F800) | (Mode << 11); PORT4->PDR0 = (PORT4->PDR0 & ~0x00700000) | (DriveStrength << 20)
|
||||
#define Control_P4_6(Mode, DriveStrength) PORT4->IOCR4 = (PORT4->IOCR4 & ~0x00F80000) | (Mode << 19); PORT4->PDR0 = (PORT4->PDR0 & ~0x07000000) | (DriveStrength << 24)
|
||||
#define Control_P4_7(Mode, DriveStrength) PORT4->IOCR4 = (PORT4->IOCR4 & ~0xF8000000) | (Mode << 27); PORT4->PDR0 = (PORT4->PDR0 & ~0x70000000) | (DriveStrength << 28)
|
||||
|
||||
//********************************************
|
||||
|
||||
#define SET_P5_0 PORT5->OMR = 0x00000001
|
||||
#define SET_P5_1 PORT5->OMR = 0x00000002
|
||||
#define SET_P5_2 PORT5->OMR = 0x00000004
|
||||
#define SET_P5_3 PORT5->OMR = 0x00000008
|
||||
#define SET_P5_4 PORT5->OMR = 0x00000010
|
||||
#define SET_P5_5 PORT5->OMR = 0x00000020
|
||||
#define SET_P5_6 PORT5->OMR = 0x00000040
|
||||
#define SET_P5_7 PORT5->OMR = 0x00000080
|
||||
#define SET_P5_8 PORT5->OMR = 0x00000100
|
||||
#define SET_P5_9 PORT5->OMR = 0x00000200
|
||||
#define SET_P5_10 PORT5->OMR = 0x00000400
|
||||
#define SET_P5_11 PORT5->OMR = 0x00000800
|
||||
#define SET_P5_12 PORT5->OMR = 0x00001000
|
||||
#define SET_P5_13 PORT5->OMR = 0x00002000
|
||||
#define SET_P5_14 PORT5->OMR = 0x00004000
|
||||
#define SET_P5_15 PORT5->OMR = 0x00008000
|
||||
|
||||
#define RESET_P5_0 PORT5->OMR = 0x00010000
|
||||
#define RESET_P5_1 PORT5->OMR = 0x00020000
|
||||
#define RESET_P5_2 PORT5->OMR = 0x00040000
|
||||
#define RESET_P5_3 PORT5->OMR = 0x00080000
|
||||
#define RESET_P5_4 PORT5->OMR = 0x00100000
|
||||
#define RESET_P5_5 PORT5->OMR = 0x00200000
|
||||
#define RESET_P5_6 PORT5->OMR = 0x00400000
|
||||
#define RESET_P5_7 PORT5->OMR = 0x00800000
|
||||
#define RESET_P5_8 PORT5->OMR = 0x01000000
|
||||
#define RESET_P5_9 PORT5->OMR = 0x02000000
|
||||
#define RESET_P5_10 PORT5->OMR = 0x04000000
|
||||
#define RESET_P5_11 PORT5->OMR= 0x08000000
|
||||
#define RESET_P5_12 PORT5->OMR = 0x10000000
|
||||
#define RESET_P5_13 PORT5->OMR = 0x20000000
|
||||
#define RESET_P5_14 PORT5->OMR = 0x40000000
|
||||
#define RESET_P5_15 PORT5->OMR = 0x80000000
|
||||
|
||||
#define TOGGLE_P5_0 PORT5->OMR = 0x00010001
|
||||
#define TOGGLE_P5_1 PORT5->OMR = 0x00020002
|
||||
#define TOGGLE_P5_2 PORT5->OMR = 0x00040004
|
||||
#define TOGGLE_P5_3 PORT5->OMR = 0x00080008
|
||||
#define TOGGLE_P5_4 PORT5->OMR = 0x00100010
|
||||
#define TOGGLE_P5_5 PORT5->OMR = 0x00200020
|
||||
#define TOGGLE_P5_6 PORT5->OMR = 0x00400040
|
||||
#define TOGGLE_P5_7 PORT5->OMR = 0x00800080
|
||||
#define TOGGLE_P5_8 PORT5->OMR = 0x01000100
|
||||
#define TOGGLE_P5_9 PORT5->OMR = 0x02000200
|
||||
#define TOGGLE_P5_10 PORT5->OMR = 0x04000400
|
||||
#define TOGGLE_P5_11 PORT5->OMR = 0x08000800
|
||||
#define TOGGLE_P5_12 PORT5->OMR = 0x10001000
|
||||
#define TOGGLE_P5_13 PORT5->OMR = 0x20002000
|
||||
#define TOGGLE_P5_14 PORT5->OMR = 0x40004000
|
||||
#define TOGGLE_P5_15 PORT5->OMR = 0x80008000
|
||||
|
||||
#define Control_P5_0(Mode, DriveStrength) PORT5->IOCR0 = (PORT5->IOCR0 & ~0x000000F8) | (Mode << 3); PORT5->PDR0 = (PORT5->PDR0 & ~0x00000007) | (DriveStrength)
|
||||
#define Control_P5_1(Mode, DriveStrength) PORT5->IOCR0 = (PORT5->IOCR0 & ~0x0000F800) | (Mode << 11); PORT5->PDR0 = (PORT5->PDR0 & ~0x00000070) | (DriveStrength << 4)
|
||||
#define Control_P5_2(Mode, DriveStrength) PORT5->IOCR0 = (PORT5->IOCR0 & ~0x00F80000) | (Mode << 19); PORT5->PDR0 = (PORT5->PDR0 & ~0x00000700) | (DriveStrength << 8)
|
||||
#define Control_P5_3(Mode, DriveStrength) PORT5->IOCR0 = (PORT5->IOCR0 & ~0xF8000000) | (Mode << 27); PORT5->PDR0 = (PORT5->PDR0 & ~0x00007000) | (DriveStrength << 12)
|
||||
#define Control_P5_4(Mode, DriveStrength) PORT5->IOCR4 = (PORT5->IOCR4 & ~0x000000F8) | (Mode << 3); PORT5->PDR0 = (PORT5->PDR0 & ~0x00070000) | (DriveStrength << 16)
|
||||
#define Control_P5_5(Mode, DriveStrength) PORT5->IOCR4 = (PORT5->IOCR4 & ~0x0000F800) | (Mode << 11); PORT5->PDR0 = (PORT5->PDR0 & ~0x00700000) | (DriveStrength << 20)
|
||||
#define Control_P5_6(Mode, DriveStrength) PORT5->IOCR4 = (PORT5->IOCR4 & ~0x00F80000) | (Mode << 19); PORT5->PDR0 = (PORT5->PDR0 & ~0x07000000) | (DriveStrength << 24)
|
||||
#define Control_P5_7(Mode, DriveStrength) PORT5->IOCR4 = (PORT5->IOCR4 & ~0xF8000000) | (Mode << 27); PORT5->PDR0 = (PORT5->PDR0 & ~0x70000000) | (DriveStrength << 28)
|
||||
#define Control_P5_8(Mode, DriveStrength) PORT5->IOCR8 = (PORT5->IOCR8 & ~0x000000F8) | (Mode << 3); PORT5->PDR1 = (PORT5->PDR1 & ~0x00000007) | (DriveStrength)
|
||||
#define Control_P5_9(Mode, DriveStrength) PORT5->IOCR8 = (PORT5->IOCR8 & ~0x0000F800) | (Mode << 11); PORT5->PDR1 = (PORT5->PDR1 & ~0x00000070) | (DriveStrength << 4)
|
||||
#define Control_P5_10(Mode, DriveStrength) PORT5->IOCR8 = (PORT5->IOCR8 & ~0x00F80000) | (Mode << 19); PORT5->PDR1 = (PORT5->PDR1 & ~0x00000700) | (DriveStrength << 8)
|
||||
#define Control_P5_11(Mode, DriveStrength) PORT5->IOCR8 = (PORT5->IOCR8 & ~0xF8000000) | (Mode << 27); PORT5->PDR1 = (PORT5->PDR1 & ~0x00007000) | (DriveStrength << 12)
|
||||
#define Control_P5_12(Mode, DriveStrength) PORT5->IOCR12 = (PORT5->IOCR12 & ~0x000000F8) | (Mode << 3); PORT5->PDR1 = (PORT5->PDR1 & ~0x00070000) | (DriveStrength << 16)
|
||||
#define Control_P5_13(Mode, DriveStrength) PORT5->IOCR12 = (PORT5->IOCR12 & ~0x0000F800) | (Mode << 11); PORT5->PDR1 = (PORT5->PDR1 & ~0x00700000) | (DriveStrength << 20)
|
||||
#define Control_P5_14(Mode, DriveStrength) PORT5->IOCR12 = (PORT5->IOCR12 & ~0x00F80000) | (Mode << 19); PORT5->PDR1 = (PORT5->PDR1 & ~0x07000000) | (DriveStrength << 24)
|
||||
#define Control_P5_15(Mode, DriveStrength) PORT5->IOCR12 = (PORT5->IOCR12 & ~0xF8000000) | (Mode << 27); PORT5->PDR1 = (PORT5->PDR1 & ~0x70000000) | (DriveStrength << 28)
|
||||
|
||||
//********************************************
|
||||
|
||||
#define SET_P6_0 PORT6->OMR = 0x00000001
|
||||
#define SET_P6_1 PORT6->OMR = 0x00000002
|
||||
#define SET_P6_2 PORT6->OMR = 0x00000004
|
||||
#define SET_P6_3 PORT6->OMR = 0x00000008
|
||||
#define SET_P6_4 PORT6->OMR = 0x00000010
|
||||
#define SET_P6_5 PORT6->OMR = 0x00000020
|
||||
#define SET_P6_6 PORT6->OMR = 0x00000040
|
||||
#define SET_P6_7 PORT6->OMR = 0x00000080
|
||||
#define SET_P6_8 PORT6->OMR = 0x00000100
|
||||
#define SET_P6_9 PORT6->OMR = 0x00000200
|
||||
#define SET_P6_10 PORT6->OMR = 0x00000400
|
||||
#define SET_P6_11 PORT6->OMR = 0x00000800
|
||||
#define SET_P6_12 PORT6->OMR = 0x00001000
|
||||
#define SET_P6_13 PORT6->OMR = 0x00002000
|
||||
#define SET_P6_14 PORT6->OMR = 0x00004000
|
||||
#define SET_P6_15 PORT6->OMR = 0x00008000
|
||||
|
||||
#define RESET_P6_0 PORT6->OMR = 0x00010000
|
||||
#define RESET_P6_1 PORT6->OMR = 0x00020000
|
||||
#define RESET_P6_2 PORT6->OMR = 0x00040000
|
||||
#define RESET_P6_3 PORT6->OMR = 0x00080000
|
||||
#define RESET_P6_4 PORT6->OMR = 0x00100000
|
||||
#define RESET_P6_5 PORT6->OMR = 0x00200000
|
||||
#define RESET_P6_6 PORT6->OMR = 0x00400000
|
||||
|
||||
#define TOGGLE_P6_0 PORT6->OMR = 0x00010001
|
||||
#define TOGGLE_P6_1 PORT6->OMR = 0x00020002
|
||||
#define TOGGLE_P6_2 PORT6->OMR = 0x00040004
|
||||
#define TOGGLE_P6_3 PORT6->OMR = 0x00080008
|
||||
#define TOGGLE_P6_4 PORT6->OMR = 0x00100010
|
||||
#define TOGGLE_P6_5 PORT6->OMR = 0x00200020
|
||||
#define TOGGLE_P6_6 PORT6->OMR = 0x00400040
|
||||
|
||||
#define Control_P6_0(Mode, DriveStrength) PORT6->IOCR0 = (PORT6->IOCR0 & ~0x000000F8) | (Mode << 3); PORT6->PDR0 = (PORT6->PDR0 & ~0x00000007) | (DriveStrength)
|
||||
#define Control_P6_1(Mode, DriveStrength) PORT6->IOCR0 = (PORT6->IOCR0 & ~0x0000F800) | (Mode << 11); PORT6->PDR0 = (PORT6->PDR0 & ~0x00000070) | (DriveStrength << 4)
|
||||
#define Control_P6_2(Mode, DriveStrength) PORT6->IOCR0 = (PORT6->IOCR0 & ~0x00F80000) | (Mode << 19); PORT6->PDR0 = (PORT6->PDR0 & ~0x00000700) | (DriveStrength << 8)
|
||||
#define Control_P6_3(Mode, DriveStrength) PORT6->IOCR0 = (PORT6->IOCR0 & ~0xF8000000) | (Mode << 27); PORT6->PDR0 = (PORT6->PDR0 & ~0x00007000) | (DriveStrength << 12)
|
||||
#define Control_P6_4(Mode, DriveStrength) PORT6->IOCR4 = (PORT6->IOCR4 & ~0x000000F8) | (Mode << 3); PORT6->PDR0 = (PORT6->PDR0 & ~0x00070000) | (DriveStrength << 16)
|
||||
#define Control_P6_5(Mode, DriveStrength) PORT6->IOCR4 = (PORT6->IOCR4 & ~0x0000F800) | (Mode << 11); PORT6->PDR0 = (PORT6->PDR0 & ~0x00700000) | (DriveStrength << 20)
|
||||
#define Control_P6_6(Mode, DriveStrength) PORT6->IOCR4 = (PORT6->IOCR4 & ~0x00F80000) | (Mode << 19); PORT6->PDR0 = (PORT6->PDR0 & ~0x07000000) | (DriveStrength << 24)
|
||||
|
||||
//********************************************
|
||||
|
||||
#endif
|
@ -0,0 +1,149 @@
|
||||
/*
|
||||
FreeRTOS V7.1.0 - Copyright (C) 2011 Real Time Engineers Ltd.
|
||||
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* FreeRTOS tutorial books are available in pdf and paperback. *
|
||||
* Complete, revised, and edited pdf reference manuals are also *
|
||||
* available. *
|
||||
* *
|
||||
* Purchasing FreeRTOS documentation will not only help you, by *
|
||||
* ensuring you get running as quickly as possible and with an *
|
||||
* in-depth knowledge of how to use FreeRTOS, it will also help *
|
||||
* the FreeRTOS project to continue with its mission of providing *
|
||||
* professional grade, cross platform, de facto standard solutions *
|
||||
* for microcontrollers - completely free of charge! *
|
||||
* *
|
||||
* >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
|
||||
* *
|
||||
* Thank you for using FreeRTOS, and thank you for your support! *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License (version 2) as published by the
|
||||
Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
|
||||
>>>NOTE<<< The modification to the GPL is included to allow you to
|
||||
distribute a combined work that includes FreeRTOS without being obliged to
|
||||
provide the source code for proprietary components outside of the FreeRTOS
|
||||
kernel. FreeRTOS is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
more details. You should have received a copy of the GNU General Public
|
||||
License and the FreeRTOS license exception along with FreeRTOS; if not it
|
||||
can be viewed here: http://www.freertos.org/a00114.html and also obtained
|
||||
by writing to Richard Barry, contact details for whom are available on the
|
||||
FreeRTOS WEB site.
|
||||
|
||||
1 tab == 4 spaces!
|
||||
|
||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
||||
contact details.
|
||||
|
||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
||||
critical systems.
|
||||
|
||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
||||
licensing and training services.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef FREERTOS_CONFIG_H
|
||||
#define FREERTOS_CONFIG_H
|
||||
|
||||
|
||||
/*-----------------------------------------------------------
|
||||
* Application specific definitions.
|
||||
*
|
||||
* These definitions should be adjusted for your particular hardware and
|
||||
* application requirements.
|
||||
*
|
||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
||||
*
|
||||
* See http://www.freertos.org/a00110.html.
|
||||
*----------------------------------------------------------*/
|
||||
|
||||
#include <stdint.h>
|
||||
extern uint32_t SystemCoreClock;
|
||||
|
||||
#define configUSE_PREEMPTION 1
|
||||
#define configUSE_IDLE_HOOK 0
|
||||
#define configUSE_TICK_HOOK 0
|
||||
#define configCPU_CLOCK_HZ ( SystemCoreClock )
|
||||
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
|
||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
|
||||
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 130 )
|
||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 40960 ) )
|
||||
#define configMAX_TASK_NAME_LEN ( 10 )
|
||||
#define configUSE_TRACE_FACILITY 1
|
||||
#define configUSE_16_BIT_TICKS 0
|
||||
#define configIDLE_SHOULD_YIELD 1
|
||||
#define configUSE_MUTEXES 1
|
||||
#define configQUEUE_REGISTRY_SIZE 8
|
||||
#define configCHECK_FOR_STACK_OVERFLOW 2
|
||||
#define configUSE_RECURSIVE_MUTEXES 1
|
||||
#define configUSE_MALLOC_FAILED_HOOK 1
|
||||
#define configUSE_APPLICATION_TASK_TAG 0
|
||||
#define configUSE_COUNTING_SEMAPHORES 1
|
||||
#define configGENERATE_RUN_TIME_STATS 0
|
||||
|
||||
/* Co-routine definitions. */
|
||||
#define configUSE_CO_ROUTINES 0
|
||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
||||
|
||||
/* Software timer definitions. */
|
||||
#define configUSE_TIMERS 1
|
||||
#define configTIMER_TASK_PRIORITY ( 2 )
|
||||
#define configTIMER_QUEUE_LENGTH 5
|
||||
#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 )
|
||||
|
||||
/* Set the following definitions to 1 to include the API function, or zero
|
||||
to exclude the API function. */
|
||||
#define INCLUDE_vTaskPrioritySet 1
|
||||
#define INCLUDE_uxTaskPriorityGet 1
|
||||
#define INCLUDE_vTaskDelete 1
|
||||
#define INCLUDE_vTaskCleanUpResources 1
|
||||
#define INCLUDE_vTaskSuspend 1
|
||||
#define INCLUDE_vTaskDelayUntil 1
|
||||
#define INCLUDE_vTaskDelay 1
|
||||
|
||||
/* Cortex-M specific definitions. */
|
||||
#ifdef __NVIC_PRIO_BITS
|
||||
/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
|
||||
#define configPRIO_BITS __NVIC_PRIO_BITS
|
||||
#else
|
||||
#define configPRIO_BITS 6 /* 63 priority levels */
|
||||
#endif
|
||||
|
||||
/* The lowest interrupt priority that can be used in a call to a "set priority"
|
||||
function. */
|
||||
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0x3f
|
||||
|
||||
/* The highest interrupt priority that can be used by any interrupt service
|
||||
routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL
|
||||
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
|
||||
PRIORITY THAN THIS! (higher priorities are lower numeric values. */
|
||||
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
|
||||
|
||||
/* Interrupt priorities used by the kernel port layer itself. These are generic
|
||||
to all Cortex-M ports, and do not rely on any particular library functions. */
|
||||
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
|
||||
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
|
||||
|
||||
/* Normal assert() semantics without relying on the provision of an assert.h
|
||||
header file. */
|
||||
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
|
||||
|
||||
/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
|
||||
standard names. */
|
||||
#define vPortSVCHandler SVC_Handler
|
||||
#define xPortPendSVHandler PendSV_Handler
|
||||
#define xPortSysTickHandler SysTick_Handler
|
||||
|
||||
#endif /* FREERTOS_CONFIG_H */
|
||||
|
@ -0,0 +1,223 @@
|
||||
/*
|
||||
FreeRTOS V7.1.0 - Copyright (C) 2011 Real Time Engineers Ltd.
|
||||
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* FreeRTOS tutorial books are available in pdf and paperback. *
|
||||
* Complete, revised, and edited pdf reference manuals are also *
|
||||
* available. *
|
||||
* *
|
||||
* Purchasing FreeRTOS documentation will not only help you, by *
|
||||
* ensuring you get running as quickly as possible and with an *
|
||||
* in-depth knowledge of how to use FreeRTOS, it will also help *
|
||||
* the FreeRTOS project to continue with its mission of providing *
|
||||
* professional grade, cross platform, de facto standard solutions *
|
||||
* for microcontrollers - completely free of charge! *
|
||||
* *
|
||||
* >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
|
||||
* *
|
||||
* Thank you for using FreeRTOS, and thank you for your support! *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License (version 2) as published by the
|
||||
Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
|
||||
>>>NOTE<<< The modification to the GPL is included to allow you to
|
||||
distribute a combined work that includes FreeRTOS without being obliged to
|
||||
provide the source code for proprietary components outside of the FreeRTOS
|
||||
kernel. FreeRTOS is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
more details. You should have received a copy of the GNU General Public
|
||||
License and the FreeRTOS license exception along with FreeRTOS; if not it
|
||||
can be viewed here: http://www.freertos.org/a00114.html and also obtained
|
||||
by writing to Richard Barry, contact details for whom are available on the
|
||||
FreeRTOS WEB site.
|
||||
|
||||
1 tab == 4 spaces!
|
||||
|
||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
||||
contact details.
|
||||
|
||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
||||
critical systems.
|
||||
|
||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
||||
licensing and training services.
|
||||
*/
|
||||
|
||||
/******************************************************************************
|
||||
* This project provides two demo applications. A simple blinky style project,
|
||||
* and a more comprehensive test and demo application. The
|
||||
* mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting (defined in this file) is used to
|
||||
* select between the two. The simply blinky demo is implemented and described
|
||||
* in main_blinky.c. The more comprehensive test and demo application is
|
||||
* implemented and described in main_full.c.
|
||||
*
|
||||
* This file implements the code that is not demo specific, including the
|
||||
* hardware setup and FreeRTOS hook functions.
|
||||
*
|
||||
*
|
||||
* Additional code:
|
||||
*
|
||||
* This demo does not contain a non-kernel interrupt service routine that
|
||||
* can be used as an example for application writers to use as a reference.
|
||||
* Therefore, the framework of a dummy (not installed) handler is provided
|
||||
* in this file. The dummy function is called Dummy_IRQHandler(). Please
|
||||
* ensure to read the comments in the function itself, but more importantly,
|
||||
* the notes on the function contained on the documentation page for this demo
|
||||
* that is found on the FreeRTOS.org web site.
|
||||
*/
|
||||
|
||||
/* Standard includes. */
|
||||
#include <stdio.h>
|
||||
|
||||
/* Kernel includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
|
||||
/* Hardware includes. */
|
||||
#include "XMC4500.h"
|
||||
#include "System_XMC4500.h"
|
||||
|
||||
/* Set mainCREATE_SIMPLE_BLINKY_DEMO_ONLY to one to run the simple blinky demo,
|
||||
or 0 to run the more comprehensive test and demo application. */
|
||||
#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 0
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Set up the hardware ready to run this demo.
|
||||
*/
|
||||
static void prvSetupHardware( void );
|
||||
|
||||
/*
|
||||
* main_blinky() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 1.
|
||||
* main_full() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 0.
|
||||
*/
|
||||
extern void main_blinky( void );
|
||||
extern void main_full( void );
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
int main( void )
|
||||
{
|
||||
/* Prepare the hardware to run this demo. */
|
||||
prvSetupHardware();
|
||||
|
||||
/* The mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting is described at the top
|
||||
of this file. */
|
||||
#if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1
|
||||
{
|
||||
main_blinky();
|
||||
}
|
||||
#else
|
||||
{
|
||||
main_full();
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvSetupHardware( void )
|
||||
{
|
||||
extern void SystemCoreClockUpdate( void );
|
||||
|
||||
/* Ensure SystemCoreClock variable is set. */
|
||||
SystemCoreClockUpdate();
|
||||
|
||||
/* Configure pin P3.9 for the LED. */
|
||||
PORT3->IOCR8 = 0x00008000;
|
||||
|
||||
/* Ensure all priority bits are assigned as preemption priority bits. */
|
||||
NVIC_SetPriorityGrouping( 0 );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationMallocFailedHook( void )
|
||||
{
|
||||
/* vApplicationMallocFailedHook() will only be called if
|
||||
configUSE_MALLOC_FAILED_HOOK is set to 1 in FreeRTOSConfig.h. It is a hook
|
||||
function that will get called if a call to pvPortMalloc() fails.
|
||||
pvPortMalloc() is called internally by the kernel whenever a task, queue,
|
||||
timer or semaphore is created. It is also called by various parts of the
|
||||
demo application. If heap_1.c or heap_2.c are used, then the size of the
|
||||
heap available to pvPortMalloc() is defined by configTOTAL_HEAP_SIZE in
|
||||
FreeRTOSConfig.h, and the xPortGetFreeHeapSize() API function can be used
|
||||
to query the size of free heap space that remains (although it does not
|
||||
provide information on how the remaining heap might be fragmented). */
|
||||
taskDISABLE_INTERRUPTS();
|
||||
for( ;; );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationIdleHook( void )
|
||||
{
|
||||
/* vApplicationIdleHook() will only be called if configUSE_IDLE_HOOK is set
|
||||
to 1 in FreeRTOSConfig.h. It will be called on each iteration of the idle
|
||||
task. It is essential that code added to this hook function never attempts
|
||||
to block in any way (for example, call xQueueReceive() with a block time
|
||||
specified, or call vTaskDelay()). If the application makes use of the
|
||||
vTaskDelete() API function (as this demo application does) then it is also
|
||||
important that vApplicationIdleHook() is permitted to return to its calling
|
||||
function, because it is the responsibility of the idle task to clean up
|
||||
memory allocated by the kernel to any task that has since been deleted. */
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationStackOverflowHook( xTaskHandle pxTask, signed char *pcTaskName )
|
||||
{
|
||||
( void ) pcTaskName;
|
||||
( void ) pxTask;
|
||||
|
||||
/* Run time stack overflow checking is performed if
|
||||
configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook
|
||||
function is called if a stack overflow is detected. */
|
||||
taskDISABLE_INTERRUPTS();
|
||||
for( ;; );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationTickHook( void )
|
||||
{
|
||||
/* This function will be called by each tick interrupt if
|
||||
configUSE_TICK_HOOK is set to 1 in FreeRTOSConfig.h. User code can be
|
||||
added here, but the tick hook is called from an interrupt context, so
|
||||
code must not attempt to block, and only the interrupt safe FreeRTOS API
|
||||
functions can be used (those that end in FromISR()). */
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
#ifdef JUST_AN_EXAMPLE_ISR
|
||||
|
||||
void Dummy_IRQHandler(void)
|
||||
{
|
||||
long lHigherPriorityTaskWoken = pdFALSE;
|
||||
|
||||
/* Clear the interrupt if necessary. */
|
||||
Dummy_ClearITPendingBit();
|
||||
|
||||
/* This interrupt does nothing more than demonstrate how to synchronise a
|
||||
task with an interrupt. A semaphore is used for this purpose. Note
|
||||
lHigherPriorityTaskWoken is initialised to zero. */
|
||||
xSemaphoreGiveFromISR( xTestSemaphore, &lHigherPriorityTaskWoken );
|
||||
|
||||
/* If there was a task that was blocked on the semaphore, and giving the
|
||||
semaphore caused the task to unblock, and the unblocked task has a priority
|
||||
higher than the current Running state task (the task that this interrupt
|
||||
interrupted), then lHigherPriorityTaskWoken will have been set to pdTRUE
|
||||
internally within xSemaphoreGiveFromISR(). Passing pdTRUE into the
|
||||
portEND_SWITCHING_ISR() macro will result in a context switch being pended to
|
||||
ensure this interrupt returns directly to the unblocked, higher priority,
|
||||
task. Passing pdFALSE into portEND_SWITCHING_ISR() has no effect. */
|
||||
portEND_SWITCHING_ISR( lHigherPriorityTaskWoken );
|
||||
}
|
||||
|
||||
#endif /* JUST_AN_EXAMPLE_ISR */
|
@ -0,0 +1,233 @@
|
||||
/*
|
||||
FreeRTOS V7.1.0 - Copyright (C) 2011 Real Time Engineers Ltd.
|
||||
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* FreeRTOS tutorial books are available in pdf and paperback. *
|
||||
* Complete, revised, and edited pdf reference manuals are also *
|
||||
* available. *
|
||||
* *
|
||||
* Purchasing FreeRTOS documentation will not only help you, by *
|
||||
* ensuring you get running as quickly as possible and with an *
|
||||
* in-depth knowledge of how to use FreeRTOS, it will also help *
|
||||
* the FreeRTOS project to continue with its mission of providing *
|
||||
* professional grade, cross platform, de facto standard solutions *
|
||||
* for microcontrollers - completely free of charge! *
|
||||
* *
|
||||
* >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
|
||||
* *
|
||||
* Thank you for using FreeRTOS, and thank you for your support! *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License (version 2) as published by the
|
||||
Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
|
||||
>>>NOTE<<< The modification to the GPL is included to allow you to
|
||||
distribute a combined work that includes FreeRTOS without being obliged to
|
||||
provide the source code for proprietary components outside of the FreeRTOS
|
||||
kernel. FreeRTOS is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
more details. You should have received a copy of the GNU General Public
|
||||
License and the FreeRTOS license exception along with FreeRTOS; if not it
|
||||
can be viewed here: http://www.freertos.org/a00114.html and also obtained
|
||||
by writing to Richard Barry, contact details for whom are available on the
|
||||
FreeRTOS WEB site.
|
||||
|
||||
1 tab == 4 spaces!
|
||||
|
||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
||||
contact details.
|
||||
|
||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
||||
critical systems.
|
||||
|
||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
||||
licensing and training services.
|
||||
*/
|
||||
|
||||
/******************************************************************************
|
||||
* NOTE 1: This project provides two demo applications. A simple blinky style
|
||||
* project, and a more comprehensive test and demo application. The
|
||||
* mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting in main.c is used to select
|
||||
* between the two. See the notes on using mainCREATE_SIMPLE_BLINKY_DEMO_ONLY
|
||||
* in main.c. This file implements the simply blinky style version.
|
||||
*
|
||||
* NOTE 2: This file only contains the source code that is specific to the
|
||||
* basic demo. Generic functions, such FreeRTOS hook functions, and functions
|
||||
* required to configure the hardware, are defined in main.c.
|
||||
******************************************************************************
|
||||
*
|
||||
* main_blinky() creates one queue, and two tasks. It then starts the
|
||||
* scheduler.
|
||||
*
|
||||
* The Queue Send Task:
|
||||
* The queue send task is implemented by the prvQueueSendTask() function in
|
||||
* this file. prvQueueSendTask() sits in a loop that causes it to repeatedly
|
||||
* block for 200 milliseconds, before sending the value 100 to the queue that
|
||||
* was created within main_blinky(). Once the value is sent, the task loops
|
||||
* back around to block for another 200 milliseconds.
|
||||
*
|
||||
* The Queue Receive Task:
|
||||
* The queue receive task is implemented by the prvQueueReceiveTask() function
|
||||
* in this file. prvQueueReceiveTask() sits in a loop where it repeatedly
|
||||
* blocks on attempts to read data from the queue that was created within
|
||||
* main_blinky(). When data is received, the task checks the value of the
|
||||
* data, and if the value equals the expected 100, toggles the LED. The 'block
|
||||
* time' parameter passed to the queue receive function specifies that the
|
||||
* task should be held in the Blocked state indefinitely to wait for data to
|
||||
* be available on the queue. The queue receive task will only leave the
|
||||
* Blocked state when the queue send task writes to the queue. As the queue
|
||||
* send task writes to the queue every 200 milliseconds, the queue receive
|
||||
* task leaves the Blocked state every 200 milliseconds, and therefore toggles
|
||||
* the LED every 200 milliseconds.
|
||||
*/
|
||||
|
||||
/* Standard includes. */
|
||||
#include <stdio.h>
|
||||
|
||||
/* Kernel includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "semphr.h"
|
||||
|
||||
/* Hardware includes. */
|
||||
#include "XMC4500.h"
|
||||
#include "System_XMC4500.h"
|
||||
|
||||
/* Priorities at which the tasks are created. */
|
||||
#define mainQUEUE_RECEIVE_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
||||
#define mainQUEUE_SEND_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
||||
|
||||
/* The rate at which data is sent to the queue. The 200ms value is converted
|
||||
to ticks using the portTICK_RATE_MS constant. */
|
||||
#define mainQUEUE_SEND_FREQUENCY_MS ( 200 / portTICK_RATE_MS )
|
||||
|
||||
/* The number of items the queue can hold. This is 1 as the receive task
|
||||
will remove items as they are added, meaning the send task should always find
|
||||
the queue empty. */
|
||||
#define mainQUEUE_LENGTH ( 1 )
|
||||
|
||||
/* Values passed to the two tasks just to check the task parameter
|
||||
functionality. */
|
||||
#define mainQUEUE_SEND_PARAMETER ( 0x1111UL )
|
||||
#define mainQUEUE_RECEIVE_PARAMETER ( 0x22UL )
|
||||
|
||||
/* To toggle the single LED */
|
||||
#define mainTOGGLE_LED() ( PORT3->OMR = 0x02000200 )
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* The tasks as described in the comments at the top of this file.
|
||||
*/
|
||||
static void prvQueueReceiveTask( void *pvParameters );
|
||||
static void prvQueueSendTask( void *pvParameters );
|
||||
|
||||
/*
|
||||
* Called by main() to create the simply blinky style application if
|
||||
* mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 1.
|
||||
*/
|
||||
void main_blinky( void );
|
||||
|
||||
/*
|
||||
* The hardware only has a single LED. Simply toggle it.
|
||||
*/
|
||||
extern void vMainToggleLED( void );
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* The queue used by both tasks. */
|
||||
static xQueueHandle xQueue = NULL;
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void main_blinky( void )
|
||||
{
|
||||
/* Create the queue. */
|
||||
xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( unsigned long ) );
|
||||
|
||||
if( xQueue != NULL )
|
||||
{
|
||||
/* Start the two tasks as described in the comments at the top of this
|
||||
file. */
|
||||
xTaskCreate( prvQueueReceiveTask, /* The function that implements the task. */
|
||||
( signed char * ) "Rx", /* The text name assigned to the task - for debug only as it is not used by the kernel. */
|
||||
configMINIMAL_STACK_SIZE, /* The size of the stack to allocate to the task. */
|
||||
( void * ) mainQUEUE_RECEIVE_PARAMETER, /* The parameter passed to the task - just to check the functionality. */
|
||||
mainQUEUE_RECEIVE_TASK_PRIORITY, /* The priority assigned to the task. */
|
||||
NULL ); /* The task handle is not required, so NULL is passed. */
|
||||
|
||||
xTaskCreate( prvQueueSendTask, ( signed char * ) "TX", configMINIMAL_STACK_SIZE, ( void * ) mainQUEUE_SEND_PARAMETER, mainQUEUE_SEND_TASK_PRIORITY, NULL );
|
||||
|
||||
/* Start the tasks and timer running. */
|
||||
vTaskStartScheduler();
|
||||
}
|
||||
|
||||
/* If all is well, the scheduler will now be running, and the following
|
||||
line will never be reached. If the following line does execute, then
|
||||
there was insufficient FreeRTOS heap memory available for the idle and/or
|
||||
timer tasks to be created. See the memory management section on the
|
||||
FreeRTOS web site for more details. */
|
||||
for( ;; );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvQueueSendTask( void *pvParameters )
|
||||
{
|
||||
portTickType xNextWakeTime;
|
||||
const unsigned long ulValueToSend = 100UL;
|
||||
|
||||
/* Check the task parameter is as expected. */
|
||||
configASSERT( ( ( unsigned long ) pvParameters ) == mainQUEUE_SEND_PARAMETER );
|
||||
|
||||
/* Initialise xNextWakeTime - this only needs to be done once. */
|
||||
xNextWakeTime = xTaskGetTickCount();
|
||||
|
||||
for( ;; )
|
||||
{
|
||||
/* Place this task in the blocked state until it is time to run again.
|
||||
The block time is specified in ticks, the constant used converts ticks
|
||||
to ms. While in the Blocked state this task will not consume any CPU
|
||||
time. */
|
||||
vTaskDelayUntil( &xNextWakeTime, mainQUEUE_SEND_FREQUENCY_MS );
|
||||
|
||||
/* Send to the queue - causing the queue receive task to unblock and
|
||||
toggle the LED. 0 is used as the block time so the sending operation
|
||||
will not block - it shouldn't need to block as the queue should always
|
||||
be empty at this point in the code. */
|
||||
xQueueSend( xQueue, &ulValueToSend, 0U );
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvQueueReceiveTask( void *pvParameters )
|
||||
{
|
||||
unsigned long ulReceivedValue;
|
||||
|
||||
/* Check the task parameter is as expected. */
|
||||
configASSERT( ( ( unsigned long ) pvParameters ) == mainQUEUE_RECEIVE_PARAMETER );
|
||||
|
||||
for( ;; )
|
||||
{
|
||||
/* Wait until something arrives in the queue - this task will block
|
||||
indefinitely provided INCLUDE_vTaskSuspend is set to 1 in
|
||||
FreeRTOSConfig.h. */
|
||||
xQueueReceive( xQueue, &ulReceivedValue, portMAX_DELAY );
|
||||
|
||||
/* To get here something must have been received from the queue, but
|
||||
is it the expected value? If it is, toggle the LED. */
|
||||
if( ulReceivedValue == 100UL )
|
||||
{
|
||||
mainTOGGLE_LED();
|
||||
ulReceivedValue = 0U;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
@ -0,0 +1,689 @@
|
||||
/*
|
||||
FreeRTOS V7.1.0 - Copyright (C) 2011 Real Time Engineers Ltd.
|
||||
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* FreeRTOS tutorial books are available in pdf and paperback. *
|
||||
* Complete, revised, and edited pdf reference manuals are also *
|
||||
* available. *
|
||||
* *
|
||||
* Purchasing FreeRTOS documentation will not only help you, by *
|
||||
* ensuring you get running as quickly as possible and with an *
|
||||
* in-depth knowledge of how to use FreeRTOS, it will also help *
|
||||
* the FreeRTOS project to continue with its mission of providing *
|
||||
* professional grade, cross platform, de facto standard solutions *
|
||||
* for microcontrollers - completely free of charge! *
|
||||
* *
|
||||
* >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
|
||||
* *
|
||||
* Thank you for using FreeRTOS, and thank you for your support! *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License (version 2) as published by the
|
||||
Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
|
||||
>>>NOTE<<< The modification to the GPL is included to allow you to
|
||||
distribute a combined work that includes FreeRTOS without being obliged to
|
||||
provide the source code for proprietary components outside of the FreeRTOS
|
||||
kernel. FreeRTOS is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
more details. You should have received a copy of the GNU General Public
|
||||
License and the FreeRTOS license exception along with FreeRTOS; if not it
|
||||
can be viewed here: http://www.freertos.org/a00114.html and also obtained
|
||||
by writing to Richard Barry, contact details for whom are available on the
|
||||
FreeRTOS WEB site.
|
||||
|
||||
1 tab == 4 spaces!
|
||||
|
||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
||||
contact details.
|
||||
|
||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
||||
critical systems.
|
||||
|
||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
||||
licensing and training services.
|
||||
*/
|
||||
|
||||
/******************************************************************************
|
||||
* NOTE 1: This project provides two demo applications. A simple blinky style
|
||||
* project, and a more comprehensive test and demo application. The
|
||||
* mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting in main.c is used to select
|
||||
* between the two. See the notes on using mainCREATE_SIMPLE_BLINKY_DEMO_ONLY
|
||||
* in main.c. This file implements the comprehensive test and demo version.
|
||||
*
|
||||
* NOTE 2: This file only contains the source code that is specific to the
|
||||
* full demo. Generic functions, such FreeRTOS hook functions, and functions
|
||||
* required to configure the hardware, are defined in main.c.
|
||||
******************************************************************************
|
||||
*
|
||||
* main_full() creates all the demo application tasks and a software timer, then
|
||||
* starts the scheduler. The web documentation provides more details of the
|
||||
* standard demo application tasks, which provide no particular functionality,
|
||||
* but do provide a good example of how to use the FreeRTOS API.
|
||||
*
|
||||
* In addition to the standard demo tasks, the following tasks and tests are
|
||||
* defined and/or created within this file:
|
||||
*
|
||||
* "Reg test" tasks - These fill both the core and floating point registers with
|
||||
* known values, then check that each register maintains its expected value for
|
||||
* the lifetime of the task. Each task uses a different set of values. The reg
|
||||
* test tasks execute with a very low priority, so get preempted very
|
||||
* frequently. A register containing an unexpected value is indicative of an
|
||||
* error in the context switching mechanism.
|
||||
*
|
||||
* "Check" timer - The check software timer period is initially set to three
|
||||
* seconds. The callback function associated with the check software timer
|
||||
* checks that all the standard demo tasks, and the register check tasks, are
|
||||
* not only still executing, but are executing without reporting any errors. If
|
||||
* the check software timer discovers that a task has either stalled, or
|
||||
* reported an error, then it changes its own execution period from the initial
|
||||
* three seconds, to just 200ms. The check software timer callback function
|
||||
* also toggles the single LED each time it is called. This provides a visual
|
||||
* indication of the system status: If the LED toggles every three seconds,
|
||||
* then no issues have been discovered. If the LED toggles every 200ms, then
|
||||
* an issue has been discovered with at least one task.
|
||||
*/
|
||||
|
||||
/* Standard includes. */
|
||||
#include <stdio.h>
|
||||
|
||||
/* Kernel includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "timers.h"
|
||||
#include "semphr.h"
|
||||
|
||||
/* Standard demo application includes. */
|
||||
#include "flop.h"
|
||||
#include "integer.h"
|
||||
#include "PollQ.h"
|
||||
#include "semtest.h"
|
||||
#include "dynamic.h"
|
||||
#include "BlockQ.h"
|
||||
#include "blocktim.h"
|
||||
#include "countsem.h"
|
||||
#include "GenQTest.h"
|
||||
#include "recmutex.h"
|
||||
#include "death.h"
|
||||
|
||||
/* Hardware includes. */
|
||||
#include "XMC4500.h"
|
||||
#include "System_XMC4500.h"
|
||||
|
||||
/* Priorities for the demo application tasks. */
|
||||
#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2UL )
|
||||
#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1UL )
|
||||
#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2UL )
|
||||
#define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3UL )
|
||||
#define mainFLOP_TASK_PRIORITY ( tskIDLE_PRIORITY )
|
||||
|
||||
/* To toggle the single LED */
|
||||
#define mainTOGGLE_LED() ( PORT3->OMR = 0x02000200 )
|
||||
|
||||
/* A block time of zero simply means "don't block". */
|
||||
#define mainDONT_BLOCK ( 0UL )
|
||||
|
||||
/* The period after which the check timer will expire, in ms, provided no errors
|
||||
have been reported by any of the standard demo tasks. ms are converted to the
|
||||
equivalent in ticks using the portTICK_RATE_MS constant. */
|
||||
#define mainCHECK_TIMER_PERIOD_MS ( 3000UL / portTICK_RATE_MS )
|
||||
|
||||
/* The period at which the check timer will expire, in ms, if an error has been
|
||||
reported in one of the standard demo tasks. ms are converted to the equivalent
|
||||
in ticks using the portTICK_RATE_MS constant. */
|
||||
#define mainERROR_CHECK_TIMER_PERIOD_MS ( 200UL / portTICK_RATE_MS )
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* The check timer callback function, as described at the top of this file.
|
||||
*/
|
||||
static void prvCheckTimerCallback( xTimerHandle xTimer );
|
||||
|
||||
/*
|
||||
* Register check tasks, and the tasks used to write over and check the contents
|
||||
* of the FPU registers, as described at the top of this file. The nature of
|
||||
* these files necessitates that they are written in an assembly file.
|
||||
*/
|
||||
static void vRegTest1Task( void *pvParameters ) __attribute__((naked));
|
||||
static void vRegTest2Task( void *pvParameters ) __attribute__((naked));
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* The following two variables are used to communicate the status of the
|
||||
register check tasks to the check software timer. If the variables keep
|
||||
incrementing, then the register check tasks has not discovered any errors. If
|
||||
a variable stops incrementing, then an error has been found. */
|
||||
volatile unsigned long ulRegTest1LoopCounter = 0UL, ulRegTest2LoopCounter = 0UL;
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void main_full( void )
|
||||
{
|
||||
xTimerHandle xCheckTimer = NULL;
|
||||
|
||||
/* Start all the other standard demo/test tasks. The have not particular
|
||||
functionality, but do demonstrate how to use the FreeRTOS API and test the
|
||||
kernel port. */
|
||||
vStartIntegerMathTasks( tskIDLE_PRIORITY );
|
||||
vStartDynamicPriorityTasks();
|
||||
vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
|
||||
vCreateBlockTimeTasks();
|
||||
vStartCountingSemaphoreTasks();
|
||||
vStartGenericQueueTasks( tskIDLE_PRIORITY );
|
||||
vStartRecursiveMutexTasks();
|
||||
vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
|
||||
vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );
|
||||
vStartMathTasks( mainFLOP_TASK_PRIORITY );
|
||||
|
||||
/* Create the register check tasks, as described at the top of this
|
||||
file */
|
||||
xTaskCreate( vRegTest1Task, ( signed char * ) "Reg1", configMINIMAL_STACK_SIZE, ( void * ) NULL, tskIDLE_PRIORITY, NULL );
|
||||
xTaskCreate( vRegTest2Task, ( signed char * ) "Reg2", configMINIMAL_STACK_SIZE, ( void * ) NULL, tskIDLE_PRIORITY, NULL );
|
||||
|
||||
/* Create the software timer that performs the 'check' functionality,
|
||||
as described at the top of this file. */
|
||||
xCheckTimer = xTimerCreate( ( const signed char * ) "CheckTimer",/* A text name, purely to help debugging. */
|
||||
( mainCHECK_TIMER_PERIOD_MS ), /* The timer period, in this case 3000ms (3s). */
|
||||
pdTRUE, /* This is an auto-reload timer, so xAutoReload is set to pdTRUE. */
|
||||
( void * ) 0, /* The ID is not used, so can be set to anything. */
|
||||
prvCheckTimerCallback /* The callback function that inspects the status of all the other tasks. */
|
||||
);
|
||||
|
||||
if( xCheckTimer != NULL )
|
||||
{
|
||||
xTimerStart( xCheckTimer, mainDONT_BLOCK );
|
||||
}
|
||||
|
||||
/* The set of tasks created by the following function call have to be
|
||||
created last as they keep account of the number of tasks they expect to see
|
||||
running. */
|
||||
vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY );
|
||||
|
||||
/* Start the scheduler. */
|
||||
vTaskStartScheduler();
|
||||
|
||||
/* If all is well, the scheduler will now be running, and the following line
|
||||
will never be reached. If the following line does execute, then there was
|
||||
insufficient FreeRTOS heap memory available for the idle and/or timer tasks
|
||||
to be created. See the memory management section on the FreeRTOS web site
|
||||
for more details. */
|
||||
for( ;; );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvCheckTimerCallback( xTimerHandle xTimer )
|
||||
{
|
||||
static long lChangedTimerPeriodAlready = pdFALSE;
|
||||
static unsigned long ulLastRegTest1Value = 0, ulLastRegTest2Value = 0;
|
||||
unsigned long ulErrorFound = pdFALSE;
|
||||
|
||||
/* Check all the demo tasks (other than the flash tasks) to ensure
|
||||
that they are all still running, and that none have detected an error. */
|
||||
|
||||
if( xAreMathsTaskStillRunning() != pdTRUE )
|
||||
{
|
||||
ulErrorFound = pdTRUE;
|
||||
}
|
||||
|
||||
if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
|
||||
{
|
||||
ulErrorFound = pdTRUE;
|
||||
}
|
||||
|
||||
if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )
|
||||
{
|
||||
ulErrorFound = pdTRUE;
|
||||
}
|
||||
|
||||
if( xAreBlockingQueuesStillRunning() != pdTRUE )
|
||||
{
|
||||
ulErrorFound = pdTRUE;
|
||||
}
|
||||
|
||||
if ( xAreBlockTimeTestTasksStillRunning() != pdTRUE )
|
||||
{
|
||||
ulErrorFound = pdTRUE;
|
||||
}
|
||||
|
||||
if ( xAreGenericQueueTasksStillRunning() != pdTRUE )
|
||||
{
|
||||
ulErrorFound = pdTRUE;
|
||||
}
|
||||
|
||||
if ( xAreRecursiveMutexTasksStillRunning() != pdTRUE )
|
||||
{
|
||||
ulErrorFound = pdTRUE;
|
||||
}
|
||||
|
||||
if( xIsCreateTaskStillRunning() != pdTRUE )
|
||||
{
|
||||
ulErrorFound = pdTRUE;
|
||||
}
|
||||
|
||||
if( xArePollingQueuesStillRunning() != pdTRUE )
|
||||
{
|
||||
ulErrorFound = pdTRUE;
|
||||
}
|
||||
|
||||
if( xAreSemaphoreTasksStillRunning() != pdTRUE )
|
||||
{
|
||||
ulErrorFound = pdTRUE;
|
||||
}
|
||||
|
||||
/* Check that the register test 1 task is still running. */
|
||||
if( ulLastRegTest1Value == ulRegTest1LoopCounter )
|
||||
{
|
||||
ulErrorFound = pdTRUE;
|
||||
}
|
||||
ulLastRegTest1Value = ulRegTest1LoopCounter;
|
||||
|
||||
/* Check that the register test 2 task is still running. */
|
||||
if( ulLastRegTest2Value == ulRegTest2LoopCounter )
|
||||
{
|
||||
ulErrorFound = pdTRUE;
|
||||
}
|
||||
ulLastRegTest2Value = ulRegTest2LoopCounter;
|
||||
|
||||
/* Toggle the check LED to give an indication of the system status. If
|
||||
the LED toggles every mainCHECK_TIMER_PERIOD_MS milliseconds then
|
||||
everything is ok. A faster toggle indicates an error. */
|
||||
mainTOGGLE_LED();
|
||||
|
||||
/* Have any errors been latch in ulErrorFound? If so, shorten the
|
||||
period of the check timer to mainERROR_CHECK_TIMER_PERIOD_MS milliseconds.
|
||||
This will result in an increase in the rate at which mainCHECK_LED
|
||||
toggles. */
|
||||
if( ulErrorFound != pdFALSE )
|
||||
{
|
||||
if( lChangedTimerPeriodAlready == pdFALSE )
|
||||
{
|
||||
lChangedTimerPeriodAlready = pdTRUE;
|
||||
|
||||
/* This call to xTimerChangePeriod() uses a zero block time.
|
||||
Functions called from inside of a timer callback function must
|
||||
*never* attempt to block. */
|
||||
xTimerChangePeriod( xTimer, ( mainERROR_CHECK_TIMER_PERIOD_MS ), mainDONT_BLOCK );
|
||||
}
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* This is a naked function. */
|
||||
static void vRegTest1Task( void *pvParameters )
|
||||
{
|
||||
__asm volatile
|
||||
(
|
||||
" /* Fill the core registers with known values. */ \n"
|
||||
" mov r0, #100 \n"
|
||||
" mov r1, #101 \n"
|
||||
" mov r2, #102 \n"
|
||||
" mov r3, #103 \n"
|
||||
" mov r4, #104 \n"
|
||||
" mov r5, #105 \n"
|
||||
" mov r6, #106 \n"
|
||||
" mov r7, #107 \n"
|
||||
" mov r8, #108 \n"
|
||||
" mov r9, #109 \n"
|
||||
" mov r10, #110 \n"
|
||||
" mov r11, #111 \n"
|
||||
" mov r12, #112 \n"
|
||||
" \n"
|
||||
" /* Fill the VFP registers with known values. */ \n"
|
||||
" vmov d0, r0, r1 \n"
|
||||
" vmov d1, r2, r3 \n"
|
||||
" vmov d2, r4, r5 \n"
|
||||
" vmov d3, r6, r7 \n"
|
||||
" vmov d4, r8, r9 \n"
|
||||
" vmov d5, r10, r11 \n"
|
||||
" vmov d6, r0, r1 \n"
|
||||
" vmov d7, r2, r3 \n"
|
||||
" vmov d8, r4, r5 \n"
|
||||
" vmov d9, r6, r7 \n"
|
||||
" vmov d10, r8, r9 \n"
|
||||
" vmov d11, r10, r11 \n"
|
||||
" vmov d12, r0, r1 \n"
|
||||
" vmov d13, r2, r3 \n"
|
||||
" vmov d14, r4, r5 \n"
|
||||
" vmov d15, r6, r7 \n"
|
||||
" \n"
|
||||
"reg1_loop: \n"
|
||||
" /* Check all the VFP registers still contain the values set above.\n"
|
||||
" First save registers that are clobbered by the test. */ \n"
|
||||
" push { r0-r1 } \n"
|
||||
" \n"
|
||||
" vmov r0, r1, d0 \n"
|
||||
" cmp r0, #100 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" cmp r1, #101 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" vmov r0, r1, d1 \n"
|
||||
" cmp r0, #102 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" cmp r1, #103 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" vmov r0, r1, d2 \n"
|
||||
" cmp r0, #104 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" cmp r1, #105 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" vmov r0, r1, d3 \n"
|
||||
" cmp r0, #106 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" cmp r1, #107 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" vmov r0, r1, d4 \n"
|
||||
" cmp r0, #108 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" cmp r1, #109 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" vmov r0, r1, d5 \n"
|
||||
" cmp r0, #110 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" cmp r1, #111 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" vmov r0, r1, d6 \n"
|
||||
" cmp r0, #100 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" cmp r1, #101 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" vmov r0, r1, d7 \n"
|
||||
" cmp r0, #102 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" cmp r1, #103 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" vmov r0, r1, d8 \n"
|
||||
" cmp r0, #104 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" cmp r1, #105 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" vmov r0, r1, d9 \n"
|
||||
" cmp r0, #106 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" cmp r1, #107 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" vmov r0, r1, d10 \n"
|
||||
" cmp r0, #108 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" cmp r1, #109 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" vmov r0, r1, d11 \n"
|
||||
" cmp r0, #110 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" cmp r1, #111 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" vmov r0, r1, d12 \n"
|
||||
" cmp r0, #100 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" cmp r1, #101 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" vmov r0, r1, d13 \n"
|
||||
" cmp r0, #102 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" cmp r1, #103 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" vmov r0, r1, d14 \n"
|
||||
" cmp r0, #104 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" cmp r1, #105 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" vmov r0, r1, d15 \n"
|
||||
" cmp r0, #106 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" cmp r1, #107 \n"
|
||||
" bne reg1_error_loopf \n"
|
||||
" \n"
|
||||
" /* Restore the registers that were clobbered by the test. */\n"
|
||||
" pop {r0-r1} \n"
|
||||
" \n"
|
||||
" /* VFP register test passed. Jump to the core register test. */\n"
|
||||
" b reg1_loopf_pass \n"
|
||||
" \n"
|
||||
"reg1_error_loopf: \n"
|
||||
" /* If this line is hit then a VFP register value was found to be\n"
|
||||
" incorrect. */ \n"
|
||||
" b reg1_error_loopf \n"
|
||||
" \n"
|
||||
"reg1_loopf_pass: \n"
|
||||
" \n"
|
||||
" cmp r0, #100 \n"
|
||||
" bne reg1_error_loop \n"
|
||||
" cmp r1, #101 \n"
|
||||
" bne reg1_error_loop \n"
|
||||
" cmp r2, #102 \n"
|
||||
" bne reg1_error_loop \n"
|
||||
" cmp r3, #103 \n"
|
||||
" bne reg1_error_loop \n"
|
||||
" cmp r4, #104 \n"
|
||||
" bne reg1_error_loop \n"
|
||||
" cmp r5, #105 \n"
|
||||
" bne reg1_error_loop \n"
|
||||
" cmp r6, #106 \n"
|
||||
" bne reg1_error_loop \n"
|
||||
" cmp r7, #107 \n"
|
||||
" bne reg1_error_loop \n"
|
||||
" cmp r8, #108 \n"
|
||||
" bne reg1_error_loop \n"
|
||||
" cmp r9, #109 \n"
|
||||
" bne reg1_error_loop \n"
|
||||
" cmp r10, #110 \n"
|
||||
" bne reg1_error_loop \n"
|
||||
" cmp r11, #111 \n"
|
||||
" bne reg1_error_loop \n"
|
||||
" cmp r12, #112 \n"
|
||||
" bne reg1_error_loop \n"
|
||||
" \n"
|
||||
" /* Everything passed, increment the loop counter. */ \n"
|
||||
" push { r0-r1 } \n"
|
||||
" ldr r0, =ulRegTest1LoopCounter \n"
|
||||
" ldr r1, [r0] \n"
|
||||
" adds r1, r1, #1 \n"
|
||||
" str r1, [r0] \n"
|
||||
" pop { r0-r1 } \n"
|
||||
" \n"
|
||||
" /* Start again. */ \n"
|
||||
" b reg1_loop \n"
|
||||
" \n"
|
||||
"reg1_error_loop: \n"
|
||||
" /* If this line is hit then there was an error in a core register value.\n"
|
||||
" The loop ensures the loop counter stops incrementing. */\n"
|
||||
" b reg1_error_loop \n"
|
||||
" nop "
|
||||
);
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* This is a naked function. */
|
||||
static void vRegTest2Task( void *pvParameters )
|
||||
{
|
||||
__asm volatile
|
||||
(
|
||||
" /* Set all the core registers to known values. */ \n"
|
||||
" mov r0, #-1 \n"
|
||||
" mov r1, #1 \n"
|
||||
" mov r2, #2 \n"
|
||||
" mov r3, #3 \n"
|
||||
" mov r4, #4 \n"
|
||||
" mov r5, #5 \n"
|
||||
" mov r6, #6 \n"
|
||||
" mov r7, #7 \n"
|
||||
" mov r8, #8 \n"
|
||||
" mov r9, #9 \n"
|
||||
" mov r10, #10 \n"
|
||||
" mov r11, #11 \n"
|
||||
" mov r12, #12 \n"
|
||||
" \n"
|
||||
" /* Set all the VFP to known values. */ \n"
|
||||
" vmov d0, r0, r1 \n"
|
||||
" vmov d1, r2, r3 \n"
|
||||
" vmov d2, r4, r5 \n"
|
||||
" vmov d3, r6, r7 \n"
|
||||
" vmov d4, r8, r9 \n"
|
||||
" vmov d5, r10, r11 \n"
|
||||
" vmov d6, r0, r1 \n"
|
||||
" vmov d7, r2, r3 \n"
|
||||
" vmov d8, r4, r5 \n"
|
||||
" vmov d9, r6, r7 \n"
|
||||
" vmov d10, r8, r9 \n"
|
||||
" vmov d11, r10, r11 \n"
|
||||
" vmov d12, r0, r1 \n"
|
||||
" vmov d13, r2, r3 \n"
|
||||
" vmov d14, r4, r5 \n"
|
||||
" vmov d15, r6, r7 \n"
|
||||
" \n"
|
||||
"reg2_loop: \n"
|
||||
" \n"
|
||||
" /* Check all the VFP registers still contain the values set above.\n"
|
||||
" First save registers that are clobbered by the test. */ \n"
|
||||
" push { r0-r1 } \n"
|
||||
" \n"
|
||||
" vmov r0, r1, d0 \n"
|
||||
" cmp r0, #-1 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" cmp r1, #1 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" vmov r0, r1, d1 \n"
|
||||
" cmp r0, #2 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" cmp r1, #3 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" vmov r0, r1, d2 \n"
|
||||
" cmp r0, #4 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" cmp r1, #5 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" vmov r0, r1, d3 \n"
|
||||
" cmp r0, #6 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" cmp r1, #7 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" vmov r0, r1, d4 \n"
|
||||
" cmp r0, #8 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" cmp r1, #9 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" vmov r0, r1, d5 \n"
|
||||
" cmp r0, #10 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" cmp r1, #11 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" vmov r0, r1, d6 \n"
|
||||
" cmp r0, #-1 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" cmp r1, #1 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" vmov r0, r1, d7 \n"
|
||||
" cmp r0, #2 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" cmp r1, #3 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" vmov r0, r1, d8 \n"
|
||||
" cmp r0, #4 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" cmp r1, #5 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" vmov r0, r1, d9 \n"
|
||||
" cmp r0, #6 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" cmp r1, #7 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" vmov r0, r1, d10 \n"
|
||||
" cmp r0, #8 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" cmp r1, #9 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" vmov r0, r1, d11 \n"
|
||||
" cmp r0, #10 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" cmp r1, #11 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" vmov r0, r1, d12 \n"
|
||||
" cmp r0, #-1 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" cmp r1, #1 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" vmov r0, r1, d13 \n"
|
||||
" cmp r0, #2 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" cmp r1, #3 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" vmov r0, r1, d14 \n"
|
||||
" cmp r0, #4 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" cmp r1, #5 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" vmov r0, r1, d15 \n"
|
||||
" cmp r0, #6 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" cmp r1, #7 \n"
|
||||
" bne reg2_error_loopf \n"
|
||||
" \n"
|
||||
" /* Restore the registers that were clobbered by the test. */\n"
|
||||
" pop {r0-r1} \n"
|
||||
" \n"
|
||||
" /* VFP register test passed. Jump to the core register test. */\n"
|
||||
" b reg2_loopf_pass \n"
|
||||
" \n"
|
||||
"reg2_error_loopf: \n"
|
||||
" /* If this line is hit then a VFP register value was found to be\n"
|
||||
" incorrect. */ \n"
|
||||
" b reg2_error_loopf \n"
|
||||
" \n"
|
||||
"reg2_loopf_pass: \n"
|
||||
" \n"
|
||||
" cmp r0, #-1 \n"
|
||||
" bne reg2_error_loop \n"
|
||||
" cmp r1, #1 \n"
|
||||
" bne reg2_error_loop \n"
|
||||
" cmp r2, #2 \n"
|
||||
" bne reg2_error_loop \n"
|
||||
" cmp r3, #3 \n"
|
||||
" bne reg2_error_loop \n"
|
||||
" cmp r4, #4 \n"
|
||||
" bne reg2_error_loop \n"
|
||||
" cmp r5, #5 \n"
|
||||
" bne reg2_error_loop \n"
|
||||
" cmp r6, #6 \n"
|
||||
" bne reg2_error_loop \n"
|
||||
" cmp r7, #7 \n"
|
||||
" bne reg2_error_loop \n"
|
||||
" cmp r8, #8 \n"
|
||||
" bne reg2_error_loop \n"
|
||||
" cmp r9, #9 \n"
|
||||
" bne reg2_error_loop \n"
|
||||
" cmp r10, #10 \n"
|
||||
" bne reg2_error_loop \n"
|
||||
" cmp r11, #11 \n"
|
||||
" bne reg2_error_loop \n"
|
||||
" cmp r12, #12 \n"
|
||||
" bne reg2_error_loop \n"
|
||||
" \n"
|
||||
" /* Increment the loop counter to indicate this test is still functioning\n"
|
||||
" correctly. */ \n"
|
||||
" push { r0-r1 } \n"
|
||||
" ldr r0, =ulRegTest2LoopCounter \n"
|
||||
" ldr r1, [r0] \n"
|
||||
" adds r1, r1, #1 \n"
|
||||
" str r1, [r0] \n"
|
||||
" pop { r0-r1 } \n"
|
||||
" \n"
|
||||
" /* Start again. */ \n"
|
||||
" b reg2_loop \n"
|
||||
" \n"
|
||||
"reg2_error_loop: \n"
|
||||
" /* If this line is hit then there was an error in a core register value.\n"
|
||||
" This loop ensures the loop counter variable stops incrementing. */\n"
|
||||
" b reg2_error_loop \n"
|
||||
" nop \n"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
@ -0,0 +1,652 @@
|
||||
/**
|
||||
*****************************************************************************
|
||||
**
|
||||
** File : startup_XMC4500.s
|
||||
**
|
||||
** Abstract : This assembler file contains interrupt vector and
|
||||
** startup code for Infineon XMC4500.
|
||||
**
|
||||
** Functions : Reset_Handler
|
||||
** Default_Handler
|
||||
**
|
||||
** Target : ARM Cortex-M4
|
||||
**
|
||||
** Environment : Atollic TrueSTUDIO(R)
|
||||
**
|
||||
** Distribution: The file is distributed “as is,” without any warranty
|
||||
** of any kind.
|
||||
**
|
||||
** (c)Copyright Atollic AB.
|
||||
** You may use this file as-is or modify it according to the needs of your
|
||||
** project. Distribution of this file (unmodified or modified) is not
|
||||
** permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the
|
||||
** rights to distribute the assembled, compiled & linked contents of this
|
||||
** file as part of an application binary file, provided that it is built
|
||||
** using the Atollic TrueSTUDIO(R) toolchain.
|
||||
**
|
||||
*****************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
**===========================================================================
|
||||
** Revisions
|
||||
**===========================================================================
|
||||
** Date Modification
|
||||
** 2011-12-30 First issue.
|
||||
**===========================================================================
|
||||
*/
|
||||
|
||||
/**
|
||||
**===========================================================================
|
||||
** Definitions
|
||||
**===========================================================================
|
||||
*/
|
||||
.syntax unified
|
||||
.cpu cortex-m4
|
||||
.fpu softvfp
|
||||
.thumb
|
||||
|
||||
.global g_pfnVectors
|
||||
.global Default_Handler
|
||||
|
||||
/* Linker script definitions */
|
||||
/* start address for the initialization values of the .data section */
|
||||
.word _sidata
|
||||
/* start address for the .data section */
|
||||
.word _sdata
|
||||
/* end address for the .data section */
|
||||
.word _edata
|
||||
/* start address for the .bss section */
|
||||
.word _sbss
|
||||
/* end address for the .bss section */
|
||||
.word _ebss
|
||||
|
||||
.equ PREF_PCON, 0x58004000
|
||||
.equ SCU_GCU_PEEN, 0x5000413C
|
||||
.equ SCU_GCU_PEFLAG, 0x50004150
|
||||
|
||||
/**
|
||||
**===========================================================================
|
||||
** Program - Reset_Handler
|
||||
** Abstract: This code gets called after a reset event.
|
||||
** 1. Copy .data section from ROM to RAM
|
||||
** 2. Clear .bss section (Zero init)
|
||||
** 3. Call system initialzation routine
|
||||
** 4. Run static constructors
|
||||
** 5. Enter main
|
||||
** 6. Loop forever if returning from main
|
||||
**===========================================================================
|
||||
*/
|
||||
.section .text.Reset_Handler
|
||||
.weak Reset_Handler
|
||||
.type Reset_Handler, %function
|
||||
Reset_Handler:
|
||||
|
||||
/* Remap vector table - added by RB. */
|
||||
ldr r0, =g_pfnVectors
|
||||
ldr r1, =0xE000ED08 /* VTOR register */
|
||||
str r0,[r1]
|
||||
|
||||
/* Disable Branch prediction */
|
||||
ldr r0,=PREF_PCON
|
||||
ldr r1,[r0]
|
||||
orr r1,r1,#0x00010000
|
||||
str r1,[r0]
|
||||
|
||||
/* Clear existing parity errors if any */
|
||||
ldr r0,=SCU_GCU_PEFLAG
|
||||
ldr r1,=0xFFFFFFFF
|
||||
str r1,[r0]
|
||||
|
||||
/* Disable parity */
|
||||
ldr r0,=SCU_GCU_PEEN
|
||||
mov r1,#0
|
||||
str r1,[R0]
|
||||
|
||||
/* Enable un-aligned memory access - added by RB. */
|
||||
ldr r1, =0xE000ED14
|
||||
ldr.w r0,[R1,#0x0]
|
||||
bic r0,r0,#0x8
|
||||
str.w r0,[r1,#0x0]
|
||||
|
||||
|
||||
ldr sp, =_estack /* set stack pointer */
|
||||
|
||||
/* 1. copy .data section (Copy from ROM to RAM) */
|
||||
movs r1, #0
|
||||
b LoopCopyDataInit
|
||||
|
||||
CopyDataInit:
|
||||
ldr r3, =_sidata
|
||||
ldr r3, [r3, r1]
|
||||
str r3, [r0, r1]
|
||||
adds r1, r1, #4
|
||||
|
||||
LoopCopyDataInit:
|
||||
ldr r0, =_sdata
|
||||
ldr r3, =_edata
|
||||
adds r2, r0, r1
|
||||
cmp r2, r3
|
||||
bcc CopyDataInit
|
||||
ldr r2, =_sbss
|
||||
b LoopFillZerobss
|
||||
|
||||
/* 2. Clear .bss section (Zero init) */
|
||||
FillZerobss:
|
||||
movs r3, #0
|
||||
str r3, [r2], #4
|
||||
|
||||
LoopFillZerobss:
|
||||
ldr r3, = _ebss
|
||||
cmp r2, r3
|
||||
bcc FillZerobss
|
||||
|
||||
/* 3. Call system initialzation routine */
|
||||
bl SystemInit
|
||||
|
||||
/* 4. Run static constructors */
|
||||
bl __libc_init_array
|
||||
|
||||
/* 5. Enter main */
|
||||
bl main
|
||||
|
||||
/* 6. Loop forever if returning from main */
|
||||
LoopForever:
|
||||
b LoopForever
|
||||
|
||||
|
||||
.size Reset_Handler, .-Reset_Handler
|
||||
|
||||
/**
|
||||
**===========================================================================
|
||||
** Program - Default_Handler
|
||||
** Abstract: This code gets called when the processor receives an
|
||||
** unexpected interrupt.
|
||||
**===========================================================================
|
||||
*/
|
||||
.section .text.Default_Handler,"ax",%progbits
|
||||
Default_Handler:
|
||||
InfiniteLoop:
|
||||
b InfiniteLoop
|
||||
.size Default_Handler, .-Default_Handler
|
||||
|
||||
/**
|
||||
**===========================================================================
|
||||
** Reset, Exception, and Interrupt vectors
|
||||
**===========================================================================
|
||||
*/
|
||||
.section .isr_vector,"a",%progbits
|
||||
.type g_pfnVectors, %object
|
||||
.size g_pfnVectors, .-g_pfnVectors
|
||||
|
||||
|
||||
g_pfnVectors:
|
||||
/* Processor exception vectors */
|
||||
.word _estack
|
||||
.word Reset_Handler
|
||||
.word NMI_Handler
|
||||
.word HardFault_Handler
|
||||
.word MemManage_Handler
|
||||
.word BusFault_Handler
|
||||
.word UsageFault_Handler
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
.word SVC_Handler
|
||||
.word DebugMon_Handler
|
||||
.word 0
|
||||
.word PendSV_Handler
|
||||
.word SysTick_Handler
|
||||
|
||||
/* Interrupt Handlers for XMC4500 Peripherals */
|
||||
.word SCU_0_IRQHandler /* Handler name for SR SCU_0 */
|
||||
.word ERU0_0_IRQHandler /* Handler name for SR ERU0_0 */
|
||||
.word ERU0_1_IRQHandler /* Handler name for SR ERU0_1 */
|
||||
.word ERU0_2_IRQHandler /* Handler name for SR ERU0_2 */
|
||||
.word ERU0_3_IRQHandler /* Handler name for SR ERU0_3 */
|
||||
.word ERU1_0_IRQHandler /* Handler name for SR ERU1_0 */
|
||||
.word ERU1_1_IRQHandler /* Handler name for SR ERU1_1 */
|
||||
.word ERU1_2_IRQHandler /* Handler name for SR ERU1_2 */
|
||||
.word ERU1_3_IRQHandler /* Handler name for SR ERU1_3 */
|
||||
.word 0 /* Not Available */
|
||||
.word 0 /* Not Available */
|
||||
.word 0 /* Not Available */
|
||||
.word PMU0_0_IRQHandler /* Handler name for SR PMU0_0 */
|
||||
.word 0 /* Not Available */
|
||||
.word VADC0_C0_0_IRQHandler /* Handler name for SR VADC0_C0_0 */
|
||||
.word VADC0_C0_1_IRQHandler /* Handler name for SR VADC0_C0_1 */
|
||||
.word VADC0_C0_2_IRQHandler /* Handler name for SR VADC0_C0_1 */
|
||||
.word VADC0_C0_3_IRQHandler /* Handler name for SR VADC0_C0_3 */
|
||||
.word VADC0_G0_0_IRQHandler /* Handler name for SR VADC0_G0_0 */
|
||||
.word VADC0_G0_1_IRQHandler /* Handler name for SR VADC0_G0_1 */
|
||||
.word VADC0_G0_2_IRQHandler /* Handler name for SR VADC0_G0_2 */
|
||||
.word VADC0_G0_3_IRQHandler /* Handler name for SR VADC0_G0_3 */
|
||||
.word VADC0_G1_0_IRQHandler /* Handler name for SR VADC0_G1_0 */
|
||||
.word VADC0_G1_1_IRQHandler /* Handler name for SR VADC0_G1_1 */
|
||||
.word VADC0_G1_2_IRQHandler /* Handler name for SR VADC0_G1_2 */
|
||||
.word VADC0_G1_3_IRQHandler /* Handler name for SR VADC0_G1_3 */
|
||||
.word VADC0_G2_0_IRQHandler /* Handler name for SR VADC0_G2_0 */
|
||||
.word VADC0_G2_1_IRQHandler /* Handler name for SR VADC0_G2_1 */
|
||||
.word VADC0_G2_2_IRQHandler /* Handler name for SR VADC0_G2_2 */
|
||||
.word VADC0_G2_3_IRQHandler /* Handler name for SR VADC0_G2_3 */
|
||||
.word VADC0_G3_0_IRQHandler /* Handler name for SR VADC0_G3_0 */
|
||||
.word VADC0_G3_1_IRQHandler /* Handler name for SR VADC0_G3_1 */
|
||||
.word VADC0_G3_2_IRQHandler /* Handler name for SR VADC0_G3_2 */
|
||||
.word VADC0_G3_3_IRQHandler /* Handler name for SR VADC0_G3_3 */
|
||||
.word DSD0_0_IRQHandler /* Handler name for SR DSD0_0 */
|
||||
.word DSD0_1_IRQHandler /* Handler name for SR DSD0_1 */
|
||||
.word DSD0_2_IRQHandler /* Handler name for SR DSD0_2 */
|
||||
.word DSD0_3_IRQHandler /* Handler name for SR DSD0_3 */
|
||||
.word DSD0_4_IRQHandler /* Handler name for SR DSD0_4 */
|
||||
.word DSD0_5_IRQHandler /* Handler name for SR DSD0_5 */
|
||||
.word DSD0_6_IRQHandler /* Handler name for SR DSD0_6 */
|
||||
.word DSD0_7_IRQHandler /* Handler name for SR DSD0_7 */
|
||||
.word DAC0_0_IRQHandler /* Handler name for SR DAC0_0 */
|
||||
.word DAC0_1_IRQHandler /* Handler name for SR DAC0_0 */
|
||||
.word CCU40_0_IRQHandler /* Handler name for SR CCU40_0 */
|
||||
.word CCU40_1_IRQHandler /* Handler name for SR CCU40_1 */
|
||||
.word CCU40_2_IRQHandler /* Handler name for SR CCU40_2 */
|
||||
.word CCU40_3_IRQHandler /* Handler name for SR CCU40_3 */
|
||||
.word CCU41_0_IRQHandler /* Handler name for SR CCU41_0 */
|
||||
.word CCU41_1_IRQHandler /* Handler name for SR CCU41_1 */
|
||||
.word CCU41_2_IRQHandler /* Handler name for SR CCU41_2 */
|
||||
.word CCU41_3_IRQHandler /* Handler name for SR CCU41_3 */
|
||||
.word CCU42_0_IRQHandler /* Handler name for SR CCU42_0 */
|
||||
.word CCU42_1_IRQHandler /* Handler name for SR CCU42_1 */
|
||||
.word CCU42_2_IRQHandler /* Handler name for SR CCU42_2 */
|
||||
.word CCU42_3_IRQHandler /* Handler name for SR CCU42_3 */
|
||||
.word CCU43_0_IRQHandler /* Handler name for SR CCU43_0 */
|
||||
.word CCU43_1_IRQHandler /* Handler name for SR CCU43_1 */
|
||||
.word CCU43_2_IRQHandler /* Handler name for SR CCU43_2 */
|
||||
.word CCU43_3_IRQHandler /* Handler name for SR CCU43_3 */
|
||||
.word CCU80_0_IRQHandler /* Handler name for SR CCU80_0 */
|
||||
.word CCU80_1_IRQHandler /* Handler name for SR CCU80_1 */
|
||||
.word CCU80_2_IRQHandler /* Handler name for SR CCU80_2 */
|
||||
.word CCU80_3_IRQHandler /* Handler name for SR CCU80_3 */
|
||||
.word CCU81_0_IRQHandler /* Handler name for SR CCU81_0 */
|
||||
.word CCU81_1_IRQHandler /* Handler name for SR CCU81_1 */
|
||||
.word CCU81_2_IRQHandler /* Handler name for SR CCU81_2 */
|
||||
.word CCU81_3_IRQHandler /* Handler name for SR CCU81_3 */
|
||||
.word POSIF0_0_IRQHandler /* Handler name for SR POSIF0_0 */
|
||||
.word POSIF0_1_IRQHandler /* Handler name for SR POSIF0_1 */
|
||||
.word POSIF1_0_IRQHandler /* Handler name for SR POSIF1_0 */
|
||||
.word POSIF1_1_IRQHandler /* Handler name for SR POSIF1_1 */
|
||||
.word 0 /* Not Available */
|
||||
.word 0 /* Not Available */
|
||||
.word 0 /* Not Available */
|
||||
.word 0 /* Not Available */
|
||||
.word CAN0_0_IRQHandler /* Handler name for SR CAN0_0 */
|
||||
.word CAN0_1_IRQHandler /* Handler name for SR CAN0_1 */
|
||||
.word CAN0_2_IRQHandler /* Handler name for SR CAN0_2 */
|
||||
.word CAN0_3_IRQHandler /* Handler name for SR CAN0_3 */
|
||||
.word CAN0_4_IRQHandler /* Handler name for SR CAN0_4 */
|
||||
.word CAN0_5_IRQHandler /* Handler name for SR CAN0_5 */
|
||||
.word CAN0_6_IRQHandler /* Handler name for SR CAN0_6 */
|
||||
.word CAN0_7_IRQHandler /* Handler name for SR CAN0_7 */
|
||||
.word USIC0_0_IRQHandler /* Handler name for SR USIC0_0 */
|
||||
.word USIC0_1_IRQHandler /* Handler name for SR USIC0_1 */
|
||||
.word USIC0_2_IRQHandler /* Handler name for SR USIC0_2 */
|
||||
.word USIC0_3_IRQHandler /* Handler name for SR USIC0_3 */
|
||||
.word USIC0_4_IRQHandler /* Handler name for SR USIC0_4 */
|
||||
.word USIC0_5_IRQHandler /* Handler name for SR USIC0_5 */
|
||||
.word USIC1_0_IRQHandler /* Handler name for SR USIC1_0 */
|
||||
.word USIC1_1_IRQHandler /* Handler name for SR USIC1_1 */
|
||||
.word USIC1_2_IRQHandler /* Handler name for SR USIC1_2 */
|
||||
.word USIC1_3_IRQHandler /* Handler name for SR USIC1_3 */
|
||||
.word USIC1_4_IRQHandler /* Handler name for SR USIC1_4 */
|
||||
.word USIC1_5_IRQHandler /* Handler name for SR USIC1_5 */
|
||||
.word USIC2_0_IRQHandler /* Handler name for SR USIC2_0 */
|
||||
.word USIC2_1_IRQHandler /* Handler name for SR USIC2_1 */
|
||||
.word USIC2_2_IRQHandler /* Handler name for SR USIC2_2 */
|
||||
.word USIC2_3_IRQHandler /* Handler name for SR USIC2_3 */
|
||||
.word USIC2_4_IRQHandler /* Handler name for SR USIC2_4 */
|
||||
.word USIC2_5_IRQHandler /* Handler name for SR USIC2_5 */
|
||||
.word LEDTS0_0_IRQHandler /* Handler name for SR LEDTS0_0 */
|
||||
.word 0 /* Not Available */
|
||||
.word FCE0_0_IRQHandler /* Handler name for SR FCE0_0 */
|
||||
.word GPDMA0_0_IRQHandler /* Handler name for SR GPDMA0_0 */
|
||||
.word SDMMC0_0_IRQHandler /* Handler name for SR SDMMC0_0 */
|
||||
.word USB0_0_IRQHandler /* Handler name for SR USB0_0 */
|
||||
.word ETH0_0_IRQHandler /* Handler name for SR ETH0_0 */
|
||||
.word 0 /* Not Available */
|
||||
.word GPDMA1_0_IRQHandler /* Handler name for SR GPDMA1_0 */
|
||||
.word 0 /* Not Available */
|
||||
|
||||
|
||||
/**
|
||||
**===========================================================================
|
||||
** Provide weak aliases for each Exception handler to the Default_Handler.
|
||||
**===========================================================================
|
||||
*/
|
||||
.weak NMI_Handler
|
||||
.thumb_set NMI_Handler,Default_Handler
|
||||
|
||||
.weak HardFault_Handler
|
||||
.thumb_set HardFault_Handler,Default_Handler
|
||||
|
||||
.weak MemManage_Handler
|
||||
.thumb_set MemManage_Handler,Default_Handler
|
||||
|
||||
.weak BusFault_Handler
|
||||
.thumb_set BusFault_Handler,Default_Handler
|
||||
|
||||
.weak UsageFault_Handler
|
||||
.thumb_set UsageFault_Handler,Default_Handler
|
||||
|
||||
.weak SVC_Handler
|
||||
.thumb_set SVC_Handler,Default_Handler
|
||||
|
||||
.weak DebugMon_Handler
|
||||
.thumb_set DebugMon_Handler,Default_Handler
|
||||
|
||||
.weak PendSV_Handler
|
||||
.thumb_set PendSV_Handler,Default_Handler
|
||||
|
||||
.weak SysTick_Handler
|
||||
.thumb_set SysTick_Handler,Default_Handler
|
||||
|
||||
.weak SCU_0_IRQHandler
|
||||
.thumb_set SCU_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak ERU0_0_IRQHandler
|
||||
.thumb_set ERU0_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak ERU0_1_IRQHandler
|
||||
.thumb_set ERU0_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak ERU0_2_IRQHandler
|
||||
.thumb_set ERU0_2_IRQHandler,Default_Handler
|
||||
|
||||
.weak ERU0_3_IRQHandler
|
||||
.thumb_set ERU0_3_IRQHandler,Default_Handler
|
||||
|
||||
.weak ERU1_0_IRQHandler
|
||||
.thumb_set ERU1_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak ERU1_1_IRQHandler
|
||||
.thumb_set ERU1_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak ERU1_2_IRQHandler
|
||||
.thumb_set ERU1_2_IRQHandler,Default_Handler
|
||||
|
||||
.weak ERU1_3_IRQHandler
|
||||
.thumb_set ERU1_3_IRQHandler,Default_Handler
|
||||
|
||||
.weak PMU0_0_IRQHandler
|
||||
.thumb_set PMU0_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak VADC0_C0_0_IRQHandler
|
||||
.thumb_set VADC0_C0_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak VADC0_C0_1_IRQHandler
|
||||
.thumb_set VADC0_C0_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak VADC0_C0_2_IRQHandler
|
||||
.thumb_set VADC0_C0_2_IRQHandler,Default_Handler
|
||||
|
||||
.weak VADC0_C0_3_IRQHandler
|
||||
.thumb_set VADC0_C0_3_IRQHandler,Default_Handler
|
||||
|
||||
.weak VADC0_G0_0_IRQHandler
|
||||
.thumb_set VADC0_G0_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak VADC0_G0_1_IRQHandler
|
||||
.thumb_set VADC0_G0_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak VADC0_G0_2_IRQHandler
|
||||
.thumb_set VADC0_G0_2_IRQHandler,Default_Handler
|
||||
|
||||
.weak VADC0_G0_3_IRQHandler
|
||||
.thumb_set VADC0_G0_3_IRQHandler,Default_Handler
|
||||
|
||||
.weak VADC0_G1_0_IRQHandler
|
||||
.thumb_set VADC0_G1_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak VADC0_G1_1_IRQHandler
|
||||
.thumb_set VADC0_G1_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak VADC0_G1_2_IRQHandler
|
||||
.thumb_set VADC0_G1_2_IRQHandler,Default_Handler
|
||||
|
||||
.weak VADC0_G1_3_IRQHandler
|
||||
.thumb_set VADC0_G1_3_IRQHandler,Default_Handler
|
||||
|
||||
.weak VADC0_G2_0_IRQHandler
|
||||
.thumb_set VADC0_G2_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak VADC0_G2_1_IRQHandler
|
||||
.thumb_set VADC0_G2_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak VADC0_G2_2_IRQHandler
|
||||
.thumb_set VADC0_G2_2_IRQHandler,Default_Handler
|
||||
|
||||
.weak VADC0_G2_3_IRQHandler
|
||||
.thumb_set VADC0_G2_3_IRQHandler,Default_Handler
|
||||
|
||||
.weak VADC0_G3_0_IRQHandler
|
||||
.thumb_set VADC0_G3_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak VADC0_G3_1_IRQHandler
|
||||
.thumb_set VADC0_G3_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak VADC0_G3_2_IRQHandler
|
||||
.thumb_set VADC0_G3_2_IRQHandler,Default_Handler
|
||||
|
||||
.weak VADC0_G3_3_IRQHandler
|
||||
.thumb_set VADC0_G3_3_IRQHandler,Default_Handler
|
||||
|
||||
.weak DSD0_0_IRQHandler
|
||||
.thumb_set DSD0_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak DSD0_1_IRQHandler
|
||||
.thumb_set DSD0_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak DSD0_2_IRQHandler
|
||||
.thumb_set DSD0_2_IRQHandler,Default_Handler
|
||||
|
||||
.weak DSD0_3_IRQHandler
|
||||
.thumb_set DSD0_3_IRQHandler,Default_Handler
|
||||
|
||||
.weak DSD0_4_IRQHandler
|
||||
.thumb_set DSD0_4_IRQHandler,Default_Handler
|
||||
|
||||
.weak DSD0_5_IRQHandler
|
||||
.thumb_set DSD0_5_IRQHandler,Default_Handler
|
||||
|
||||
.weak DSD0_6_IRQHandler
|
||||
.thumb_set DSD0_6_IRQHandler,Default_Handler
|
||||
|
||||
.weak DSD0_7_IRQHandler
|
||||
.thumb_set DSD0_7_IRQHandler,Default_Handler
|
||||
|
||||
.weak DAC0_0_IRQHandler
|
||||
.thumb_set DAC0_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak DAC0_1_IRQHandler
|
||||
.thumb_set DAC0_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU40_0_IRQHandler
|
||||
.thumb_set CCU40_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU40_1_IRQHandler
|
||||
.thumb_set CCU40_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU40_2_IRQHandler
|
||||
.thumb_set CCU40_2_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU40_3_IRQHandler
|
||||
.thumb_set CCU40_3_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU41_0_IRQHandler
|
||||
.thumb_set CCU41_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU41_1_IRQHandler
|
||||
.thumb_set CCU41_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU41_2_IRQHandler
|
||||
.thumb_set CCU41_2_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU41_3_IRQHandler
|
||||
.thumb_set CCU41_3_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU42_0_IRQHandler
|
||||
.thumb_set CCU42_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU42_1_IRQHandler
|
||||
.thumb_set CCU42_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU42_2_IRQHandler
|
||||
.thumb_set CCU42_2_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU42_3_IRQHandler
|
||||
.thumb_set CCU42_3_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU43_0_IRQHandler
|
||||
.thumb_set CCU43_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU43_1_IRQHandler
|
||||
.thumb_set CCU43_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU43_2_IRQHandler
|
||||
.thumb_set CCU43_2_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU43_3_IRQHandler
|
||||
.thumb_set CCU43_3_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU80_0_IRQHandler
|
||||
.thumb_set CCU80_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU80_1_IRQHandler
|
||||
.thumb_set CCU80_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU80_2_IRQHandler
|
||||
.thumb_set CCU80_2_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU80_3_IRQHandler
|
||||
.thumb_set CCU80_3_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU81_0_IRQHandler
|
||||
.thumb_set CCU81_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU81_1_IRQHandler
|
||||
.thumb_set CCU81_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU81_2_IRQHandler
|
||||
.thumb_set CCU81_2_IRQHandler,Default_Handler
|
||||
|
||||
.weak CCU81_3_IRQHandler
|
||||
.thumb_set CCU81_3_IRQHandler,Default_Handler
|
||||
|
||||
.weak POSIF0_0_IRQHandler
|
||||
.thumb_set POSIF0_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak POSIF0_1_IRQHandler
|
||||
.thumb_set POSIF0_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak POSIF1_0_IRQHandler
|
||||
.thumb_set POSIF1_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak POSIF1_1_IRQHandler
|
||||
.thumb_set POSIF1_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN0_0_IRQHandler
|
||||
.thumb_set CAN0_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN0_1_IRQHandler
|
||||
.thumb_set CAN0_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN0_2_IRQHandler
|
||||
.thumb_set CAN0_2_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN0_3_IRQHandler
|
||||
.thumb_set CAN0_3_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN0_4_IRQHandler
|
||||
.thumb_set CAN0_4_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN0_5_IRQHandler
|
||||
.thumb_set CAN0_5_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN0_6_IRQHandler
|
||||
.thumb_set CAN0_6_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN0_7_IRQHandler
|
||||
.thumb_set CAN0_7_IRQHandler,Default_Handler
|
||||
|
||||
.weak USIC0_0_IRQHandler
|
||||
.thumb_set USIC0_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak USIC0_1_IRQHandler
|
||||
.thumb_set USIC0_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak USIC0_2_IRQHandler
|
||||
.thumb_set USIC0_2_IRQHandler,Default_Handler
|
||||
|
||||
.weak USIC0_3_IRQHandler
|
||||
.thumb_set USIC0_3_IRQHandler,Default_Handler
|
||||
|
||||
.weak USIC0_4_IRQHandler
|
||||
.thumb_set USIC0_4_IRQHandler,Default_Handler
|
||||
|
||||
.weak USIC0_5_IRQHandler
|
||||
.thumb_set USIC0_5_IRQHandler,Default_Handler
|
||||
|
||||
.weak USIC1_0_IRQHandler
|
||||
.thumb_set USIC1_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak USIC1_1_IRQHandler
|
||||
.thumb_set USIC1_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak USIC1_2_IRQHandler
|
||||
.thumb_set USIC1_2_IRQHandler,Default_Handler
|
||||
|
||||
.weak USIC1_3_IRQHandler
|
||||
.thumb_set USIC1_3_IRQHandler,Default_Handler
|
||||
|
||||
.weak USIC1_4_IRQHandler
|
||||
.thumb_set USIC1_4_IRQHandler,Default_Handler
|
||||
|
||||
.weak USIC1_5_IRQHandler
|
||||
.thumb_set USIC1_5_IRQHandler,Default_Handler
|
||||
|
||||
.weak USIC2_0_IRQHandler
|
||||
.thumb_set USIC2_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak USIC2_1_IRQHandler
|
||||
.thumb_set USIC2_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak USIC2_2_IRQHandler
|
||||
.thumb_set USIC2_2_IRQHandler,Default_Handler
|
||||
|
||||
.weak USIC2_3_IRQHandler
|
||||
.thumb_set USIC2_3_IRQHandler,Default_Handler
|
||||
|
||||
.weak USIC2_4_IRQHandler
|
||||
.thumb_set USIC2_4_IRQHandler,Default_Handler
|
||||
|
||||
.weak USIC2_5_IRQHandler
|
||||
.thumb_set USIC2_5_IRQHandler,Default_Handler
|
||||
|
||||
.weak LEDTS0_0_IRQHandler
|
||||
.thumb_set LEDTS0_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak FCE0_0_IRQHandler
|
||||
.thumb_set FCE0_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak GPDMA0_0_IRQHandler
|
||||
.thumb_set GPDMA0_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak SDMMC0_0_IRQHandler
|
||||
.thumb_set SDMMC0_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak USB0_0_IRQHandler
|
||||
.thumb_set USB0_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak ETH0_0_IRQHandler
|
||||
.thumb_set ETH0_0_IRQHandler,Default_Handler
|
||||
|
||||
.weak GPDMA1_0_IRQHandler
|
||||
.thumb_set GPDMA1_0_IRQHandler,Default_Handler
|
||||
|
||||
.end
|
@ -0,0 +1,174 @@
|
||||
/*
|
||||
*****************************************************************************
|
||||
**
|
||||
** File : xmc4500_flash.ld
|
||||
**
|
||||
** Abstract : Linker script for XMC4500-E144x1024 Device with
|
||||
** 1024KByte FLASH, 64KByte RAM
|
||||
**
|
||||
** Set heap size, stack size and stack location according
|
||||
** to application requirements.
|
||||
**
|
||||
** Set memory bank area and size if external memory is used.
|
||||
**
|
||||
** Target : Infineon XMC4500
|
||||
**
|
||||
** Environment : Atollic TrueSTUDIO(R)
|
||||
**
|
||||
** Distribution: The file is distributed “as is,” without any warranty
|
||||
** of any kind.
|
||||
**
|
||||
** (c)Copyright Atollic AB.
|
||||
** You may use this file as-is or modify it according to the needs of your
|
||||
** project. Distribution of this file (unmodified or modified) is not
|
||||
** permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the
|
||||
** rights to distribute the assembled, compiled & linked contents of this
|
||||
** file as part of an application binary file, provided that it is built
|
||||
** using the Atollic TrueSTUDIO(R) toolchain.
|
||||
**
|
||||
*****************************************************************************
|
||||
*/
|
||||
|
||||
/* Entry Point */
|
||||
ENTRY(Reset_Handler)
|
||||
|
||||
/* Highest address of the user mode stack */
|
||||
_estack = 0x10010000; /* end of 64K RAM */
|
||||
|
||||
/* Generate a link error if heap and stack don't fit into RAM */
|
||||
_Min_Heap_Size = 0; /* required amount of heap */
|
||||
_Min_Stack_Size = 0x200; /* required amount of stack */
|
||||
|
||||
/* Specify the memory areas */
|
||||
MEMORY
|
||||
{
|
||||
FLASH1_cached (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
|
||||
FLASH1_uncached (rx) : ORIGIN = 0x0C000000, LENGTH = 1024K
|
||||
PSRAM1 (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
|
||||
DSRAM1_system (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
|
||||
DSRAM2_comm (xrw) : ORIGIN = 0x30000000, LENGTH = 32K
|
||||
MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K
|
||||
}
|
||||
|
||||
/* Define output sections */
|
||||
SECTIONS
|
||||
{
|
||||
/* The startup code goes first into FLASH */
|
||||
.isr_vector :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
_isr_vector = .; /* define isr_vector start address */
|
||||
KEEP(*(.isr_vector)) /* Startup code */
|
||||
. = ALIGN(4);
|
||||
} >FLASH1_uncached
|
||||
|
||||
/* The program code and other data goes into FLASH */
|
||||
.text :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
*(.text) /* .text sections (code) */
|
||||
*(.text*) /* .text* sections (code) */
|
||||
*(.rodata) /* .rodata sections (constants, strings, etc.) */
|
||||
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
|
||||
*(.glue_7) /* glue arm to thumb code */
|
||||
*(.glue_7t) /* glue thumb to arm code */
|
||||
*(.eh_frame)
|
||||
|
||||
KEEP (*(.init))
|
||||
KEEP (*(.fini))
|
||||
|
||||
. = ALIGN(4);
|
||||
_etext = .; /* define a global symbols at end of code */
|
||||
} >FLASH1_uncached
|
||||
|
||||
|
||||
.ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH1_uncached
|
||||
.ARM : {
|
||||
__exidx_start = .;
|
||||
*(.ARM.exidx*)
|
||||
__exidx_end = .;
|
||||
} >FLASH1_uncached
|
||||
|
||||
.preinit_array :
|
||||
{
|
||||
PROVIDE_HIDDEN (__preinit_array_start = .);
|
||||
KEEP (*(.preinit_array*))
|
||||
PROVIDE_HIDDEN (__preinit_array_end = .);
|
||||
} >FLASH1_uncached
|
||||
.init_array :
|
||||
{
|
||||
PROVIDE_HIDDEN (__init_array_start = .);
|
||||
KEEP (*(SORT(.init_array.*)))
|
||||
KEEP (*(.init_array*))
|
||||
PROVIDE_HIDDEN (__init_array_end = .);
|
||||
} >FLASH1_uncached
|
||||
.fini_array :
|
||||
{
|
||||
PROVIDE_HIDDEN (__fini_array_start = .);
|
||||
KEEP (*(SORT(.fini_array.*)))
|
||||
KEEP (*(.fini_array*))
|
||||
PROVIDE_HIDDEN (__fini_array_end = .);
|
||||
} >FLASH1_uncached
|
||||
|
||||
/* used by the startup to initialize data */
|
||||
_sidata = LOADADDR(.data);
|
||||
|
||||
/* Initialized data sections goes into RAM, load LMA copy after code */
|
||||
.data :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
_sdata = .; /* create a global symbol at data start */
|
||||
*(.data) /* .data sections */
|
||||
*(.data*) /* .data* sections */
|
||||
|
||||
. = ALIGN(4);
|
||||
_edata = .; /* define a global symbol at data end */
|
||||
} >DSRAM1_system AT> FLASH1_uncached
|
||||
|
||||
/* Uninitialized data section */
|
||||
. = ALIGN(4);
|
||||
.bss :
|
||||
{
|
||||
/* This is used by the startup in order to initialize the .bss secion */
|
||||
_sbss = .; /* define a global symbol at bss start */
|
||||
__bss_start__ = _sbss;
|
||||
*(.bss)
|
||||
*(.bss*)
|
||||
*(COMMON)
|
||||
|
||||
. = ALIGN(4);
|
||||
_ebss = .; /* define a global symbol at bss end */
|
||||
__bss_end__ = _ebss;
|
||||
} >DSRAM1_system
|
||||
|
||||
/* User_heap_stack section, used to check that there is enough RAM left */
|
||||
._user_heap_stack :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
PROVIDE ( end = . );
|
||||
PROVIDE ( _end = . );
|
||||
. = . + _Min_Heap_Size;
|
||||
. = . + _Min_Stack_Size;
|
||||
. = ALIGN(4);
|
||||
} >DSRAM1_system
|
||||
|
||||
/* MEMORY_bank1 section, code must be located here explicitly */
|
||||
/* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */
|
||||
.memory_b1_text :
|
||||
{
|
||||
*(.mb1text) /* .mb1text sections (code) */
|
||||
*(.mb1text*) /* .mb1text* sections (code) */
|
||||
*(.mb1rodata) /* read-only data (constants) */
|
||||
*(.mb1rodata*)
|
||||
} >MEMORY_B1
|
||||
|
||||
/* Remove information from the standard libraries */
|
||||
/DISCARD/ :
|
||||
{
|
||||
libc.a ( * )
|
||||
libm.a ( * )
|
||||
libgcc.a ( * )
|
||||
}
|
||||
|
||||
.ARM.attributes 0 : { *(.ARM.attributes) }
|
||||
}
|
Loading…
Reference in New Issue