Merge branch 'fix/new_st_lib' into 'develop'
Fix/new st lib See merge request !18
This commit is contained in:
@@ -23,22 +23,22 @@
|
|||||||
<tool id="org.eclipse.cdt.build.core.settings.holder.libs.583579175" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
|
<tool id="org.eclipse.cdt.build.core.settings.holder.libs.583579175" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
|
||||||
<tool id="org.eclipse.cdt.build.core.settings.holder.804428440" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
|
<tool id="org.eclipse.cdt.build.core.settings.holder.804428440" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||||
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1612628392" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1612628392" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||||
<listOptionValue builtIn="false" value="/opt/arm-2011.09/arm-none-eabi/include"/>
|
<listOptionValue builtIn="false" value="/opt/gcc-arm-none-eabi-5_4-2016q2/arm-none-eabi/include"/>
|
||||||
<listOptionValue builtIn="false" value="/opt/arm-2011.09/lib/gcc/arm-none-eabi/4.6.1/include"/>
|
<listOptionValue builtIn="false" value="/opt/gcc-arm-none-eabi-5_4-2016q2/lib/gcc/arm-none-eabi/5.4.1/include"/>
|
||||||
</option>
|
</option>
|
||||||
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1218410972" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1218410972" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||||
</tool>
|
</tool>
|
||||||
<tool id="org.eclipse.cdt.build.core.settings.holder.1838895569" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
|
<tool id="org.eclipse.cdt.build.core.settings.holder.1838895569" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||||
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1874409566" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1874409566" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||||
<listOptionValue builtIn="false" value="/opt/arm-2011.09/arm-none-eabi/include"/>
|
<listOptionValue builtIn="false" value="/opt/gcc-arm-none-eabi-5_4-2016q2/arm-none-eabi/include"/>
|
||||||
<listOptionValue builtIn="false" value="/opt/arm-2011.09/lib/gcc/arm-none-eabi/4.6.1/include"/>
|
<listOptionValue builtIn="false" value="/opt/gcc-arm-none-eabi-5_4-2016q2/lib/gcc/arm-none-eabi/5.4.1/include"/>
|
||||||
</option>
|
</option>
|
||||||
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.258587679" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.258587679" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||||
</tool>
|
</tool>
|
||||||
<tool id="org.eclipse.cdt.build.core.settings.holder.433020597" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
|
<tool id="org.eclipse.cdt.build.core.settings.holder.433020597" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||||
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.7772132" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.7772132" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||||
<listOptionValue builtIn="false" value="/opt/arm-2011.09/arm-none-eabi/include"/>
|
<listOptionValue builtIn="false" value="/opt/gcc-arm-none-eabi-5_4-2016q2/arm-none-eabi/include"/>
|
||||||
<listOptionValue builtIn="false" value="/opt/arm-2011.09/lib/gcc/arm-none-eabi/4.6.1/include"/>
|
<listOptionValue builtIn="false" value="/opt/gcc-arm-none-eabi-5_4-2016q2/lib/gcc/arm-none-eabi/5.4.1/include"/>
|
||||||
</option>
|
</option>
|
||||||
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.761231156" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.761231156" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||||
</tool>
|
</tool>
|
||||||
@@ -72,6 +72,8 @@
|
|||||||
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1491856129" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1491856129" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||||
<listOptionValue builtIn="false" value="/opt/arm-2011.09/arm-none-eabi/include"/>
|
<listOptionValue builtIn="false" value="/opt/arm-2011.09/arm-none-eabi/include"/>
|
||||||
<listOptionValue builtIn="false" value="/opt/arm-2011.09/lib/gcc/arm-none-eabi/4.6.1/include"/>
|
<listOptionValue builtIn="false" value="/opt/arm-2011.09/lib/gcc/arm-none-eabi/4.6.1/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="/opt/gcc-arm-none-eabi-5_4-2016q2/arm-none-eabi/include/stdio.h"/>
|
||||||
|
<listOptionValue builtIn="false" value="/opt/gcc-arm-none-eabi-5_4-2016q2/lib/gcc/arm-none-eabi/5.4.1/include"/>
|
||||||
</option>
|
</option>
|
||||||
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.275129533" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.275129533" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||||
</tool>
|
</tool>
|
||||||
@@ -79,6 +81,8 @@
|
|||||||
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.715382618" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.715382618" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||||
<listOptionValue builtIn="false" value="/opt/arm-2011.09/arm-none-eabi/include"/>
|
<listOptionValue builtIn="false" value="/opt/arm-2011.09/arm-none-eabi/include"/>
|
||||||
<listOptionValue builtIn="false" value="/opt/arm-2011.09/lib/gcc/arm-none-eabi/4.6.1/include"/>
|
<listOptionValue builtIn="false" value="/opt/arm-2011.09/lib/gcc/arm-none-eabi/4.6.1/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="/opt/gcc-arm-none-eabi-5_4-2016q2/arm-none-eabi/include/stdio.h"/>
|
||||||
|
<listOptionValue builtIn="false" value="/opt/gcc-arm-none-eabi-5_4-2016q2/lib/gcc/arm-none-eabi/5.4.1/include"/>
|
||||||
</option>
|
</option>
|
||||||
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1629243941" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1629243941" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||||
</tool>
|
</tool>
|
||||||
@@ -86,6 +90,8 @@
|
|||||||
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1688578924" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1688578924" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||||
<listOptionValue builtIn="false" value="/opt/arm-2011.09/arm-none-eabi/include"/>
|
<listOptionValue builtIn="false" value="/opt/arm-2011.09/arm-none-eabi/include"/>
|
||||||
<listOptionValue builtIn="false" value="/opt/arm-2011.09/lib/gcc/arm-none-eabi/4.6.1/include"/>
|
<listOptionValue builtIn="false" value="/opt/arm-2011.09/lib/gcc/arm-none-eabi/4.6.1/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="/opt/gcc-arm-none-eabi-5_4-2016q2/arm-none-eabi/include/stdio.h"/>
|
||||||
|
<listOptionValue builtIn="false" value="/opt/gcc-arm-none-eabi-5_4-2016q2/lib/gcc/arm-none-eabi/5.4.1/include"/>
|
||||||
</option>
|
</option>
|
||||||
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.683508981" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.683508981" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||||
</tool>
|
</tool>
|
||||||
@@ -110,13 +116,32 @@
|
|||||||
<configuration configurationName="Test Stm Debug">
|
<configuration configurationName="Test Stm Debug">
|
||||||
<resource resourceType="PROJECT" workspacePath="/kosmos"/>
|
<resource resourceType="PROJECT" workspacePath="/kosmos"/>
|
||||||
</configuration>
|
</configuration>
|
||||||
<configuration configurationName="Test msp Debug"/>
|
|
||||||
<configuration configurationName="ex_rx msp Debug"/>
|
|
||||||
<configuration configurationName="Debug">
|
<configuration configurationName="Debug">
|
||||||
<resource resourceType="PROJECT" workspacePath="/kosmos"/>
|
<resource resourceType="PROJECT" workspacePath="/kosmos"/>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
<configuration configurationName="Release"/>
|
||||||
|
<configuration configurationName="Test msp Debug"/>
|
||||||
|
<configuration configurationName="ex_rx msp Debug"/>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
|
<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
|
||||||
|
<storageModule moduleId="scannerConfiguration">
|
||||||
|
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||||
|
<scannerConfigBuildInfo instanceId="0.1571827594.174997613.1900689539">
|
||||||
|
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||||
|
</scannerConfigBuildInfo>
|
||||||
|
<scannerConfigBuildInfo instanceId="0.1571827594.174997613">
|
||||||
|
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||||
|
</scannerConfigBuildInfo>
|
||||||
|
<scannerConfigBuildInfo instanceId="0.1571827594">
|
||||||
|
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||||
|
</scannerConfigBuildInfo>
|
||||||
|
<scannerConfigBuildInfo instanceId="0.1571827594.174997613.1900689539.492450098">
|
||||||
|
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||||
|
</scannerConfigBuildInfo>
|
||||||
|
<scannerConfigBuildInfo instanceId="0.1571827594.511870544">
|
||||||
|
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||||
|
</scannerConfigBuildInfo>
|
||||||
|
</storageModule>
|
||||||
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
|
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
|
||||||
<buildTargets>
|
<buildTargets>
|
||||||
<target name="all" path="software/source/test/firmware/kernel/list" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
<target name="all" path="software/source/test/firmware/kernel/list" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
@@ -198,26 +223,26 @@
|
|||||||
<useDefaultCommand>true</useDefaultCommand>
|
<useDefaultCommand>true</useDefaultCommand>
|
||||||
<runAllBuilders>true</runAllBuilders>
|
<runAllBuilders>true</runAllBuilders>
|
||||||
</target>
|
</target>
|
||||||
<target name="debug all" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
<target name="blinky debug test" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
<buildCommand>make</buildCommand>
|
<buildCommand>make</buildCommand>
|
||||||
<buildArguments>BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
<buildArguments>TEST_APP=blinky BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
||||||
<buildTarget>all</buildTarget>
|
<buildTarget>test</buildTarget>
|
||||||
<stopOnError>true</stopOnError>
|
<stopOnError>true</stopOnError>
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
<runAllBuilders>true</runAllBuilders>
|
<runAllBuilders>true</runAllBuilders>
|
||||||
</target>
|
</target>
|
||||||
<target name="debug clean" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
<target name="blinky debug clean" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
<buildCommand>make</buildCommand>
|
<buildCommand>make</buildCommand>
|
||||||
<buildArguments> BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
<buildArguments> TEST_APP=blinky BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
||||||
<buildTarget>clean</buildTarget>
|
<buildTarget>clean</buildTarget>
|
||||||
<stopOnError>true</stopOnError>
|
<stopOnError>true</stopOnError>
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
<runAllBuilders>true</runAllBuilders>
|
<runAllBuilders>true</runAllBuilders>
|
||||||
</target>
|
</target>
|
||||||
<target name="debug deploy" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
<target name="blinky debug install" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
<buildCommand>make</buildCommand>
|
<buildCommand>make</buildCommand>
|
||||||
<buildArguments> BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
<buildArguments> TEST_APP=blinky BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
||||||
<buildTarget>deploy</buildTarget>
|
<buildTarget>install</buildTarget>
|
||||||
<stopOnError>true</stopOnError>
|
<stopOnError>true</stopOnError>
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
<runAllBuilders>true</runAllBuilders>
|
<runAllBuilders>true</runAllBuilders>
|
||||||
@@ -227,34 +252,26 @@
|
|||||||
<buildArguments/>
|
<buildArguments/>
|
||||||
<buildTarget>distclean</buildTarget>
|
<buildTarget>distclean</buildTarget>
|
||||||
<stopOnError>true</stopOnError>
|
<stopOnError>true</stopOnError>
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
<useDefaultCommand>true</useDefaultCommand>
|
||||||
<runAllBuilders>true</runAllBuilders>
|
<runAllBuilders>true</runAllBuilders>
|
||||||
</target>
|
</target>
|
||||||
<target name="release all" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
<target name="kosmos debug deploy" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
<buildCommand>make</buildCommand>
|
<buildCommand>make</buildCommand>
|
||||||
<buildArguments>BOARD=stm32f4-discovery</buildArguments>
|
<buildArguments>TEST_APP=blinky BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
||||||
<buildTarget>all</buildTarget>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>true</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="release clean" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildArguments> BOARD=stm32f4-discovery</buildArguments>
|
|
||||||
<buildTarget>clean</buildTarget>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>true</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="release deploy" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildArguments> BOARD=stm32f4-discovery</buildArguments>
|
|
||||||
<buildTarget>deploy</buildTarget>
|
<buildTarget>deploy</buildTarget>
|
||||||
<stopOnError>true</stopOnError>
|
<stopOnError>true</stopOnError>
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
<runAllBuilders>true</runAllBuilders>
|
<runAllBuilders>true</runAllBuilders>
|
||||||
</target>
|
</target>
|
||||||
<target name="test shell" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
<target name="uart test" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments>TEST_APP=uart BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
||||||
|
<buildTarget>test</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
<target name="shell test" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
<buildCommand>make</buildCommand>
|
<buildCommand>make</buildCommand>
|
||||||
<buildArguments>TEST_APP=shell BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
<buildArguments>TEST_APP=shell BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
||||||
<buildTarget>test</buildTarget>
|
<buildTarget>test</buildTarget>
|
||||||
@@ -262,15 +279,7 @@
|
|||||||
<useDefaultCommand>false</useDefaultCommand>
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
<runAllBuilders>true</runAllBuilders>
|
<runAllBuilders>true</runAllBuilders>
|
||||||
</target>
|
</target>
|
||||||
<target name="test shell install" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
<target name="pwm test" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildArguments>TEST_APP=shell BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
|
||||||
<buildTarget>install</buildTarget>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>true</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="test pwm" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
<buildCommand>make</buildCommand>
|
||||||
<buildArguments>TEST_APP=pwm BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
<buildArguments>TEST_APP=pwm BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
||||||
<buildTarget>test</buildTarget>
|
<buildTarget>test</buildTarget>
|
||||||
@@ -278,14 +287,6 @@
|
|||||||
<useDefaultCommand>false</useDefaultCommand>
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
<runAllBuilders>true</runAllBuilders>
|
<runAllBuilders>true</runAllBuilders>
|
||||||
</target>
|
</target>
|
||||||
<target name="test pwm install" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildArguments>TEST_APP=pwm BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
|
||||||
<buildTarget>install</buildTarget>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>true</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="msp430-ccrf example_radio_rx all" path="software/source/test" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
<target name="msp430-ccrf example_radio_rx all" path="software/source/test" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
<buildCommand>make</buildCommand>
|
<buildCommand>make</buildCommand>
|
||||||
<buildArguments>APP=example_radio_rx BOARD=msp430-ccrf DEBUG=y</buildArguments>
|
<buildArguments>APP=example_radio_rx BOARD=msp430-ccrf DEBUG=y</buildArguments>
|
||||||
@@ -328,22 +329,4 @@
|
|||||||
</target>
|
</target>
|
||||||
</buildTargets>
|
</buildTargets>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="scannerConfiguration">
|
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
|
||||||
<scannerConfigBuildInfo instanceId="0.1571827594.174997613.1900689539">
|
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
|
||||||
</scannerConfigBuildInfo>
|
|
||||||
<scannerConfigBuildInfo instanceId="0.1571827594.174997613">
|
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
|
||||||
</scannerConfigBuildInfo>
|
|
||||||
<scannerConfigBuildInfo instanceId="0.1571827594">
|
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
|
||||||
</scannerConfigBuildInfo>
|
|
||||||
<scannerConfigBuildInfo instanceId="0.1571827594.174997613.1900689539.492450098">
|
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
|
||||||
</scannerConfigBuildInfo>
|
|
||||||
<scannerConfigBuildInfo instanceId="0.1571827594.511870544">
|
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
|
||||||
</scannerConfigBuildInfo>
|
|
||||||
</storageModule>
|
|
||||||
</cproject>
|
</cproject>
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
include config/make/rules.mk
|
include config/make/rules.mk
|
||||||
|
OS_NAME := kosmos
|
||||||
OS_NAME = kosmos
|
|
||||||
|
|
||||||
# version numbering deployed by ci deploy script - no necessary for local build
|
# version numbering deployed by ci deploy script - no necessary for local build
|
||||||
ifdef SW_KERNEL
|
ifdef SW_KERNEL
|
||||||
@@ -9,83 +8,54 @@ else
|
|||||||
VERSION :=
|
VERSION :=
|
||||||
endif
|
endif
|
||||||
|
|
||||||
MAINFILE = $(EXE_DIR)/lib$(OS_NAME)-$(ARCH)-$(BOARD)$(VERSION)$(DBG_EXT)$(LIB_EXT)
|
MAIN_FILE = $(EXE_DIR)/lib$(OS_NAME)-$(ARCH)-$(BOARD)$(VERSION)$(DBG_EXT)$(LIB_EXT)
|
||||||
DEPLOY_PACKET = lib$(OS_NAME)-$(ARCH)-$(BOARD)$(VERSION)$(DBG_EXT).tar.xz
|
DEPLOY_PACKET = lib$(OS_NAME)-$(ARCH)-$(BOARD)$(VERSION)$(DBG_EXT).tar.xz
|
||||||
|
|
||||||
TEST_FILE = $(EXE_DIR)/$(TEST_APP)$(ELF_EXT)
|
TEST_FILE = $(EXE_DIR)/$(TEST_APP)$(ELF_EXT)
|
||||||
BIN_FILE = $(EXE_DIR)/$(TEST_APP)$(BIN_EXT)
|
BIN_FILE = $(EXE_DIR)/$(TEST_APP)$(BIN_EXT)
|
||||||
HEX_FILE = $(EXE_DIR)/$(TEST_APP)$(HEX_EXT)
|
HEX_FILE = $(EXE_DIR)/$(TEST_APP)$(HEX_EXT)
|
||||||
SIZE_FILE = $(SIZE_DIR)/$(TEST_APP)$(SIZE_EXT)
|
SIZE_FILE = $(SIZE_DIR)/$(TEST_APP)$(SIZE_EXT)
|
||||||
|
MAP_FILE = $(MAP_DIR)/$(TEST_APP)$(MAP_EXT)
|
||||||
|
|
||||||
SUB_FOLDER :=
|
OBJ_DIR = release/object/debug
|
||||||
CHECK_FOLDER :=
|
EXE_DIR = release/execute/debug
|
||||||
SOURCES := $(wildcard $(SRC_DIR)/*.c)
|
|
||||||
ASM_SOURCES := $(wildcard $(SRC_DIR)/*.s)
|
|
||||||
|
|
||||||
OBJECTS = $(SOURCES:$(ROOT_DIR)/%.c=$(OBJ_DIR)/%.o)
|
|
||||||
ASM_OBJECTS = $(ASMSOURCES:$(ROOT_DIR)/%.s=$(OBJ_DIR)/%.o)
|
|
||||||
DEPS = $(SOURCES:$(ROOT_DIR)/%.c=$(OBJ_DIR)/%.d)
|
|
||||||
|
|
||||||
#include subfolders
|
#include subfolders
|
||||||
include source/firmware/firmware.mk
|
include source/firmware/firmware.mk
|
||||||
ifdef TEST_APP
|
ifdef TEST_APP
|
||||||
include source/test/test.mk
|
include source/test/test.mk
|
||||||
CFLAGS += -DTEST_APP
|
C_FLAGS += -DTEST_APP
|
||||||
endif
|
endif
|
||||||
|
|
||||||
SOURCES += $(foreach folder, $(SUB_FOLDER), $(wildcard $(ROOT_DIR)/$(folder)/*.c))
|
C_SOURCES := $(foreach folder, $(SRC_DIR), $(wildcard $(folder)/*.c))
|
||||||
CHECKSOURCES += $(foreach folder, $(CHECK_FOLDER), $(wildcard $(ROOT_DIR)/$(folder)/*.c))
|
C_OBJECTS := $(C_SOURCES:%.c=$(OBJ_DIR)/%.o)
|
||||||
ASMSOURCES += $(foreach folder, $(SUB_FOLDER), $(wildcard $(ROOT_DIR)/$(folder)/*.s))
|
C_DEPS := $(SOURCES:%.c=$(OBJ_DIR)/%.d)
|
||||||
|
|
||||||
all: check $(MAINFILE)
|
all: $(MAIN_FILE)
|
||||||
|
|
||||||
deploy: all
|
deploy: all
|
||||||
@$(MKDIR) $(EXE_DIR)/include
|
@$(MKDIR) $(EXE_DIR)/include
|
||||||
$(SRC_DIR)/scripts/board_interface.py -b "$(SRC_DIR)/firmware/arch/$(CPU)/board/$(BOARD)/include/$(BOARD).h" -o "$(EXE_DIR)/include/board_devices.h"
|
$(ROOT_DIR)/source/scripts/board_interface.py -b "$(ROOT_DIR)/source/firmware/arch/$(CPU)/board/$(BOARD)/include/$(BOARD).h" -o "$(EXE_DIR)/include/board_devices.h"
|
||||||
$(SRC_DIR)/scripts/stack_interface.py -i "$(SRC_DIR)/firmware/arch/$(CPU)/include/$(CPU)_stack.h" -o "$(EXE_DIR)/include/stack.h"
|
$(ROOT_DIR)/source/scripts/stack_interface.py -i "$(ROOT_DIR)/source/firmware/arch/$(CPU)/include/$(CPU)_stack.h" -o "$(EXE_DIR)/include/stack.h"
|
||||||
cp $(SRC_DIR)/firmware/kernel/interface/*.* $(EXE_DIR)/include/
|
cp $(ROOT_DIR)/source/firmware/kernel/interface/*.* $(EXE_DIR)/include/
|
||||||
tar cvJf $(DEPLOY_PACKET) -C $(EXE_DIR) .
|
tar cvJf $(DEPLOY_PACKET) -C $(EXE_DIR) .
|
||||||
|
|
||||||
check:
|
|
||||||
$(CPPCHECK) $(CPPCHECK_FLAGS) $(CHECKSOURCES)
|
|
||||||
|
|
||||||
|
$(MAIN_FILE): $(C_OBJECTS)
|
||||||
$(MAINFILE): $(OBJECTS) $(ASM_OBJECTS)
|
|
||||||
@$(MKDIR) $(EXE_DIR)
|
@$(MKDIR) $(EXE_DIR)
|
||||||
$(AR) rcs $(MAINFILE) $(OBJECTS) $(ASM_OBJECTS)
|
$(AR) $(AR_FLAGS) $(MAIN_FILE) $(C_OBJECTS)
|
||||||
|
|
||||||
$(OBJ_DIR)/%.o: $(ROOT_DIR)/%.c
|
$(OBJ_DIR)/%.o: %.c
|
||||||
@rm -rf $(LIB)
|
@mkdir -p $(OBJ_DIR)
|
||||||
@$(MKDIR) $(OBJ_DIR)
|
@$(foreach folder, $(SRC_DIR), $(shell mkdir -p $(OBJ_DIR)/$(folder)))
|
||||||
@$(foreach folder, $(SUB_FOLDER), $(shell mkdir -p $(OBJ_DIR)/$(folder)))
|
$(call makedep,$<,$@,$(subst .o,.d,$@),$(GEN_FLAGS) $(C_FLAGS))
|
||||||
$(call makedep,$<,$@,$(subst .o,.d,$@))
|
$(CC) $(GEN_FLAGS) $(C_FLAGS) -c -o "$@" "$<"
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
|
||||||
|
|
||||||
$(OBJ_DIR)/%.o: $(ROOT_DIR)/%.s
|
test: $(C_OBJECTS)
|
||||||
@$(MKDIR) $(OBJ_DIR)
|
|
||||||
@$(foreach folder, $(SUB_FOLDER), $(shell mkdir -p $(OBJ_DIR)/$(folder)))
|
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(foreach folder, $(SUB_FOLDER), $(shell rm -f $(OBJ_DIR)/$(folder)/*.o))
|
|
||||||
$(foreach folder, $(SUB_FOLDER), $(shell rm -f $(OBJ_DIR)/$(folder)/*.d))
|
|
||||||
-rm -f $(OBJ_DIR)/*.o \
|
|
||||||
$(EXE_DIR)/include/* \
|
|
||||||
$(OBJ_DIR)/*.d \
|
|
||||||
$(MAINFILE)
|
|
||||||
|
|
||||||
distclean:
|
|
||||||
-rm -rf $(ROOT_DIR)/release
|
|
||||||
|
|
||||||
doc:
|
|
||||||
@$(MKDIR) $(DOC_DIR)
|
|
||||||
(cat $(DOXYFILE) ; echo "INPUT=$(DOC_SRC)" ; echo "OUTPUT_DIRECTORY=$(DOC_DIR)") | doxygen -
|
|
||||||
|
|
||||||
test: $(OBJECTS) $(ASM_OBJECTS)
|
|
||||||
@$(MKDIR) $(EXE_DIR)
|
@$(MKDIR) $(EXE_DIR)
|
||||||
@$(MKDIR) $(MAP_DIR)
|
@$(MKDIR) $(MAP_DIR)
|
||||||
@$(MKDIR) $(SIZE_DIR)
|
@$(MKDIR) $(SIZE_DIR)
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJECTS) $(ASM_OBJECTS) -o $(TEST_FILE)
|
$(CXX) $(GEN_FLAGS) $(L_FLAGS) -Wl,-Map,"$(MAP_FILE)" -o "$(TEST_FILE)" $(C_OBJECTS)
|
||||||
$(OBJCOPY) $(TEST_FILE) -O binary $(BIN_FILE)
|
$(OBJCOPY) $(TEST_FILE) -O binary $(BIN_FILE)
|
||||||
$(OBJCOPY) $(TEST_FILE) -O ihex $(HEX_FILE)
|
$(OBJCOPY) $(TEST_FILE) -O ihex $(HEX_FILE)
|
||||||
$(NM) --size-sort --print-size $(TEST_FILE) > $(SIZE_FILE)
|
$(NM) --size-sort --print-size $(TEST_FILE) > $(SIZE_FILE)
|
||||||
@@ -93,14 +63,25 @@ test: $(OBJECTS) $(ASM_OBJECTS)
|
|||||||
@$(SIZE) --format=berkeley -x $(TEST_FILE)
|
@$(SIZE) --format=berkeley -x $(TEST_FILE)
|
||||||
@echo
|
@echo
|
||||||
|
|
||||||
install: test
|
clean:
|
||||||
|
$(foreach folder, $(SRC_DIR), $(shell rm -f $(OBJ_DIR)/$(folder)/*.o))
|
||||||
|
$(foreach folder, $(SRC_DIR), $(shell rm -f $(OBJ_DIR)/$(folder)/*.d))
|
||||||
|
-rm -f $(OBJ_DIR)/*.o \
|
||||||
|
$(OBJ_DIR)/*.d \
|
||||||
|
$(MAIN_FILE) \
|
||||||
|
$(BIN_FILE)
|
||||||
|
|
||||||
|
distclean:
|
||||||
|
-rm -rf $(ROOT_DIR)/release
|
||||||
|
|
||||||
|
install: all
|
||||||
$(PRE_PROGRAM)
|
$(PRE_PROGRAM)
|
||||||
$(PROGRAM)
|
$(PROGRAM)
|
||||||
|
|
||||||
ifneq "$(MAKECMDGOALS)" "clean"
|
ifneq "$(MAKECMDGOALS)" "clean"
|
||||||
-include $(DEPS)
|
-include $(C_DEPS)
|
||||||
else
|
else
|
||||||
ifneq "$(MAKECMDGOALS)" "distclean"
|
ifneq "$(MAKECMDGOALS)" "distclean"
|
||||||
-include $(DEPS)
|
-include $(C_DEPS)
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
#!/usr/bin/python2
|
|
||||||
import os
|
|
||||||
os.system("source/scripts/get_history.py")
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
#!/usr/bin/python2
|
|
||||||
import os
|
|
||||||
os.system("source/scripts/get_history.py")
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* Placeholder to list other libraries required by the application.
|
||||||
|
|
||||||
|
GROUP(
|
||||||
|
)
|
||||||
|
|
||||||
|
*/
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Memory Spaces Definitions.
|
||||||
|
*
|
||||||
|
* Need modifying for a specific board.
|
||||||
|
* FLASH.ORIGIN: starting address of flash
|
||||||
|
* FLASH.LENGTH: length of flash
|
||||||
|
* RAM.ORIGIN: starting address of RAM bank 0
|
||||||
|
* RAM.LENGTH: length of RAM bank 0
|
||||||
|
*
|
||||||
|
* The values below can be addressed in further linker scripts
|
||||||
|
* using functions like 'ORIGIN(RAM)' or 'LENGTH(RAM)'.
|
||||||
|
*/
|
||||||
|
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
|
||||||
|
CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
|
||||||
|
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
|
||||||
|
FLASHB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
|
||||||
|
EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENGTH = 0
|
||||||
|
EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
|
||||||
|
EXTMEMB2 (rx) : ORIGIN = 0x00000000, LENGTH = 0
|
||||||
|
EXTMEMB3 (rx) : ORIGIN = 0x00000000, LENGTH = 0
|
||||||
|
MEMORY_ARRAY (xrw) : ORIGIN = 0x20002000, LENGTH = 32
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For external ram use something like:
|
||||||
|
|
||||||
|
RAM (xrw) : ORIGIN = 0x64000000, LENGTH = 2048K
|
||||||
|
|
||||||
|
*/
|
||||||
@@ -0,0 +1,445 @@
|
|||||||
|
/*
|
||||||
|
* Default linker script for Cortex-M (it includes specifics for STM32F[34]xx).
|
||||||
|
*
|
||||||
|
* To make use of the multi-region initialisations, define
|
||||||
|
* OS_INCLUDE_STARTUP_INIT_MULTIPLE_RAM_SECTIONS for the _startup.c file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The '__stack' definition is required by crt0, do not remove it.
|
||||||
|
*/
|
||||||
|
__stack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
|
||||||
|
_estack = __stack; /* STM specific definition */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Default stack sizes.
|
||||||
|
* These are used by the startup in order to allocate stacks
|
||||||
|
* for the different modes.
|
||||||
|
*/
|
||||||
|
|
||||||
|
__Main_Stack_Size = 1024 ;
|
||||||
|
|
||||||
|
PROVIDE ( _Main_Stack_Size = __Main_Stack_Size ) ;
|
||||||
|
|
||||||
|
__Main_Stack_Limit = __stack - __Main_Stack_Size ;
|
||||||
|
|
||||||
|
/* "PROVIDE" allows to easily override these values from an
|
||||||
|
* object file or the command line. */
|
||||||
|
PROVIDE ( _Main_Stack_Limit = __Main_Stack_Limit ) ;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* There will be a link error if there is not this amount of
|
||||||
|
* RAM free at the end.
|
||||||
|
*/
|
||||||
|
_Minimum_Stack_Size = 256 ;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Default heap definitions.
|
||||||
|
* The heap start immediately after the last statically allocated
|
||||||
|
* .sbss/.noinit section, and extends up to the main stack limit.
|
||||||
|
*/
|
||||||
|
PROVIDE ( _Heap_Begin = _end_noinit ) ;
|
||||||
|
PROVIDE ( _Heap_Limit = __stack - __Main_Stack_Size ) ;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The entry point is informative, for debuggers and simulators,
|
||||||
|
* since the Cortex-M vector points to it anyway.
|
||||||
|
*/
|
||||||
|
ENTRY(_start)
|
||||||
|
|
||||||
|
|
||||||
|
/* Sections Definitions */
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* For Cortex-M devices, the beginning of the startup code is stored in
|
||||||
|
* the .isr_vector section, which goes to FLASH.
|
||||||
|
*/
|
||||||
|
.isr_vector : ALIGN(4)
|
||||||
|
{
|
||||||
|
FILL(0xFF)
|
||||||
|
|
||||||
|
__vectors_start = ABSOLUTE(.) ;
|
||||||
|
__vectors_start__ = ABSOLUTE(.) ; /* STM specific definition */
|
||||||
|
KEEP(*(.isr_vector)) /* Interrupt vectors */
|
||||||
|
|
||||||
|
KEEP(*(.cfmconfig)) /* Freescale configuration words */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This section is here for convenience, to store the
|
||||||
|
* startup code at the beginning of the flash area, hoping that
|
||||||
|
* this will increase the readability of the listing.
|
||||||
|
*/
|
||||||
|
*(.after_vectors .after_vectors.*) /* Startup code and ISR */
|
||||||
|
|
||||||
|
} >FLASH
|
||||||
|
|
||||||
|
.inits : ALIGN(4)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Memory regions initialisation arrays.
|
||||||
|
*
|
||||||
|
* Thee are two kinds of arrays for each RAM region, one for
|
||||||
|
* data and one for bss. Each is iterrated at startup and the
|
||||||
|
* region initialisation is performed.
|
||||||
|
*
|
||||||
|
* The data array includes:
|
||||||
|
* - from (LOADADDR())
|
||||||
|
* - region_begin (ADDR())
|
||||||
|
* - region_end (ADDR()+SIZEOF())
|
||||||
|
*
|
||||||
|
* The bss array includes:
|
||||||
|
* - region_begin (ADDR())
|
||||||
|
* - region_end (ADDR()+SIZEOF())
|
||||||
|
*
|
||||||
|
* WARNING: It is mandatory that the regions are word aligned,
|
||||||
|
* since the initialisation code works only on words.
|
||||||
|
*/
|
||||||
|
|
||||||
|
__data_regions_array_start = .;
|
||||||
|
|
||||||
|
LONG(LOADADDR(.data));
|
||||||
|
LONG(ADDR(.data));
|
||||||
|
LONG(ADDR(.data)+SIZEOF(.data));
|
||||||
|
|
||||||
|
LONG(LOADADDR(.data_CCMRAM));
|
||||||
|
LONG(ADDR(.data_CCMRAM));
|
||||||
|
LONG(ADDR(.data_CCMRAM)+SIZEOF(.data_CCMRAM));
|
||||||
|
|
||||||
|
__data_regions_array_end = .;
|
||||||
|
|
||||||
|
__bss_regions_array_start = .;
|
||||||
|
|
||||||
|
LONG(ADDR(.bss));
|
||||||
|
LONG(ADDR(.bss)+SIZEOF(.bss));
|
||||||
|
|
||||||
|
LONG(ADDR(.bss_CCMRAM));
|
||||||
|
LONG(ADDR(.bss_CCMRAM)+SIZEOF(.bss_CCMRAM));
|
||||||
|
|
||||||
|
__bss_regions_array_end = .;
|
||||||
|
|
||||||
|
/* End of memory regions initialisation arrays. */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These are the old initialisation sections, intended to contain
|
||||||
|
* naked code, with the prologue/epilogue added by crti.o/crtn.o
|
||||||
|
* when linking with startup files. The standalone startup code
|
||||||
|
* currently does not run these, better use the init arrays below.
|
||||||
|
*/
|
||||||
|
KEEP(*(.init))
|
||||||
|
KEEP(*(.fini))
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The preinit code, i.e. an array of pointers to initialisation
|
||||||
|
* functions to be performed before constructors.
|
||||||
|
*/
|
||||||
|
PROVIDE_HIDDEN (__preinit_array_start = .);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Used to run the SystemInit() before anything else.
|
||||||
|
*/
|
||||||
|
KEEP(*(.preinit_array_sysinit .preinit_array_sysinit.*))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Used for other platform inits.
|
||||||
|
*/
|
||||||
|
KEEP(*(.preinit_array_platform .preinit_array_platform.*))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The application inits. If you need to enforce some order in
|
||||||
|
* execution, create new sections, as before.
|
||||||
|
*/
|
||||||
|
KEEP(*(.preinit_array .preinit_array.*))
|
||||||
|
|
||||||
|
PROVIDE_HIDDEN (__preinit_array_end = .);
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The init code, i.e. an array of pointers to static constructors.
|
||||||
|
*/
|
||||||
|
PROVIDE_HIDDEN (__init_array_start = .);
|
||||||
|
KEEP(*(SORT(.init_array.*)))
|
||||||
|
KEEP(*(.init_array))
|
||||||
|
PROVIDE_HIDDEN (__init_array_end = .);
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The fini code, i.e. an array of pointers to static destructors.
|
||||||
|
*/
|
||||||
|
PROVIDE_HIDDEN (__fini_array_start = .);
|
||||||
|
KEEP(*(SORT(.fini_array.*)))
|
||||||
|
KEEP(*(.fini_array))
|
||||||
|
PROVIDE_HIDDEN (__fini_array_end = .);
|
||||||
|
|
||||||
|
} >FLASH
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For some STRx devices, the beginning of the startup code
|
||||||
|
* is stored in the .flashtext section, which goes to FLASH.
|
||||||
|
*/
|
||||||
|
.flashtext : ALIGN(4)
|
||||||
|
{
|
||||||
|
*(.flashtext .flashtext.*) /* Startup code */
|
||||||
|
} >FLASH
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The program code is stored in the .text section,
|
||||||
|
* which goes to FLASH.
|
||||||
|
*/
|
||||||
|
.text : ALIGN(4)
|
||||||
|
{
|
||||||
|
*(.text .text.*) /* all remaining code */
|
||||||
|
|
||||||
|
/* read-only data (constants) */
|
||||||
|
*(.rodata .rodata.* .constdata .constdata.*)
|
||||||
|
|
||||||
|
*(vtable) /* C++ virtual tables */
|
||||||
|
|
||||||
|
KEEP(*(.eh_frame*))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Stub sections generated by the linker, to glue together
|
||||||
|
* ARM and Thumb code. .glue_7 is used for ARM code calling
|
||||||
|
* Thumb code, and .glue_7t is used for Thumb code calling
|
||||||
|
* ARM code. Apparently always generated by the linker, for some
|
||||||
|
* architectures, so better leave them here.
|
||||||
|
*/
|
||||||
|
*(.glue_7)
|
||||||
|
*(.glue_7t)
|
||||||
|
|
||||||
|
} >FLASH
|
||||||
|
|
||||||
|
/* ARM magic sections */
|
||||||
|
.ARM.extab : ALIGN(4)
|
||||||
|
{
|
||||||
|
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||||
|
} > FLASH
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
__exidx_start = .;
|
||||||
|
.ARM.exidx : ALIGN(4)
|
||||||
|
{
|
||||||
|
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||||
|
} > FLASH
|
||||||
|
__exidx_end = .;
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
_etext = .;
|
||||||
|
__etext = .;
|
||||||
|
|
||||||
|
/* MEMORY_ARRAY */
|
||||||
|
/*
|
||||||
|
.ROarraySection :
|
||||||
|
{
|
||||||
|
*(.ROarraySection .ROarraySection.*)
|
||||||
|
} >MEMORY_ARRAY
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The secondary initialised data section.
|
||||||
|
*/
|
||||||
|
.data_CCMRAM : ALIGN(4)
|
||||||
|
{
|
||||||
|
FILL(0xFF)
|
||||||
|
*(.data.CCMRAM .data.CCMRAM.*)
|
||||||
|
. = ALIGN(4) ;
|
||||||
|
} > CCMRAM AT>FLASH
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This address is used by the startup code to
|
||||||
|
* initialise the .data section.
|
||||||
|
*/
|
||||||
|
_sidata = LOADADDR(.data);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The initialised data section.
|
||||||
|
*
|
||||||
|
* The program executes knowing that the data is in the RAM
|
||||||
|
* but the loader puts the initial values in the FLASH (inidata).
|
||||||
|
* It is one task of the startup to copy the initial values from
|
||||||
|
* FLASH to RAM.
|
||||||
|
*/
|
||||||
|
.data : ALIGN(4)
|
||||||
|
{
|
||||||
|
FILL(0xFF)
|
||||||
|
/* This is used by the startup code to initialise the .data section */
|
||||||
|
_sdata = . ; /* STM specific definition */
|
||||||
|
__data_start__ = . ;
|
||||||
|
*(.data_begin .data_begin.*)
|
||||||
|
|
||||||
|
*(.data .data.*)
|
||||||
|
|
||||||
|
*(.data_end .data_end.*)
|
||||||
|
. = ALIGN(4);
|
||||||
|
|
||||||
|
/* This is used by the startup code to initialise the .data section */
|
||||||
|
_edata = . ; /* STM specific definition */
|
||||||
|
__data_end__ = . ;
|
||||||
|
|
||||||
|
} >RAM AT>FLASH
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The uninitialised data sections. NOLOAD is used to avoid
|
||||||
|
* the "section `.bss' type changed to PROGBITS" warning
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* The secondary uninitialised data section. */
|
||||||
|
.bss_CCMRAM (NOLOAD) : ALIGN(4)
|
||||||
|
{
|
||||||
|
*(.bss.CCMRAM .bss.CCMRAM.*)
|
||||||
|
} > CCMRAM
|
||||||
|
|
||||||
|
/* The primary uninitialised data section. */
|
||||||
|
.bss (NOLOAD) : ALIGN(4)
|
||||||
|
{
|
||||||
|
__bss_start__ = .; /* standard newlib definition */
|
||||||
|
_sbss = .; /* STM specific definition */
|
||||||
|
*(.bss_begin .bss_begin.*)
|
||||||
|
|
||||||
|
*(.bss .bss.*)
|
||||||
|
*(COMMON)
|
||||||
|
|
||||||
|
*(.bss_end .bss_end.*)
|
||||||
|
. = ALIGN(4);
|
||||||
|
__bss_end__ = .; /* standard newlib definition */
|
||||||
|
_ebss = . ; /* STM specific definition */
|
||||||
|
} >RAM
|
||||||
|
|
||||||
|
.noinit_CCMRAM (NOLOAD) : ALIGN(4)
|
||||||
|
{
|
||||||
|
*(.noinit.CCMRAM .noinit.CCMRAM.*)
|
||||||
|
} > CCMRAM
|
||||||
|
|
||||||
|
.noinit (NOLOAD) : ALIGN(4)
|
||||||
|
{
|
||||||
|
_noinit = .;
|
||||||
|
|
||||||
|
*(.noinit .noinit.*)
|
||||||
|
|
||||||
|
. = ALIGN(4) ;
|
||||||
|
_end_noinit = .;
|
||||||
|
} > RAM
|
||||||
|
|
||||||
|
/* Mandatory to be word aligned, _sbrk assumes this */
|
||||||
|
PROVIDE ( end = _end_noinit ); /* was _ebss */
|
||||||
|
PROVIDE ( _end = _end_noinit );
|
||||||
|
PROVIDE ( __end = _end_noinit );
|
||||||
|
PROVIDE ( __end__ = _end_noinit );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Used for validation only, do not allocate anything here!
|
||||||
|
*
|
||||||
|
* This is just to check that there is enough RAM left for the Main
|
||||||
|
* stack. It should generate an error if it's full.
|
||||||
|
*/
|
||||||
|
._check_stack : ALIGN(4)
|
||||||
|
{
|
||||||
|
. = . + _Minimum_Stack_Size ;
|
||||||
|
} >RAM
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The FLASH Bank1.
|
||||||
|
* The C or assembly source must explicitly place the code
|
||||||
|
* or data there using the "section" attribute.
|
||||||
|
*/
|
||||||
|
.b1text : ALIGN(4)
|
||||||
|
{
|
||||||
|
*(.b1text) /* remaining code */
|
||||||
|
*(.b1rodata) /* read-only data (constants) */
|
||||||
|
*(.b1rodata.*)
|
||||||
|
} >FLASHB1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The EXTMEM.
|
||||||
|
* The C or assembly source must explicitly place the code or data there
|
||||||
|
* using the "section" attribute.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* EXTMEM Bank0 */
|
||||||
|
.eb0text : ALIGN(4)
|
||||||
|
{
|
||||||
|
*(.eb0text) /* remaining code */
|
||||||
|
*(.eb0rodata) /* read-only data (constants) */
|
||||||
|
*(.eb0rodata.*)
|
||||||
|
} >EXTMEMB0
|
||||||
|
|
||||||
|
/* EXTMEM Bank1 */
|
||||||
|
.eb1text : ALIGN(4)
|
||||||
|
{
|
||||||
|
*(.eb1text) /* remaining code */
|
||||||
|
*(.eb1rodata) /* read-only data (constants) */
|
||||||
|
*(.eb1rodata.*)
|
||||||
|
} >EXTMEMB1
|
||||||
|
|
||||||
|
/* EXTMEM Bank2 */
|
||||||
|
.eb2text : ALIGN(4)
|
||||||
|
{
|
||||||
|
*(.eb2text) /* remaining code */
|
||||||
|
*(.eb2rodata) /* read-only data (constants) */
|
||||||
|
*(.eb2rodata.*)
|
||||||
|
} >EXTMEMB2
|
||||||
|
|
||||||
|
/* EXTMEM Bank0 */
|
||||||
|
.eb3text : ALIGN(4)
|
||||||
|
{
|
||||||
|
*(.eb3text) /* remaining code */
|
||||||
|
*(.eb3rodata) /* read-only data (constants) */
|
||||||
|
*(.eb3rodata.*)
|
||||||
|
} >EXTMEMB3
|
||||||
|
|
||||||
|
|
||||||
|
/* After that there are only debugging sections. */
|
||||||
|
|
||||||
|
/* This can remove the debugging information from the standard libraries */
|
||||||
|
/*
|
||||||
|
DISCARD :
|
||||||
|
{
|
||||||
|
libc.a ( * )
|
||||||
|
libm.a ( * )
|
||||||
|
libgcc.a ( * )
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Stabs debugging sections. */
|
||||||
|
.stab 0 : { *(.stab) }
|
||||||
|
.stabstr 0 : { *(.stabstr) }
|
||||||
|
.stab.excl 0 : { *(.stab.excl) }
|
||||||
|
.stab.exclstr 0 : { *(.stab.exclstr) }
|
||||||
|
.stab.index 0 : { *(.stab.index) }
|
||||||
|
.stab.indexstr 0 : { *(.stab.indexstr) }
|
||||||
|
.comment 0 : { *(.comment) }
|
||||||
|
/*
|
||||||
|
* DWARF debug sections.
|
||||||
|
* Symbols in the DWARF debugging sections are relative to the beginning
|
||||||
|
* of the section so we begin them at 0.
|
||||||
|
*/
|
||||||
|
/* DWARF 1 */
|
||||||
|
.debug 0 : { *(.debug) }
|
||||||
|
.line 0 : { *(.line) }
|
||||||
|
/* GNU DWARF 1 extensions */
|
||||||
|
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
||||||
|
.debug_sfnames 0 : { *(.debug_sfnames) }
|
||||||
|
/* DWARF 1.1 and DWARF 2 */
|
||||||
|
.debug_aranges 0 : { *(.debug_aranges) }
|
||||||
|
.debug_pubnames 0 : { *(.debug_pubnames) }
|
||||||
|
/* DWARF 2 */
|
||||||
|
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
|
||||||
|
.debug_abbrev 0 : { *(.debug_abbrev) }
|
||||||
|
.debug_line 0 : { *(.debug_line) }
|
||||||
|
.debug_frame 0 : { *(.debug_frame) }
|
||||||
|
.debug_str 0 : { *(.debug_str) }
|
||||||
|
.debug_loc 0 : { *(.debug_loc) }
|
||||||
|
.debug_macinfo 0 : { *(.debug_macinfo) }
|
||||||
|
/* SGI/MIPS DWARF 2 extensions */
|
||||||
|
.debug_weaknames 0 : { *(.debug_weaknames) }
|
||||||
|
.debug_funcnames 0 : { *(.debug_funcnames) }
|
||||||
|
.debug_typenames 0 : { *(.debug_typenames) }
|
||||||
|
.debug_varnames 0 : { *(.debug_varnames) }
|
||||||
|
}
|
||||||
@@ -1,170 +0,0 @@
|
|||||||
/*
|
|
||||||
*****************************************************************************
|
|
||||||
**
|
|
||||||
** File : stm32_flash.ld
|
|
||||||
**
|
|
||||||
** Abstract : Linker script for STM32F407VG Device with
|
|
||||||
** 1024KByte FLASH, 192KByte 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 : STMicroelectronics STM32
|
|
||||||
**
|
|
||||||
** 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 = 0x20020000; /* end of 128K RAM on AHB bus*/
|
|
||||||
|
|
||||||
/* Generate a link error if heap and stack don't fit into RAM */
|
|
||||||
_Min_Heap_Size = 0; /* required amount of heap */
|
|
||||||
_Min_Stack_Size = 0x400; /* required amount of stack */
|
|
||||||
|
|
||||||
/* Specify the memory areas */
|
|
||||||
MEMORY
|
|
||||||
{
|
|
||||||
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
|
|
||||||
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K
|
|
||||||
MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Define output sections */
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
/* The startup code goes first into FLASH */
|
|
||||||
.isr_vector :
|
|
||||||
{
|
|
||||||
. = ALIGN(4);
|
|
||||||
KEEP(*(.isr_vector)) /* Startup code */
|
|
||||||
. = ALIGN(4);
|
|
||||||
} >FLASH
|
|
||||||
|
|
||||||
/* 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 */
|
|
||||||
} >FLASH
|
|
||||||
|
|
||||||
|
|
||||||
.ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
|
|
||||||
.ARM : {
|
|
||||||
__exidx_start = .;
|
|
||||||
*(.ARM.exidx*)
|
|
||||||
__exidx_end = .;
|
|
||||||
} >FLASH
|
|
||||||
|
|
||||||
.preinit_array :
|
|
||||||
{
|
|
||||||
PROVIDE_HIDDEN (__preinit_array_start = .);
|
|
||||||
KEEP (*(.preinit_array*))
|
|
||||||
PROVIDE_HIDDEN (__preinit_array_end = .);
|
|
||||||
} >FLASH
|
|
||||||
.init_array :
|
|
||||||
{
|
|
||||||
PROVIDE_HIDDEN (__init_array_start = .);
|
|
||||||
KEEP (*(SORT(.init_array.*)))
|
|
||||||
KEEP (*(.init_array*))
|
|
||||||
PROVIDE_HIDDEN (__init_array_end = .);
|
|
||||||
} >FLASH
|
|
||||||
.fini_array :
|
|
||||||
{
|
|
||||||
PROVIDE_HIDDEN (__fini_array_start = .);
|
|
||||||
KEEP (*(.fini_array*))
|
|
||||||
KEEP (*(SORT(.fini_array.*)))
|
|
||||||
PROVIDE_HIDDEN (__fini_array_end = .);
|
|
||||||
} >FLASH
|
|
||||||
|
|
||||||
/* used by the startup to initialize data */
|
|
||||||
_sidata = .;
|
|
||||||
|
|
||||||
/* Initialized data sections goes into RAM, load LMA copy after code */
|
|
||||||
.data : AT ( _sidata )
|
|
||||||
{
|
|
||||||
. = 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 */
|
|
||||||
} >RAM
|
|
||||||
|
|
||||||
/* 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;
|
|
||||||
} >RAM
|
|
||||||
|
|
||||||
/* 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);
|
|
||||||
} >RAM
|
|
||||||
|
|
||||||
/* 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) }
|
|
||||||
}
|
|
||||||
Executable → Regular
+17
-48
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
ROOT_DIR := $(shell pwd | sed "s/\/source//g")
|
ROOT_DIR := $(shell pwd | sed "s/\/source//g")
|
||||||
|
|
||||||
|
include $(ROOT_DIR)/config/make/tools.mk
|
||||||
|
|
||||||
ifeq ($(BOARD), stm32f4-discovery)
|
ifeq ($(BOARD), stm32f4-discovery)
|
||||||
include $(ROOT_DIR)/config/make/stm32f4xx.mk
|
include $(ROOT_DIR)/config/make/stm32f4xx.mk
|
||||||
endif
|
endif
|
||||||
@@ -10,42 +12,19 @@ OS_LIB = kosmos-$(ARCH)-$(BOARD)$(DBG_EXT)
|
|||||||
LIBS += $(OS_LIB)
|
LIBS += $(OS_LIB)
|
||||||
|
|
||||||
INCLUDES += \
|
INCLUDES += \
|
||||||
$(SRC_DIR) \
|
|
||||||
$(SRC_DIR)/firmware
|
$(SRC_DIR)/firmware
|
||||||
|
|
||||||
|
|
||||||
CFLAGS += \
|
|
||||||
-Wno-unused-function \
|
|
||||||
-O$(OPTIM) \
|
|
||||||
$(addprefix -I, $(INCLUDES)) \
|
|
||||||
-Wall
|
|
||||||
|
|
||||||
CPPCHECK_FLAGS += \
|
|
||||||
--template=gcc \
|
|
||||||
--error-exitcode=1 \
|
|
||||||
--enable=warning,performance,information,style \
|
|
||||||
--inline-suppr \
|
|
||||||
$(addprefix -I, $(INCLUDES))
|
|
||||||
|
|
||||||
include $(ROOT_DIR)/config/make/tools.mk
|
|
||||||
|
|
||||||
SRC_DIR = $(ROOT_DIR)/source
|
|
||||||
ifeq ($(DEBUG),y)
|
ifeq ($(DEBUG),y)
|
||||||
OBJ_DIR = $(ROOT_DIR)/release/object/$(ARCH)/debug
|
DBG_DIR = debug
|
||||||
EXE_DIR = $(ROOT_DIR)/release/execute/$(ARCH)/debug
|
|
||||||
MAP_DIR = $(ROOT_DIR)/release/map/$(ARCH)/debug
|
|
||||||
SIZE_DIR = $(ROOT_DIR)/release/size/$(ARCH)/debug
|
|
||||||
else
|
else
|
||||||
OBJ_DIR = $(ROOT_DIR)/release/object/$(ARCH)/release
|
DBG_DIR = release
|
||||||
EXE_DIR = $(ROOT_DIR)/release/execute/$(ARCH)/release
|
|
||||||
MAP_DIR = $(ROOT_DIR)/release/map/$(ARCH)/release
|
|
||||||
SIZE_DIR = $(ROOT_DIR)/release/size/$(ARCH)/release
|
|
||||||
endif
|
endif
|
||||||
DOC_DIR = $(ROOT_DIR)/doc/$(ARCH)
|
OBJ_DIR := $(ROOT_DIR)/release/object/$(ARCH)/$(DBG_DIR)
|
||||||
TEST_OBJ_DIR = $(ROOT_DIR)/test/object
|
EXE_DIR := $(ROOT_DIR)/release/execute/$(ARCH)/$(DBG_DIR)
|
||||||
TEST_EXE_DIR = $(ROOT_DIR)/test/execute/
|
MAP_DIR := $(ROOT_DIR)/release/map/$(ARCH)/$(DBG_DIR)
|
||||||
|
SIZE_DIR := $(ROOT_DIR)/release/size/$(ARCH)/$(DBG_DIR)
|
||||||
DOC_SRC :=
|
TEST_OBJ_DIR := $(ROOT_DIR)/test/object
|
||||||
|
TEST_EXE_DIR := $(ROOT_DIR)/test/execute/
|
||||||
|
|
||||||
ELF_EXT = .elf
|
ELF_EXT = .elf
|
||||||
BIN_EXT = .bin
|
BIN_EXT = .bin
|
||||||
@@ -53,23 +32,13 @@ HEX_EXT = .hex
|
|||||||
LIB_EXT = .a
|
LIB_EXT = .a
|
||||||
SIZE_EXT = .size
|
SIZE_EXT = .size
|
||||||
TEST_EXT =
|
TEST_EXT =
|
||||||
|
MAP_EXT = .map
|
||||||
DOXYFILE=$(ROOT_DIR)/config/doxygen/Doxyfile
|
|
||||||
|
|
||||||
define makedep
|
define makedep
|
||||||
$(CC) -MM \
|
$(CC) -MM \
|
||||||
-MF $3 \
|
-MF $3 \
|
||||||
-MP \
|
-MP \
|
||||||
-MT $2 \
|
-MT $2 \
|
||||||
$(CFLAGS) \
|
$4 \
|
||||||
$1
|
$1
|
||||||
endef
|
|
||||||
|
|
||||||
define maketestdep
|
|
||||||
$(NATIVE_CC) -MM \
|
|
||||||
-MF $3 \
|
|
||||||
-MP \
|
|
||||||
-MT $2 \
|
|
||||||
$(TEST_CFLAGS) \
|
|
||||||
$1
|
|
||||||
endef
|
endef
|
||||||
|
|||||||
+66
-39
@@ -1,60 +1,87 @@
|
|||||||
ARCH ?= arm
|
ARCH ?= arm
|
||||||
CPU ?= stm32f4xx
|
CPU ?= stm32f4xx
|
||||||
ifeq ($(CPU),stm32f4xx)
|
ifeq ($(CPU),stm32f4xx)
|
||||||
CFLAGS += -DARCH_STM32F4XX
|
C_FLAGS += -DARCH_STM32F4XX
|
||||||
endif
|
endif
|
||||||
ifeq ($(BOARD), stm32f4-discovery)
|
ifeq ($(BOARD), stm32f4-discovery)
|
||||||
CFLAGS += -DBOARD_STM32F4_DISCOVERY
|
C_FLAGS += -DBOARD_STM32F4_DISCOVERY
|
||||||
endif
|
endif
|
||||||
CROSS_COMPILE=arm-none-eabi-
|
CROSS_COMPILE ?= arm-none-eabi-
|
||||||
|
|
||||||
INCLUDES += \
|
INCLUDES += \
|
||||||
/opt/arm-2011.09/arm-none-eabi/include \
|
/opt/gcc-arm-none-eabi-5_4-2016q2/arm-none-eabi/include \
|
||||||
/opt/arm-2011.09/lib/gcc/arm-none-eabi/4.6.1/include
|
/opt/gcc-arm-none-eabi-5_4-2016q2/lib/gcc/arm-none-eabi/5.4.1/include
|
||||||
|
|
||||||
|
GEN_FLAGS += \
|
||||||
|
-mcpu=cortex-m4 \
|
||||||
|
-mthumb \
|
||||||
|
-mfloat-abi=hard \
|
||||||
|
-mfpu=fpv4-sp-d16 \
|
||||||
|
-O$(OPTIM) \
|
||||||
|
-fmessage-length=0 \
|
||||||
|
-fsigned-char \
|
||||||
|
-ffunction-sections \
|
||||||
|
-fdata-sections \
|
||||||
|
-ffreestanding \
|
||||||
|
-fno-move-loop-invariants \
|
||||||
|
-Werror \
|
||||||
|
-Wunused \
|
||||||
|
-Wuninitialized \
|
||||||
|
-Wall \
|
||||||
|
-Wextra \
|
||||||
|
-Wmissing-declarations \
|
||||||
|
-Wconversion \
|
||||||
|
-Wpointer-arith \
|
||||||
|
-Wpadded \
|
||||||
|
-Wshadow \
|
||||||
|
-Wlogical-op \
|
||||||
|
-Waggregate-return \
|
||||||
|
-Wfloat-equal
|
||||||
|
|
||||||
|
C_FLAGS += \
|
||||||
|
-DDEBUG \
|
||||||
|
-DUSE_FULL_ASSERT \
|
||||||
|
-DTRACE \
|
||||||
|
-DOS_USE_TRACE_SEMIHOSTING_DEBUG \
|
||||||
|
-DSTM32F407xx \
|
||||||
|
-DUSE_HAL_DRIVER \
|
||||||
|
-DHSE_VALUE=8000000 \
|
||||||
|
$(addprefix -I, $(INCLUDES)) \
|
||||||
|
-std=gnu11 \
|
||||||
|
-Wmissing-prototypes \
|
||||||
|
-Wstrict-prototypes \
|
||||||
|
-Wbad-function-cast \
|
||||||
|
-Wno-bad-function-cast \
|
||||||
|
-Wno-conversion \
|
||||||
|
-Wno-sign-conversion \
|
||||||
|
-Wno-unused-parameter \
|
||||||
|
-Wno-sign-compare \
|
||||||
|
-Wno-missing-prototypes \
|
||||||
|
-Wno-missing-declarations
|
||||||
|
|
||||||
|
L_FLAGS := \
|
||||||
|
-T mem.ld \
|
||||||
|
-T libs.ld \
|
||||||
|
-T sections.ld \
|
||||||
|
-nostartfiles \
|
||||||
|
-Xlinker --gc-sections \
|
||||||
|
-L"config/linker" \
|
||||||
|
--specs=nano.specs
|
||||||
|
|
||||||
ifeq ($(DEBUG),y)
|
ifeq ($(DEBUG),y)
|
||||||
OPTIM = 0
|
OPTIM = g
|
||||||
CFLAGS += -g
|
GEN_FLAGS += -g3
|
||||||
DBG_EXT = -dbg
|
DBG_EXT = -dbg
|
||||||
else
|
else
|
||||||
OPTIM = s
|
OPTIM = s
|
||||||
DBG_EXT =
|
DBG_EXT =
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CFLAGS += \
|
AS_FLAGS := -mapcs-32 -g
|
||||||
-mthumb \
|
AR_FLAGS := rcs
|
||||||
-T $(ROOT_DIR)/config/linker/stm32_flash.ld \
|
|
||||||
-D USE_STDPERIPH_DRIVER\
|
|
||||||
-D VECT_TAB_FLASH\
|
|
||||||
-D GCC_ARMCM4\
|
|
||||||
-D THUMB_INTERWORK\
|
|
||||||
-D PACK_STRUCT_END=__attribute\(\(packed\)\)\
|
|
||||||
-D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\)\
|
|
||||||
-mcpu=cortex-m4 \
|
|
||||||
-mfpu=fpv4-sp-d16 \
|
|
||||||
-mfloat-abi=softfp \
|
|
||||||
-fdata-sections \
|
|
||||||
-ffunction-sections
|
|
||||||
|
|
||||||
CPPCHECK_FLAGS += \
|
|
||||||
-D USE_STDPERIPH_DRIVER\
|
|
||||||
-D VECT_TAB_FLASH\
|
|
||||||
-D GCC_ARMCM4\
|
|
||||||
-D THUMB_INTERWORK\
|
|
||||||
-D PACK_STRUCT_END=__attribute\(\(packed\)\)\
|
|
||||||
-D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\)\
|
|
||||||
-D __thumb__ \
|
|
||||||
--check-config
|
|
||||||
|
|
||||||
LDFLAGS=\
|
|
||||||
-Wl,--gc-sections \
|
|
||||||
-Xlinker -M > $(MAP_DIR)/$(APP).map
|
|
||||||
|
|
||||||
ASFLAGS=-mapcs-32 -g
|
|
||||||
ARFLAGS=rcs
|
|
||||||
|
|
||||||
OOCD_IMAGE=$(BIN_FILE)
|
OOCD_IMAGE=$(BIN_FILE)
|
||||||
OOCD_CFG_FILE=$(EXE_DIR)/openocd.cfg
|
OOCD_CFG_FILE=$(EXE_DIR)/openocd.cfg
|
||||||
|
|
||||||
PRE_PROGRAM = echo "telnet_port 4444\ninit\nreset halt\nflash write_image erase $(OOCD_IMAGE) 0x08000000 bin\nreset run\n shutdown\n" > $(OOCD_CFG_FILE)
|
PRE_PROGRAM = echo "telnet_port 4444\ninit\nreset halt\nflash write_image erase $(OOCD_IMAGE) 0x08000000 bin\nreset run\n shutdown\n" > $(OOCD_CFG_FILE)
|
||||||
PROGRAM = openocd -f /usr/share/openocd/scripts/board/stm32f4discovery.cfg -f $(OOCD_CFG_FILE)
|
PROGRAM = openocd -f /usr/share/openocd/scripts/board/stm32f4discovery.cfg -f $(OOCD_CFG_FILE)
|
||||||
Executable → Regular
+1
-4
@@ -1,9 +1,6 @@
|
|||||||
NATIVE_CC = gcc
|
|
||||||
|
|
||||||
CXX = $(CROSS_COMPILE)g++
|
|
||||||
CC = $(CROSS_COMPILE)gcc
|
CC = $(CROSS_COMPILE)gcc
|
||||||
|
CXX = $(CROSS_COMPILE)g++
|
||||||
AR = $(CROSS_COMPILE)ar
|
AR = $(CROSS_COMPILE)ar
|
||||||
LD = $(CROSS_COMPILE)ld
|
|
||||||
SIZE = $(CROSS_COMPILE)size
|
SIZE = $(CROSS_COMPILE)size
|
||||||
NM = $(CROSS_COMPILE)nm
|
NM = $(CROSS_COMPILE)nm
|
||||||
RANLIB = $(CROSS_COMPILE)ranlib
|
RANLIB = $(CROSS_COMPILE)ranlib
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
ifeq ($(CPU), stm32f4xx)
|
ifeq ($(CPU), stm32f4xx)
|
||||||
include source/firmware/arch/stm32f4xx/stm32f4xx.mk
|
include source/firmware/arch/stm32f4xx/stm32f4xx.mk
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -1,47 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "usbd_cdc_vcp.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Transmit a char, if you want to use printf(),
|
|
||||||
* you need implement this function
|
|
||||||
*
|
|
||||||
* @param pStr Storage string.
|
|
||||||
* @param c Character to write.
|
|
||||||
*/
|
|
||||||
void PrintChar(char c) {
|
|
||||||
/* Send a char like:
|
|
||||||
while(Transfer not completed);
|
|
||||||
Transmit a char;
|
|
||||||
*/
|
|
||||||
USB_VCOM_Send( &c, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Implementation of fputs using the DBGU as the standard output. Required
|
|
||||||
* for printf().
|
|
||||||
*
|
|
||||||
* @param pStr String to write.
|
|
||||||
* @param pStream Output stream.
|
|
||||||
*
|
|
||||||
* @return Number of characters written if successful, or -1 if the output
|
|
||||||
* stream is not stdout or stderr.
|
|
||||||
*/
|
|
||||||
signed int fputs(const char *pStr, FILE *pStream)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
signed int num = 0;
|
|
||||||
while (*pStr != 0) {
|
|
||||||
if (fputc(*pStr, pStream) == -1) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
num++;
|
|
||||||
pStr++;
|
|
||||||
}
|
|
||||||
return num;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
USB_VCOM_Send((char*)pStr, strlen(pStr));
|
|
||||||
return strlen(pStr);
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
/*
|
|
||||||
* print.h
|
|
||||||
*
|
|
||||||
* Created on: May 22, 2012
|
|
||||||
* Author: tkl
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef PRINT_H_
|
|
||||||
#define PRINT_H_
|
|
||||||
|
|
||||||
void PrintChar(char c);
|
|
||||||
|
|
||||||
#endif /* PRINT_H_ */
|
|
||||||
@@ -1,513 +0,0 @@
|
|||||||
/**************************************************************************//*****
|
|
||||||
* @file printf.c
|
|
||||||
* @brief Implementation of several stdio.h methods, such as printf(),
|
|
||||||
* sprintf() and so on. This reduces the memory footprint of the
|
|
||||||
* binary when using those methods, compared to the libc implementation.
|
|
||||||
********************************************************************************/
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "print.h"
|
|
||||||
|
|
||||||
/** Maximum string size allowed (in bytes). */
|
|
||||||
#define MAX_STRING_SIZE 100
|
|
||||||
|
|
||||||
|
|
||||||
/** Required for proper compilation. */
|
|
||||||
struct _reent r = {0, (FILE *) 0, (FILE *) 1, (FILE *) 0};
|
|
||||||
//struct _reent *_impure_ptr = &r;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Writes a character inside the given string. Returns 1.
|
|
||||||
*
|
|
||||||
* @param pStr Storage string.
|
|
||||||
* @param c Character to write.
|
|
||||||
*/
|
|
||||||
signed int PutChar(char *pStr, char c)
|
|
||||||
{
|
|
||||||
*pStr = c;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Writes a string inside the given string.
|
|
||||||
*
|
|
||||||
* @param pStr Storage string.
|
|
||||||
* @param pSource Source string.
|
|
||||||
* @return The size of the written
|
|
||||||
*/
|
|
||||||
signed int PutString(char *pStr, const char *pSource)
|
|
||||||
{
|
|
||||||
signed int num = 0;
|
|
||||||
|
|
||||||
while (*pSource != 0) {
|
|
||||||
|
|
||||||
*pStr++ = *pSource++;
|
|
||||||
num++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return num;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Writes an unsigned int inside the given string, using the provided fill &
|
|
||||||
* width parameters.
|
|
||||||
*
|
|
||||||
* @param pStr Storage string.
|
|
||||||
* @param fill Fill character.
|
|
||||||
* @param width Minimum integer width.
|
|
||||||
* @param value Integer value.
|
|
||||||
*/
|
|
||||||
signed int PutUnsignedInt(
|
|
||||||
char *pStr,
|
|
||||||
char fill,
|
|
||||||
signed int width,
|
|
||||||
unsigned int value)
|
|
||||||
{
|
|
||||||
signed int num = 0;
|
|
||||||
|
|
||||||
/* Take current digit into account when calculating width */
|
|
||||||
width--;
|
|
||||||
|
|
||||||
/* Recursively write upper digits */
|
|
||||||
if ((value / 10) > 0) {
|
|
||||||
|
|
||||||
num = PutUnsignedInt(pStr, fill, width, value / 10);
|
|
||||||
pStr += num;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write filler characters */
|
|
||||||
else {
|
|
||||||
|
|
||||||
while (width > 0) {
|
|
||||||
|
|
||||||
PutChar(pStr, fill);
|
|
||||||
pStr++;
|
|
||||||
num++;
|
|
||||||
width--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write lower digit */
|
|
||||||
num += PutChar(pStr, (value % 10) + '0');
|
|
||||||
|
|
||||||
return num;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Writes a signed int inside the given string, using the provided fill & width
|
|
||||||
* parameters.
|
|
||||||
*
|
|
||||||
* @param pStr Storage string.
|
|
||||||
* @param fill Fill character.
|
|
||||||
* @param width Minimum integer width.
|
|
||||||
* @param value Signed integer value.
|
|
||||||
*/
|
|
||||||
signed int PutSignedInt(
|
|
||||||
char *pStr,
|
|
||||||
char fill,
|
|
||||||
signed int width,
|
|
||||||
signed int value)
|
|
||||||
{
|
|
||||||
signed int num = 0;
|
|
||||||
unsigned int absolute;
|
|
||||||
|
|
||||||
/* Compute absolute value */
|
|
||||||
if (value < 0) {
|
|
||||||
|
|
||||||
absolute = -value;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
absolute = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Take current digit into account when calculating width */
|
|
||||||
width--;
|
|
||||||
|
|
||||||
/* Recursively write upper digits */
|
|
||||||
if ((absolute / 10) > 0) {
|
|
||||||
|
|
||||||
if (value < 0) {
|
|
||||||
|
|
||||||
num = PutSignedInt(pStr, fill, width, -(absolute / 10));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
num = PutSignedInt(pStr, fill, width, absolute / 10);
|
|
||||||
}
|
|
||||||
pStr += num;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
/* Reserve space for sign */
|
|
||||||
if (value < 0) {
|
|
||||||
|
|
||||||
width--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write filler characters */
|
|
||||||
while (width > 0) {
|
|
||||||
|
|
||||||
PutChar(pStr, fill);
|
|
||||||
pStr++;
|
|
||||||
num++;
|
|
||||||
width--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write sign */
|
|
||||||
if (value < 0) {
|
|
||||||
|
|
||||||
num += PutChar(pStr, '-');
|
|
||||||
pStr++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write lower digit */
|
|
||||||
num += PutChar(pStr, (absolute % 10) + '0');
|
|
||||||
|
|
||||||
return num;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Writes an hexadecimal value into a string, using the given fill, width &
|
|
||||||
* capital parameters.
|
|
||||||
*
|
|
||||||
* @param pStr Storage string.
|
|
||||||
* @param fill Fill character.
|
|
||||||
* @param width Minimum integer width.
|
|
||||||
* @param maj Indicates if the letters must be printed in lower- or upper-case.
|
|
||||||
* @param value Hexadecimal value.
|
|
||||||
*
|
|
||||||
* @return The number of char written
|
|
||||||
*/
|
|
||||||
signed int PutHexa(
|
|
||||||
char *pStr,
|
|
||||||
char fill,
|
|
||||||
signed int width,
|
|
||||||
unsigned char maj,
|
|
||||||
unsigned int value)
|
|
||||||
{
|
|
||||||
signed int num = 0;
|
|
||||||
|
|
||||||
/* Decrement width */
|
|
||||||
width--;
|
|
||||||
|
|
||||||
/* Recursively output upper digits */
|
|
||||||
if ((value >> 4) > 0) {
|
|
||||||
|
|
||||||
num += PutHexa(pStr, fill, width, maj, value >> 4);
|
|
||||||
pStr += num;
|
|
||||||
}
|
|
||||||
/* Write filler chars */
|
|
||||||
else {
|
|
||||||
|
|
||||||
while (width > 0) {
|
|
||||||
|
|
||||||
PutChar(pStr, fill);
|
|
||||||
pStr++;
|
|
||||||
num++;
|
|
||||||
width--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write current digit */
|
|
||||||
if ((value & 0xF) < 10) {
|
|
||||||
|
|
||||||
PutChar(pStr, (value & 0xF) + '0');
|
|
||||||
}
|
|
||||||
else if (maj) {
|
|
||||||
|
|
||||||
PutChar(pStr, (value & 0xF) - 10 + 'A');
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
PutChar(pStr, (value & 0xF) - 10 + 'a');
|
|
||||||
}
|
|
||||||
num++;
|
|
||||||
|
|
||||||
return num;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Global Functions ----------------------------------------------------------- */
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Stores the result of a formatted string into another string. Format
|
|
||||||
* arguments are given in a va_list instance.
|
|
||||||
*
|
|
||||||
* @param pStr Destination string.
|
|
||||||
* @param length Length of Destination string.
|
|
||||||
* @param pFormat Format string.
|
|
||||||
* @param ap Argument list.
|
|
||||||
*
|
|
||||||
* @return The number of characters written.
|
|
||||||
*/
|
|
||||||
signed int vsnprintf(char *pStr, size_t length, const char *pFormat, va_list ap)
|
|
||||||
{
|
|
||||||
char fill;
|
|
||||||
unsigned char width;
|
|
||||||
signed int num = 0;
|
|
||||||
signed int size = 0;
|
|
||||||
|
|
||||||
/* Clear the string */
|
|
||||||
if (pStr) {
|
|
||||||
|
|
||||||
*pStr = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Phase string */
|
|
||||||
while (*pFormat != 0 && size < length) {
|
|
||||||
|
|
||||||
/* Normal character */
|
|
||||||
if (*pFormat != '%') {
|
|
||||||
|
|
||||||
*pStr++ = *pFormat++;
|
|
||||||
size++;
|
|
||||||
}
|
|
||||||
/* Escaped '%' */
|
|
||||||
else if (*(pFormat+1) == '%') {
|
|
||||||
|
|
||||||
*pStr++ = '%';
|
|
||||||
pFormat += 2;
|
|
||||||
size++;
|
|
||||||
}
|
|
||||||
/* Token delimiter */
|
|
||||||
else {
|
|
||||||
|
|
||||||
fill = ' ';
|
|
||||||
width = 0;
|
|
||||||
pFormat++;
|
|
||||||
|
|
||||||
/* Parse filler */
|
|
||||||
if (*pFormat == '0') {
|
|
||||||
|
|
||||||
fill = '0';
|
|
||||||
pFormat++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Parse width */
|
|
||||||
while ((*pFormat >= '0') && (*pFormat <= '9')) {
|
|
||||||
|
|
||||||
width = (width*10) + *pFormat-'0';
|
|
||||||
pFormat++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if there is enough space */
|
|
||||||
if (size + width > length) {
|
|
||||||
|
|
||||||
width = length - size;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Parse type */
|
|
||||||
switch (*pFormat) {
|
|
||||||
case 'd':
|
|
||||||
case 'i': num = PutSignedInt(pStr, fill, width, va_arg(ap, signed int)); break;
|
|
||||||
case 'u': num = PutUnsignedInt(pStr, fill, width, va_arg(ap, unsigned int)); break;
|
|
||||||
case 'x': num = PutHexa(pStr, fill, width, 0, va_arg(ap, unsigned int)); break;
|
|
||||||
case 'X': num = PutHexa(pStr, fill, width, 1, va_arg(ap, unsigned int)); break;
|
|
||||||
case 's': num = PutString(pStr, va_arg(ap, char *)); break;
|
|
||||||
case 'c': num = PutChar(pStr, va_arg(ap, unsigned int)); break;
|
|
||||||
default:
|
|
||||||
return EOF;
|
|
||||||
}
|
|
||||||
|
|
||||||
pFormat++;
|
|
||||||
pStr += num;
|
|
||||||
size += num;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* NULL-terminated (final \0 is not counted) */
|
|
||||||
if (size < length) {
|
|
||||||
|
|
||||||
*pStr = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
*(--pStr) = 0;
|
|
||||||
size--;
|
|
||||||
}
|
|
||||||
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Stores the result of a formatted string into another string. Format
|
|
||||||
* arguments are given in a va_list instance.
|
|
||||||
*
|
|
||||||
* @param pStr Destination string.
|
|
||||||
* @param length Length of Destination string.
|
|
||||||
* @param pFormat Format string.
|
|
||||||
* @param ... Other arguments
|
|
||||||
*
|
|
||||||
* @return The number of characters written.
|
|
||||||
*/
|
|
||||||
signed int snprintf(char *pString, size_t length, const char *pFormat, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
signed int rc;
|
|
||||||
|
|
||||||
va_start(ap, pFormat);
|
|
||||||
rc = vsnprintf(pString, length, pFormat, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Stores the result of a formatted string into another string. Format
|
|
||||||
* arguments are given in a va_list instance.
|
|
||||||
*
|
|
||||||
* @param pString Destination string.
|
|
||||||
* @param length Length of Destination string.
|
|
||||||
* @param pFormat Format string.
|
|
||||||
* @param ap Argument list.
|
|
||||||
*
|
|
||||||
* @return The number of characters written.
|
|
||||||
*/
|
|
||||||
signed int vsprintf(char *pString, const char *pFormat, va_list ap)
|
|
||||||
{
|
|
||||||
return vsnprintf(pString, MAX_STRING_SIZE, pFormat, ap);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Outputs a formatted string on the given stream. Format arguments are given
|
|
||||||
* in a va_list instance.
|
|
||||||
*
|
|
||||||
* @param pStream Output stream.
|
|
||||||
* @param pFormat Format string
|
|
||||||
* @param ap Argument list.
|
|
||||||
*/
|
|
||||||
signed int vfprintf(FILE *pStream, const char *pFormat, va_list ap)
|
|
||||||
{
|
|
||||||
char pStr[MAX_STRING_SIZE];
|
|
||||||
char pError[] = "stdio.c: increase MAX_STRING_SIZE\n\r";
|
|
||||||
|
|
||||||
/* Write formatted string in buffer */
|
|
||||||
if (vsprintf(pStr, pFormat, ap) >= MAX_STRING_SIZE) {
|
|
||||||
|
|
||||||
fputs(pError, stderr);
|
|
||||||
while (1); /* Increase MAX_STRING_SIZE */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Display string */
|
|
||||||
return fputs(pStr, pStream);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Outputs a formatted string on the DBGU stream. Format arguments are given
|
|
||||||
* in a va_list instance.
|
|
||||||
*
|
|
||||||
* @param pFormat Format string.
|
|
||||||
* @param ap Argument list.
|
|
||||||
*/
|
|
||||||
signed int vprintf(const char *pFormat, va_list ap)
|
|
||||||
{
|
|
||||||
return vfprintf(stdout, pFormat, ap);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Outputs a formatted string on the given stream, using a variable
|
|
||||||
* number of arguments.
|
|
||||||
*
|
|
||||||
* @param pStream Output stream.
|
|
||||||
* @param pFormat Format string.
|
|
||||||
*/
|
|
||||||
signed int fprintf(FILE *pStream, const char *pFormat, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
signed int result;
|
|
||||||
|
|
||||||
/* Forward call to vfprintf */
|
|
||||||
va_start(ap, pFormat);
|
|
||||||
result = vfprintf(pStream, pFormat, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Outputs a formatted string on the DBGU stream, using a variable number of
|
|
||||||
* arguments.
|
|
||||||
*
|
|
||||||
* @param pFormat Format string.
|
|
||||||
*/
|
|
||||||
signed int printf(const char *pFormat, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
signed int result;
|
|
||||||
|
|
||||||
/* Forward call to vprintf */
|
|
||||||
va_start(ap, pFormat);
|
|
||||||
result = vprintf(pFormat, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Writes a formatted string inside another string.
|
|
||||||
*
|
|
||||||
* @param pStr torage string.
|
|
||||||
* @param pFormat Format string.
|
|
||||||
*/
|
|
||||||
signed int sprintf(char *pStr, const char *pFormat, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
signed int result;
|
|
||||||
|
|
||||||
// Forward call to vsprintf
|
|
||||||
va_start(ap, pFormat);
|
|
||||||
result = vsprintf(pStr, pFormat, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Outputs a string on stdout.
|
|
||||||
*
|
|
||||||
* @param pStr String to output.
|
|
||||||
*/
|
|
||||||
signed int puts(const char *pStr)
|
|
||||||
{
|
|
||||||
return fputs(pStr, stdout);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Implementation of fputc using the DBGU as the standard output. Required
|
|
||||||
* for printf().
|
|
||||||
*
|
|
||||||
* @param c Character to write.
|
|
||||||
* @param pStream Output stream.
|
|
||||||
* @param The character written if successful, or -1 if the output stream is
|
|
||||||
* not stdout or stderr.
|
|
||||||
*/
|
|
||||||
signed int fputc(signed int c, FILE *pStream)
|
|
||||||
{
|
|
||||||
if ((pStream == stdout) || (pStream == stderr)) {
|
|
||||||
|
|
||||||
PrintChar(c);
|
|
||||||
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
return EOF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,172 @@
|
|||||||
|
//
|
||||||
|
// This file is part of the GNU ARM Eclipse distribution.
|
||||||
|
// Copyright (c) 2014 Liviu Ionescu.
|
||||||
|
//
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include "stm32f4xx.h"
|
||||||
|
#include "stm32f4xx_hal.h"
|
||||||
|
#include "stm32f4xx_hal_cortex.h"
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// The external clock frequency is specified as a preprocessor definition
|
||||||
|
// passed to the compiler via a command line option (see the 'C/C++ General' ->
|
||||||
|
// 'Paths and Symbols' -> the 'Symbols' tab, if you want to change it).
|
||||||
|
// The value selected during project creation was HSE_VALUE=8000000.
|
||||||
|
//
|
||||||
|
// The code to set the clock is at the end.
|
||||||
|
//
|
||||||
|
// Note1: The default clock settings assume that the HSE_VALUE is a multiple
|
||||||
|
// of 1MHz, and try to reach the maximum speed available for the
|
||||||
|
// board. It does NOT guarantee that the required USB clock of 48MHz is
|
||||||
|
// available. If you need this, please update the settings of PLL_M, PLL_N,
|
||||||
|
// PLL_P, PLL_Q to match your needs.
|
||||||
|
//
|
||||||
|
// Note2: The external memory controllers are not enabled. If needed, you
|
||||||
|
// have to define DATA_IN_ExtSRAM or DATA_IN_ExtSDRAM and to configure
|
||||||
|
// the memory banks in system/src/cmsis/system_stm32f4xx.c to match your needs.
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Forward declarations.
|
||||||
|
|
||||||
|
void
|
||||||
|
__initialize_hardware(void);
|
||||||
|
|
||||||
|
void
|
||||||
|
SystemClock_Config(void);
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// This is the application hardware initialisation routine,
|
||||||
|
// redefined to add more inits.
|
||||||
|
//
|
||||||
|
// Called early from _start(), right after data & bss init, before
|
||||||
|
// constructors.
|
||||||
|
//
|
||||||
|
// After Reset the Cortex-M processor is in Thread mode,
|
||||||
|
// priority is Privileged, and the Stack is set to Main.
|
||||||
|
//
|
||||||
|
// Warning: The HAL requires the system timer, running at 1000 Hz
|
||||||
|
// and calling HAL_IncTick().
|
||||||
|
|
||||||
|
void
|
||||||
|
__initialize_hardware(void)
|
||||||
|
{
|
||||||
|
// Initialise the HAL Library; it must be the first function
|
||||||
|
// to be executed before the call of any HAL function.
|
||||||
|
HAL_Init();
|
||||||
|
|
||||||
|
// Enable HSE Oscillator and activate PLL with HSE as source
|
||||||
|
SystemClock_Config();
|
||||||
|
|
||||||
|
// Call the CSMSIS system clock routine to store the clock frequency
|
||||||
|
// in the SystemCoreClock global RAM location.
|
||||||
|
SystemCoreClockUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disable when using RTOSes, since they have their own handler.
|
||||||
|
#if 0
|
||||||
|
|
||||||
|
// This is a sample SysTick handler, use it if you need HAL timings.
|
||||||
|
void __attribute__ ((section(".after_vectors")))
|
||||||
|
SysTick_Handler(void)
|
||||||
|
{
|
||||||
|
#if defined(USE_HAL_DRIVER)
|
||||||
|
HAL_IncTick();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief System Clock Configuration
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
__attribute__((weak))
|
||||||
|
SystemClock_Config(void)
|
||||||
|
{
|
||||||
|
// Enable Power Control clock
|
||||||
|
__PWR_CLK_ENABLE();
|
||||||
|
|
||||||
|
// The voltage scaling allows optimizing the power consumption when the
|
||||||
|
// device is clocked below the maximum system frequency, to update the
|
||||||
|
// voltage scaling value regarding system frequency refer to product
|
||||||
|
// datasheet.
|
||||||
|
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
|
||||||
|
|
||||||
|
//#warning "Please check if the SystemClock_Config() settings match your board!"
|
||||||
|
// Comment out the warning after checking and updating.
|
||||||
|
|
||||||
|
RCC_OscInitTypeDef RCC_OscInitStruct;
|
||||||
|
|
||||||
|
#if defined(HSE_VALUE) && (HSE_VALUE != 0)
|
||||||
|
// Enable HSE Oscillator and activate PLL with HSE as source.
|
||||||
|
// This is tuned for STM32F4-DISCOVERY; update it for your board.
|
||||||
|
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
|
||||||
|
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
|
||||||
|
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
|
||||||
|
// This assumes the HSE_VALUE is a multiple of 1 MHz. If this is not
|
||||||
|
// your case, you have to recompute these PLL constants.
|
||||||
|
RCC_OscInitStruct.PLL.PLLM = (HSE_VALUE/1000000u);
|
||||||
|
#else
|
||||||
|
// Use HSI and activate PLL with HSI as source.
|
||||||
|
// This is tuned for NUCLEO-F411; update it for your board.
|
||||||
|
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
|
||||||
|
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
|
||||||
|
// 16 is the average calibration value, adjust for your own board.
|
||||||
|
RCC_OscInitStruct.HSICalibrationValue = 16;
|
||||||
|
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
|
||||||
|
// This assumes the HSI_VALUE is a multiple of 1 MHz. If this is not
|
||||||
|
// your case, you have to recompute these PLL constants.
|
||||||
|
RCC_OscInitStruct.PLL.PLLM = (HSI_VALUE/1000000u);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
RCC_OscInitStruct.PLL.PLLN = 336;
|
||||||
|
#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE)
|
||||||
|
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; /* 84 MHz */
|
||||||
|
#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)
|
||||||
|
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; /* 168 MHz */
|
||||||
|
#elif defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)
|
||||||
|
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; /* 168 MHz */
|
||||||
|
#elif defined(STM32F446xx)
|
||||||
|
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; /* 168 MHz */
|
||||||
|
#else
|
||||||
|
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; /* 84 MHz, conservative */
|
||||||
|
#endif
|
||||||
|
RCC_OscInitStruct.PLL.PLLQ = 7; /* To make USB work. */
|
||||||
|
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
|
||||||
|
HAL_RCC_OscConfig(&RCC_OscInitStruct);
|
||||||
|
|
||||||
|
RCC_ClkInitTypeDef RCC_ClkInitStruct;
|
||||||
|
// Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
|
||||||
|
// clocks dividers
|
||||||
|
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK
|
||||||
|
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
|
||||||
|
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
|
||||||
|
#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE)
|
||||||
|
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
|
||||||
|
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
|
||||||
|
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
|
||||||
|
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
|
||||||
|
#else
|
||||||
|
// This is expected to work for most large cores.
|
||||||
|
// Check and update it for your own configuration.
|
||||||
|
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
|
||||||
|
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
|
||||||
|
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
|
||||||
|
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
|
||||||
|
|
||||||
|
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
//
|
||||||
|
// This file is part of the µOS++ III distribution.
|
||||||
|
// Copyright (c) 2014 Liviu Ionescu.
|
||||||
|
//
|
||||||
|
|
||||||
|
// Do not include on semihosting and when freestanding
|
||||||
|
#if !defined(OS_USE_SEMIHOSTING) && !(__STDC_HOSTED__ == 0)
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include "diag/Trace.h"
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// When using retargetted configurations, the standard write() system call,
|
||||||
|
// after a long way inside newlib, finally calls this implementation function.
|
||||||
|
|
||||||
|
// Based on the file descriptor, it can send arrays of characters to
|
||||||
|
// different physical devices.
|
||||||
|
|
||||||
|
// Currently only the output and error file descriptors are tested,
|
||||||
|
// and the characters are forwarded to the trace device, mainly
|
||||||
|
// for demonstration purposes. Adjust it for your specific needs.
|
||||||
|
|
||||||
|
// For freestanding applications this file is not used and can be safely
|
||||||
|
// ignored.
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
_write (int fd, const char* buf, size_t nbyte);
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
_write (int fd __attribute__((unused)), const char* buf __attribute__((unused)),
|
||||||
|
size_t nbyte __attribute__((unused)))
|
||||||
|
{
|
||||||
|
#if defined(TRACE)
|
||||||
|
// STDOUT and STDERR are routed to the trace device
|
||||||
|
if (fd == 1 || fd == 2)
|
||||||
|
{
|
||||||
|
return trace_write (buf, nbyte);
|
||||||
|
}
|
||||||
|
#endif // TRACE
|
||||||
|
|
||||||
|
errno = ENOSYS;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#endif // !defined(OS_USE_SEMIHOSTING) && !(__STDC_HOSTED__ == 0)
|
||||||
@@ -6,8 +6,8 @@
|
|||||||
#ifndef BOARD_H_
|
#ifndef BOARD_H_
|
||||||
#define BOARD_H_
|
#define BOARD_H_
|
||||||
|
|
||||||
#ifdef BOARD_STM32F4_DISCOVERY
|
//#ifdef BOARD_STM32F4_DISCOVERY
|
||||||
#include "stm32f4-discovery.h"
|
#include "stm32f4-discovery.h"
|
||||||
#endif
|
//#endif
|
||||||
|
|
||||||
#endif /* BOARD_H_ */
|
#endif /* BOARD_H_ */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
INCLUDES += source/firmware/arch/stm32f4xx/board
|
INCLUDES += source/firmware/arch/stm32f4xx/board
|
||||||
DOC_SRC += source/firmware/arch/stm32f4xx/board
|
DOC_SRC += source/firmware/arch/stm32f4xx/board
|
||||||
|
|
||||||
ifeq ($(BOARD), stm32f4-discovery)
|
#ifeq ($(BOARD), stm32f4-discovery)
|
||||||
include source/firmware/arch/stm32f4xx/board/stm32f4-discovery/stm32f4-discovery.mk
|
include source/firmware/arch/stm32f4xx/board/stm32f4-discovery/stm32f4-discovery.mk
|
||||||
endif
|
#endif
|
||||||
|
|||||||
+159
-118
@@ -6,78 +6,107 @@
|
|||||||
#ifndef BSP_STM32F4_DISCOVERY_H_
|
#ifndef BSP_STM32F4_DISCOVERY_H_
|
||||||
#define BSP_STM32F4_DISCOVERY_H_
|
#define BSP_STM32F4_DISCOVERY_H_
|
||||||
|
|
||||||
#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
|
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "driver.h"
|
|
||||||
#include "gpio.h"
|
|
||||||
#include "pwm.h"
|
|
||||||
#include "timer.h"
|
|
||||||
#include "uart.h"
|
|
||||||
#include "ringbuffer.h"
|
|
||||||
#include "sys_tick.h"
|
|
||||||
#include "stm32f4xx.h"
|
#include "stm32f4xx.h"
|
||||||
#include "stm32f4_gpio.h"
|
|
||||||
#include "stm32f4_pwm.h"
|
|
||||||
#include "stm32f4_uart.h"
|
|
||||||
#include "stm32_sys_tick.h"
|
|
||||||
|
|
||||||
|
#include "pwm.h"
|
||||||
|
#include "stm32f4_pwm.h"
|
||||||
|
|
||||||
|
#include "uart.h"
|
||||||
|
#include "stm32f4_uart.h"
|
||||||
|
#include "ringbuffer.h"
|
||||||
|
|
||||||
|
#include "timer.h"
|
||||||
|
#include "stm32_sys_tick.h"
|
||||||
|
#include "sys_tick.h"
|
||||||
|
|
||||||
|
#include "gpio.h"
|
||||||
|
#include "stm32f4_gpio.h"
|
||||||
|
#include "driver.h"
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
// GPIO_D12
|
||||||
|
static const GPIO_InitTypeDef port_cfg_d12 = {
|
||||||
|
.Pin = GPIO_PIN_12,
|
||||||
|
.Mode = GPIO_MODE_OUTPUT_PP,
|
||||||
|
.Speed = GPIO_SPEED_FREQ_HIGH,
|
||||||
|
.Pull = GPIO_PULLUP,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct stm32f4_gpio stm32_f4_gpio_d12 = {
|
||||||
|
.port = GPIOD,
|
||||||
|
.pin = &port_cfg_d12,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct gpio __gpio_d12 = {
|
||||||
|
(void*)&stm32_f4_gpio_d12,
|
||||||
|
&gpio_fp
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct driver gpio_d12 = {
|
||||||
|
DRIVER_TYPE_GPIO,
|
||||||
|
&__gpio_d12,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
// SYSTEM TICK
|
// SYSTEM TICK
|
||||||
static const enum stm32_sys_tick_time_base stm23_sys_tick_time_base =
|
static const enum stm32_sys_tick_time_base stm23_sys_tick_time_base =
|
||||||
STM32_SYS_TICK_TIME_BASE_MS;
|
STM32_SYS_TICK_TIME_BASE_MS;
|
||||||
|
|
||||||
static const struct stm32_sys_tick stm32_sys_tick = {
|
static const struct stm32_sys_tick stm32_sys_tick = {
|
||||||
&stm23_sys_tick_time_base,
|
.tick_time_base = &stm23_sys_tick_time_base,
|
||||||
NULL,
|
.sys_tick_cb = NULL,
|
||||||
NULL
|
.sys_tick_cb_param = NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct loki_timer timer_1 = {
|
static const struct loki_timer timer_1 = {
|
||||||
(void*)&stm32_sys_tick,
|
.arch_dep_device = (void*)&stm32_sys_tick,
|
||||||
&timer_fp
|
.fp = &timer_fp
|
||||||
};
|
};
|
||||||
|
|
||||||
// PWM CHANNEL 4
|
// PWM CHANNEL 4
|
||||||
/* apb1 clock = 84MHz */
|
/* apb1 clock = 84MHz */
|
||||||
/* period_reg = src_clk / presc / cnt_clk */
|
/* period_reg = src_clk / presc / cnt_clk */
|
||||||
/* 4199 = 84MHZ / (0 + 1) / 20kHz - 1 */
|
/* 4199 = 84MHZ / (0 + 1) / 20kHz - 1 */
|
||||||
static const TIM_TimeBaseInitTypeDef timer_4_cfg = {
|
static TIM_HandleTypeDef tim4_handle = {
|
||||||
.TIM_RepetitionCounter = 0x0000,
|
.Instance = TIM4,
|
||||||
.TIM_Prescaler = 0,
|
.Init.Prescaler = 0,
|
||||||
.TIM_ClockDivision = TIM_CKD_DIV1,
|
.Init.CounterMode = TIM_COUNTERMODE_UP,
|
||||||
.TIM_CounterMode = TIM_CounterMode_Up,
|
.Init.Period = 4199,
|
||||||
.TIM_Period = 4199
|
.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1,
|
||||||
|
.Init.RepetitionCounter = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const TIM_OCInitTypeDef t4_output_compare_cfg = {
|
static TIM_OC_InitTypeDef t4_output_compare_cfg = {
|
||||||
.TIM_OutputNState = TIM_OutputNState_Disable,
|
.OCMode = TIM_OCMODE_PWM1,
|
||||||
.TIM_OCNPolarity = TIM_OCPolarity_High,
|
.Pulse = 0,
|
||||||
.TIM_OCIdleState = TIM_OCIdleState_Reset,
|
.OCPolarity = TIM_OCPOLARITY_HIGH,
|
||||||
.TIM_OCNIdleState = TIM_OCNIdleState_Set,
|
.OCNPolarity = TIM_OCNPOLARITY_HIGH,
|
||||||
.TIM_OCMode = TIM_OCMode_PWM1,
|
.OCFastMode = TIM_OCFAST_DISABLE,
|
||||||
.TIM_OCPolarity = TIM_OCPolarity_High,
|
.OCIdleState = TIM_OCIDLESTATE_SET,
|
||||||
.TIM_OutputState = TIM_OutputState_Enable,
|
.OCNIdleState = TIM_OCNIDLESTATE_SET
|
||||||
.TIM_Pulse = 0,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const GPIO_InitTypeDef port_cfg_D15 = {
|
static const GPIO_InitTypeDef port_cfg_D15 = {
|
||||||
.GPIO_Pin = GPIO_Pin_15,
|
.Pin = GPIO_PIN_15,
|
||||||
.GPIO_Mode = GPIO_Mode_AF,
|
.Mode = GPIO_MODE_AF_PP,
|
||||||
.GPIO_OType = GPIO_OType_PP,
|
.Speed = GPIO_SPEED_FREQ_HIGH,
|
||||||
.GPIO_PuPd = GPIO_PuPd_UP,
|
.Pull = GPIO_PULLUP,
|
||||||
.GPIO_Speed = GPIO_Speed_100MHz,
|
.Alternate = GPIO_AF2_TIM4,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct stm32f4_gpio t4c4_gpio = {
|
||||||
|
.port = GPIOD,
|
||||||
|
.pin = &port_cfg_D15,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct stm32f4_pwm str32f4_pwm_4 = {
|
static struct stm32f4_pwm str32f4_pwm_4 = {
|
||||||
.timer = TIM4,
|
.pwm_gpio = &t4c4_gpio,
|
||||||
.timer_cfg = &timer_4_cfg,
|
.timer_handle = &tim4_handle,
|
||||||
.output_compare_cfg = &t4_output_compare_cfg,
|
.output_compare_cfg = &t4_output_compare_cfg,
|
||||||
.port = GPIOD,
|
.channel = TIM_CHANNEL_4,
|
||||||
.pin_src = GPIO_PinSource15,
|
|
||||||
.port_cfg = &port_cfg_D15,
|
|
||||||
.channel = channel_4,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct pwm pwm_ch4 = {
|
static const struct pwm pwm_ch4 = {
|
||||||
@@ -96,21 +125,22 @@ const struct driver pwm_4 = {
|
|||||||
|
|
||||||
// PWM Channel 3
|
// PWM Channel 3
|
||||||
static const GPIO_InitTypeDef port_cfg_D14 = {
|
static const GPIO_InitTypeDef port_cfg_D14 = {
|
||||||
.GPIO_Pin = GPIO_Pin_14,
|
.Pin = GPIO_PIN_14,
|
||||||
.GPIO_Mode = GPIO_Mode_AF,
|
.Mode = GPIO_MODE_AF_PP,
|
||||||
.GPIO_OType = GPIO_OType_PP,
|
.Speed = GPIO_SPEED_FREQ_HIGH,
|
||||||
.GPIO_PuPd = GPIO_PuPd_UP,
|
.Pull = GPIO_PULLUP,
|
||||||
.GPIO_Speed = GPIO_Speed_100MHz,
|
.Alternate = GPIO_AF2_TIM4,
|
||||||
|
};
|
||||||
|
static const struct stm32f4_gpio stm32f4_pwm_t4c3_gpio = {
|
||||||
|
.port = GPIOD,
|
||||||
|
.pin = &port_cfg_D14,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct stm32f4_pwm str32f4_pwm_3 = {
|
static struct stm32f4_pwm str32f4_pwm_3 = {
|
||||||
.timer = TIM4,
|
.pwm_gpio = &stm32f4_pwm_t4c3_gpio,
|
||||||
.timer_cfg = &timer_4_cfg,
|
.timer_handle = &tim4_handle,
|
||||||
.output_compare_cfg = &t4_output_compare_cfg,
|
.output_compare_cfg = &t4_output_compare_cfg,
|
||||||
.port = GPIOD,
|
.channel = TIM_CHANNEL_3,
|
||||||
.pin_src = GPIO_PinSource14,
|
|
||||||
.port_cfg = &port_cfg_D14,
|
|
||||||
.channel = channel_3,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct pwm pwm_ch3 = {
|
static const struct pwm pwm_ch3 = {
|
||||||
@@ -129,21 +159,22 @@ const struct driver pwm_3 = {
|
|||||||
|
|
||||||
// PWM Channel 2
|
// PWM Channel 2
|
||||||
static const GPIO_InitTypeDef port_cfg_D13 = {
|
static const GPIO_InitTypeDef port_cfg_D13 = {
|
||||||
.GPIO_Pin = GPIO_Pin_13,
|
.Pin = GPIO_PIN_13,
|
||||||
.GPIO_Mode = GPIO_Mode_AF,
|
.Mode = GPIO_MODE_AF_PP,
|
||||||
.GPIO_OType = GPIO_OType_PP,
|
.Speed = GPIO_SPEED_FREQ_HIGH,
|
||||||
.GPIO_PuPd = GPIO_PuPd_UP,
|
.Pull = GPIO_PULLUP,
|
||||||
.GPIO_Speed = GPIO_Speed_100MHz,
|
.Alternate = GPIO_AF2_TIM4,
|
||||||
|
};
|
||||||
|
static const struct stm32f4_gpio stm32f4_pwm_t4c2_gpio = {
|
||||||
|
.port = GPIOD,
|
||||||
|
.pin = &port_cfg_D13,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct stm32f4_pwm str32f4_pwm_2 = {
|
static struct stm32f4_pwm str32f4_pwm_2 = {
|
||||||
.timer = TIM4,
|
.pwm_gpio = &stm32f4_pwm_t4c2_gpio,
|
||||||
.timer_cfg = &timer_4_cfg,
|
.timer_handle = &tim4_handle,
|
||||||
.output_compare_cfg = &t4_output_compare_cfg,
|
.output_compare_cfg = &t4_output_compare_cfg,
|
||||||
.port = GPIOD,
|
.channel = TIM_CHANNEL_2,
|
||||||
.pin_src = GPIO_PinSource13,
|
|
||||||
.port_cfg = &port_cfg_D13,
|
|
||||||
.channel = channel_2,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct pwm pwm_ch2 = {
|
static const struct pwm pwm_ch2 = {
|
||||||
@@ -162,21 +193,22 @@ const struct driver pwm_2 = {
|
|||||||
|
|
||||||
// PWM Channel 1
|
// PWM Channel 1
|
||||||
static const GPIO_InitTypeDef port_cfg_D12 = {
|
static const GPIO_InitTypeDef port_cfg_D12 = {
|
||||||
.GPIO_Pin = GPIO_Pin_12,
|
.Pin = GPIO_PIN_12,
|
||||||
.GPIO_Mode = GPIO_Mode_AF,
|
.Mode = GPIO_MODE_AF_PP,
|
||||||
.GPIO_OType = GPIO_OType_PP,
|
.Speed = GPIO_SPEED_FREQ_HIGH,
|
||||||
.GPIO_PuPd = GPIO_PuPd_UP,
|
.Pull = GPIO_PULLUP,
|
||||||
.GPIO_Speed = GPIO_Speed_100MHz,
|
.Alternate = GPIO_AF2_TIM4,
|
||||||
|
};
|
||||||
|
static const struct stm32f4_gpio stm32f4_pwm_t4c1_gpio = {
|
||||||
|
.port = GPIOD,
|
||||||
|
.pin = &port_cfg_D12,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct stm32f4_pwm str32f4_pwm_1 = {
|
static struct stm32f4_pwm str32f4_pwm_1 = {
|
||||||
.timer = TIM4,
|
.pwm_gpio = &stm32f4_pwm_t4c1_gpio,
|
||||||
.timer_cfg = &timer_4_cfg,
|
.timer_handle = &tim4_handle,
|
||||||
.output_compare_cfg = &t4_output_compare_cfg,
|
.output_compare_cfg = &t4_output_compare_cfg,
|
||||||
.port = GPIOD,
|
.channel = TIM_CHANNEL_1,
|
||||||
.pin_src = GPIO_PinSource12,
|
|
||||||
.port_cfg = &port_cfg_D12,
|
|
||||||
.channel = channel_1,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct pwm pwm_ch1 = {
|
static const struct pwm pwm_ch1 = {
|
||||||
@@ -194,49 +226,54 @@ const struct driver pwm_1 = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// UART 1
|
// UART 1
|
||||||
static char console_linear_buffer[80];
|
static const GPIO_InitTypeDef port_cfg_uart1 = {
|
||||||
|
.Pin = GPIO_PIN_6 | GPIO_PIN_7,
|
||||||
|
.Mode = GPIO_MODE_AF_PP,
|
||||||
|
.Pull = GPIO_PULLUP,
|
||||||
|
.Speed = GPIO_SPEED_FREQ_HIGH,
|
||||||
|
.Alternate = GPIO_AF7_USART1,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct stm32f4_gpio stm32f4_uart1_gpio = {
|
||||||
|
.port = GPIOB,
|
||||||
|
.pin = &port_cfg_uart1,
|
||||||
|
};
|
||||||
|
|
||||||
|
static UART_HandleTypeDef stm32f4_discovery_uart1_handle = {
|
||||||
|
.Instance = USART1,
|
||||||
|
.Init.BaudRate = 115200,
|
||||||
|
.Init.WordLength = UART_WORDLENGTH_8B,
|
||||||
|
.Init.StopBits = UART_STOPBITS_1,
|
||||||
|
.Init.Parity = UART_PARITY_NONE,
|
||||||
|
.Init.Mode = UART_MODE_TX_RX,
|
||||||
|
.Init.HwFlowCtl = UART_HWCONTROL_NONE,
|
||||||
|
.Init.OverSampling = UART_OVERSAMPLING_16,
|
||||||
|
.pTxBuffPtr = NULL,
|
||||||
|
.TxXferSize = 0,
|
||||||
|
.TxXferCount = 0,
|
||||||
|
.pRxBuffPtr = NULL,
|
||||||
|
.RxXferSize = 0,
|
||||||
|
.RxXferCount = 0,
|
||||||
|
.hdmatx = NULL,
|
||||||
|
.hdmarx = NULL,
|
||||||
|
.Lock = HAL_UNLOCKED,
|
||||||
|
.gState = HAL_UART_STATE_RESET,
|
||||||
|
.ErrorCode = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct stm32f4_uart stm32f4_uart1 = {
|
||||||
|
.uart_gpio = &stm32f4_uart1_gpio,
|
||||||
|
.uart_handle = &stm32f4_discovery_uart1_handle,
|
||||||
|
};
|
||||||
|
|
||||||
|
static char console_linear_buffer[10];
|
||||||
static struct ringbuffer console_buffer = {
|
static struct ringbuffer console_buffer = {
|
||||||
console_linear_buffer,
|
console_linear_buffer,
|
||||||
console_linear_buffer,
|
console_linear_buffer,
|
||||||
console_linear_buffer,
|
console_linear_buffer,
|
||||||
sizeof(console_linear_buffer),
|
10,
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
static const GPIO_InitTypeDef stm32f4_discovery_uart1_gpio = {
|
|
||||||
GPIO_Pin_6 | GPIO_Pin_7,
|
|
||||||
GPIO_Mode_AF,
|
|
||||||
GPIO_Speed_50MHz,
|
|
||||||
GPIO_OType_PP,
|
|
||||||
GPIO_PuPd_UP
|
|
||||||
};
|
|
||||||
|
|
||||||
static const USART_InitTypeDef stm32f4_discovery_uart1_usart_init = {
|
|
||||||
115200,
|
|
||||||
USART_WordLength_8b,
|
|
||||||
USART_StopBits_1,
|
|
||||||
USART_Parity_No,
|
|
||||||
USART_Mode_Tx | USART_Mode_Rx,
|
|
||||||
USART_HardwareFlowControl_None,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const NVIC_InitTypeDef stm32f4_discovery_uart1_nvic_init = {
|
|
||||||
USART1_IRQn,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
ENABLE,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct stm32f4_uart stm32f4_uart1 = {
|
|
||||||
&stm32f4_discovery_uart1_gpio,
|
|
||||||
GPIOB,
|
|
||||||
GPIO_PinSource7,
|
|
||||||
GPIO_PinSource6,
|
|
||||||
&stm32f4_discovery_uart1_usart_init,
|
|
||||||
USART1,
|
|
||||||
USART_IT_RXNE /* | USART_IT_TXE*/,
|
|
||||||
&stm32f4_discovery_uart1_nvic_init,
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct uart __uart_1 = {
|
static const struct uart __uart_1 = {
|
||||||
&stm32f4_uart1,
|
&stm32f4_uart1,
|
||||||
@@ -253,6 +290,7 @@ const struct driver uart_1 = {
|
|||||||
&__uart_1,
|
&__uart_1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if 0
|
||||||
// GPIOC0
|
// GPIOC0
|
||||||
static const GPIO_InitTypeDef port_cfg_C0 = {
|
static const GPIO_InitTypeDef port_cfg_C0 = {
|
||||||
GPIO_Pin_0,
|
GPIO_Pin_0,
|
||||||
@@ -284,7 +322,8 @@ const struct driver gpio_c0 = {
|
|||||||
DRIVER_TYPE_GPIO,
|
DRIVER_TYPE_GPIO,
|
||||||
&__gpio_c0,
|
&__gpio_c0,
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
#if 0
|
||||||
// GPIO_C1
|
// GPIO_C1
|
||||||
static const GPIO_InitTypeDef port_cfg_C1 = {
|
static const GPIO_InitTypeDef port_cfg_C1 = {
|
||||||
GPIO_Pin_1,
|
GPIO_Pin_1,
|
||||||
@@ -316,7 +355,8 @@ const struct driver gpio_c1 = {
|
|||||||
DRIVER_TYPE_GPIO,
|
DRIVER_TYPE_GPIO,
|
||||||
&__gpio_c1,
|
&__gpio_c1,
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
#if 0
|
||||||
// GPIO_C2
|
// GPIO_C2
|
||||||
static const GPIO_InitTypeDef port_cfg_C2 = {
|
static const GPIO_InitTypeDef port_cfg_C2 = {
|
||||||
GPIO_Pin_2,
|
GPIO_Pin_2,
|
||||||
@@ -348,7 +388,8 @@ const struct driver gpio_c2 = {
|
|||||||
DRIVER_TYPE_GPIO,
|
DRIVER_TYPE_GPIO,
|
||||||
&__gpio_c2,
|
&__gpio_c2,
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
#if 0
|
||||||
// GPIO_C3
|
// GPIO_C3
|
||||||
static const GPIO_InitTypeDef port_cfg_C3 = {
|
static const GPIO_InitTypeDef port_cfg_C3 = {
|
||||||
GPIO_Pin_3,
|
GPIO_Pin_3,
|
||||||
@@ -380,7 +421,7 @@ const struct driver gpio_c3 = {
|
|||||||
DRIVER_TYPE_GPIO,
|
DRIVER_TYPE_GPIO,
|
||||||
&__gpio_c3,
|
&__gpio_c3,
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
//! \brief Setup the hardware of the stm32f4-discovery board.
|
//! \brief Setup the hardware of the stm32f4-discovery board.
|
||||||
void board_init(void);
|
void board_init(void);
|
||||||
|
|
||||||
|
|||||||
@@ -7,10 +7,12 @@
|
|||||||
|
|
||||||
#include "board.h"
|
#include "board.h"
|
||||||
|
|
||||||
void board_init(void) {
|
void board_init(void)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0);
|
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0);
|
||||||
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
|
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
|
||||||
SysTick_CLKSourceConfig(RCC_SYSCLKSource_PLLCLK);
|
SysTick_CLKSourceConfig(RCC_SYSCLKSource_PLLCLK);
|
||||||
|
#endif
|
||||||
sys_tick_init(&timer_1);
|
sys_tick_init(&timer_1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,2 @@
|
|||||||
CHECK_FOLDER += source/firmware/arch/stm32f4xx/board/stm32f4-discovery
|
SRC_DIR += source/firmware/arch/stm32f4xx/board/stm32f4-discovery
|
||||||
SUB_FOLDER += source/firmware/arch/stm32f4xx/board/stm32f4-discovery
|
|
||||||
INCLUDES += source/firmware/arch/stm32f4xx/board/stm32f4-discovery/include
|
INCLUDES += source/firmware/arch/stm32f4xx/board/stm32f4-discovery/include
|
||||||
DOC_SRC += source/firmware/arch/stm32f4xx/board/stm32f4-discovery
|
|
||||||
@@ -1,5 +1,2 @@
|
|||||||
CHECK_FOLDER += source/firmware/arch/stm32f4xx/driver
|
SRC_DIR += source/firmware/arch/stm32f4xx/driver
|
||||||
SUB_FOLDER += source/firmware/arch/stm32f4xx/driver
|
|
||||||
INCLUDES += source/firmware/arch/stm32f4xx/driver/include
|
INCLUDES += source/firmware/arch/stm32f4xx/driver/include
|
||||||
DOC_SRC += source/firmware/arch/stm32f4xx/driver
|
|
||||||
DOC_SRC += source/firmware/arch/stm32f4xx/driver/include
|
|
||||||
|
|||||||
Executable → Regular
-2
@@ -5,8 +5,6 @@
|
|||||||
#ifndef STM32_SYS_TICK_H_
|
#ifndef STM32_SYS_TICK_H_
|
||||||
#define STM32_SYS_TICK_H_
|
#define STM32_SYS_TICK_H_
|
||||||
|
|
||||||
#include "timer.h"
|
|
||||||
|
|
||||||
typedef void* (*stm32_sys_tick_cb_t)(void*); //!< callback for the external interrupt
|
typedef void* (*stm32_sys_tick_cb_t)(void*); //!< callback for the external interrupt
|
||||||
|
|
||||||
//! \brief Type of sys tick base time.
|
//! \brief Type of sys tick base time.
|
||||||
|
|||||||
@@ -12,10 +12,6 @@ typedef void* (*gpio_ext_it_cb_t)(void*);
|
|||||||
struct stm32f4_gpio {
|
struct stm32f4_gpio {
|
||||||
GPIO_TypeDef *port; //!< Gpio port
|
GPIO_TypeDef *port; //!< Gpio port
|
||||||
const GPIO_InitTypeDef *pin; //!< Gpio pin
|
const GPIO_InitTypeDef *pin; //!< Gpio pin
|
||||||
const EXTI_InitTypeDef *exti; //!< Gpio exit it (could be NULL)
|
|
||||||
const NVIC_InitTypeDef *nvic; //!< Gpio nvic (could be NULL)
|
|
||||||
gpio_ext_it_cb_t ext_it_cb; //!< Gpio ext it callback (could be NULL)
|
|
||||||
void *param; //!< Parameter for the callback
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//! \brief Open a gpio.
|
//! \brief Open a gpio.
|
||||||
|
|||||||
@@ -8,23 +8,15 @@
|
|||||||
#ifndef SOURCE_FIRMWARE_ARCH_STM32F4XX_DRIVER_INCLUDE_STM32F4_PWM_H_
|
#ifndef SOURCE_FIRMWARE_ARCH_STM32F4XX_DRIVER_INCLUDE_STM32F4_PWM_H_
|
||||||
#define SOURCE_FIRMWARE_ARCH_STM32F4XX_DRIVER_INCLUDE_STM32F4_PWM_H_
|
#define SOURCE_FIRMWARE_ARCH_STM32F4XX_DRIVER_INCLUDE_STM32F4_PWM_H_
|
||||||
|
|
||||||
enum stm32f4_pwm_channel {
|
#pragma pack(push)
|
||||||
channel_1 = 1,
|
#pragma pack(1)
|
||||||
channel_2,
|
|
||||||
channel_3,
|
|
||||||
channel_4
|
|
||||||
};
|
|
||||||
|
|
||||||
struct stm32f4_pwm {
|
struct stm32f4_pwm {
|
||||||
TIM_TypeDef *timer;
|
const struct stm32f4_gpio *pwm_gpio;
|
||||||
const TIM_TimeBaseInitTypeDef *timer_cfg;
|
TIM_HandleTypeDef *timer_handle;
|
||||||
const TIM_OCInitTypeDef *output_compare_cfg;
|
TIM_OC_InitTypeDef *output_compare_cfg;
|
||||||
const TIM_BDTRInitTypeDef *bdtr_cfg;
|
uint32_t channel;
|
||||||
GPIO_TypeDef *port;
|
|
||||||
uint8_t pin_src;
|
|
||||||
const GPIO_InitTypeDef *port_cfg;
|
|
||||||
enum stm32f4_pwm_channel channel;
|
|
||||||
};
|
};
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
|
||||||
int stm32f4_pwm_open(const void *pwm);
|
int stm32f4_pwm_open(const void *pwm);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* stm32_uart.h
|
* stm32f4_uart.h
|
||||||
*
|
*
|
||||||
* Created on: Jul 24, 2016
|
* Created on: Jul 24, 2016
|
||||||
* Author: tkl
|
* Author: tkl
|
||||||
@@ -12,16 +12,13 @@
|
|||||||
#include "uart.h"
|
#include "uart.h"
|
||||||
|
|
||||||
//! \brief Stm32f4 uart device.
|
//! \brief Stm32f4 uart device.
|
||||||
|
#pragma pack(push)
|
||||||
|
#pragma pack(1)
|
||||||
struct stm32f4_uart {
|
struct stm32f4_uart {
|
||||||
const GPIO_InitTypeDef *gpio_init;
|
const struct stm32f4_gpio *uart_gpio;
|
||||||
GPIO_TypeDef *gpio_port;
|
UART_HandleTypeDef *uart_handle;
|
||||||
uint8_t pin_src_rx;
|
|
||||||
uint8_t pin_src_tx;
|
|
||||||
const USART_InitTypeDef *usart_init;
|
|
||||||
USART_TypeDef *usart_port;
|
|
||||||
uint16_t usart_it_select;
|
|
||||||
const NVIC_InitTypeDef *nvic_init;
|
|
||||||
};
|
};
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
//! \brief Open an uart device.
|
//! \brief Open an uart device.
|
||||||
//! \param this The uart to open.
|
//! \param this The uart to open.
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#include "stm32f4xx.h"
|
#include "stm32f4xx.h"
|
||||||
|
|
||||||
|
#include "timer.h"
|
||||||
#include "stm32_sys_tick.h"
|
#include "stm32_sys_tick.h"
|
||||||
#include "stm32f4xx_isr.h"
|
#include "stm32f4xx_isr.h"
|
||||||
|
|
||||||
@@ -67,6 +68,9 @@ void SysTick_Handler(void)
|
|||||||
{
|
{
|
||||||
enter_isr();
|
enter_isr();
|
||||||
|
|
||||||
|
#if defined(USE_HAL_DRIVER)
|
||||||
|
HAL_IncTick();
|
||||||
|
#endif
|
||||||
if(stm32_sys_tick_obj.sys_tick_cb != NULL) {
|
if(stm32_sys_tick_obj.sys_tick_cb != NULL) {
|
||||||
stm32_sys_tick_cb_t cb = stm32_sys_tick_obj.sys_tick_cb;
|
stm32_sys_tick_cb_t cb = stm32_sys_tick_obj.sys_tick_cb;
|
||||||
void *param = stm32_sys_tick_obj.sys_tick_cb_param;
|
void *param = stm32_sys_tick_obj.sys_tick_cb_param;
|
||||||
@@ -75,3 +79,8 @@ void SysTick_Handler(void)
|
|||||||
|
|
||||||
exit_isr();
|
exit_isr();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority)
|
||||||
|
{
|
||||||
|
return HAL_OK;
|
||||||
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ typedef struct {
|
|||||||
void *param; //!< Parameter for the callback
|
void *param; //!< Parameter for the callback
|
||||||
}exti_cb_list_t;
|
}exti_cb_list_t;
|
||||||
|
|
||||||
|
#if 0
|
||||||
//! \brief Contains call back data for all 16 exti lines.
|
//! \brief Contains call back data for all 16 exti lines.
|
||||||
static struct {
|
static struct {
|
||||||
exti_cb_list_t callback_list[16]; //!< Call back data list for the exti lines.
|
exti_cb_list_t callback_list[16]; //!< Call back data list for the exti lines.
|
||||||
@@ -45,83 +46,34 @@ static uint8_t gpio_bin2dec(uint16_t bin)
|
|||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
static void gpio_init(const struct stm32f4_gpio *gpio)
|
|
||||||
{
|
|
||||||
uint8_t m_port = 0;
|
|
||||||
uint8_t m_pin = 0;
|
|
||||||
uint32_t clock = 0;
|
|
||||||
if(gpio == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(gpio->port == GPIOA) {
|
|
||||||
clock = RCC_AHB1Periph_GPIOA;
|
|
||||||
m_port = EXTI_PortSourceGPIOA;
|
|
||||||
}
|
|
||||||
else if(gpio->port == GPIOB) {
|
|
||||||
clock = RCC_AHB1Periph_GPIOB;
|
|
||||||
m_port = EXTI_PortSourceGPIOB;
|
|
||||||
}
|
|
||||||
else if(gpio->port == GPIOC) {
|
|
||||||
clock = RCC_AHB1Periph_GPIOC;
|
|
||||||
m_port = EXTI_PortSourceGPIOC;
|
|
||||||
}
|
|
||||||
else if(gpio->port == GPIOD) {
|
|
||||||
clock = RCC_AHB1Periph_GPIOD;
|
|
||||||
m_port = EXTI_PortSourceGPIOD;
|
|
||||||
}
|
|
||||||
else if(gpio->port == GPIOE) {
|
|
||||||
clock = RCC_AHB1Periph_GPIOE;
|
|
||||||
m_port = EXTI_PortSourceGPIOE;
|
|
||||||
}
|
|
||||||
else if(gpio->port == GPIOF) {
|
|
||||||
clock = RCC_AHB1Periph_GPIOF;
|
|
||||||
m_port = EXTI_PortSourceGPIOF;
|
|
||||||
}
|
|
||||||
else if(gpio->port == GPIOG) {
|
|
||||||
clock = RCC_AHB1Periph_GPIOG;
|
|
||||||
m_port = EXTI_PortSourceGPIOG;
|
|
||||||
}
|
|
||||||
else if(gpio->port == GPIOH) {
|
|
||||||
clock = RCC_AHB1Periph_GPIOH;
|
|
||||||
m_port = EXTI_PortSourceGPIOH;
|
|
||||||
}
|
|
||||||
else if(gpio->port == GPIOI) {
|
|
||||||
clock = RCC_AHB1Periph_GPIOI;
|
|
||||||
m_port = EXTI_PortSourceGPIOI;
|
|
||||||
}
|
|
||||||
|
|
||||||
RCC_AHB1PeriphClockCmd(clock, ENABLE);
|
|
||||||
m_pin = gpio_bin2dec(gpio->pin->GPIO_Pin);
|
|
||||||
|
|
||||||
SYSCFG_EXTILineConfig(m_port, m_pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
int stm32f4_gpio_open(const void *gpio)
|
int stm32f4_gpio_open(const void *gpio)
|
||||||
{
|
{
|
||||||
struct stm32f4_gpio *this;
|
struct stm32f4_gpio *this;
|
||||||
uint8_t m_pin = 0;
|
|
||||||
|
|
||||||
if(gpio == NULL)
|
if(gpio == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
this = (struct stm32f4_gpio *)gpio;
|
this = (struct stm32f4_gpio *)gpio;
|
||||||
gpio_init(this);
|
if(this->port == GPIOA)
|
||||||
m_pin = gpio_bin2dec(this->pin->GPIO_Pin);
|
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||||||
|
else if(this->port == GPIOB)
|
||||||
GPIO_Init(this->port, (GPIO_InitTypeDef*)this->pin);
|
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||||
|
else if(this->port == GPIOC)
|
||||||
if(this->ext_it_cb != NULL) {
|
__HAL_RCC_GPIOC_CLK_ENABLE();
|
||||||
gpio_obj.callback_list[m_pin].callback = this->ext_it_cb;
|
else if(this->port == GPIOD)
|
||||||
gpio_obj.callback_list[m_pin].param = this->param;
|
__HAL_RCC_GPIOD_CLK_ENABLE();
|
||||||
}
|
else if(this->port == GPIOE)
|
||||||
|
__HAL_RCC_GPIOE_CLK_ENABLE();
|
||||||
if((this->exti != NULL) && (this->nvic != NULL)) {
|
else if(this->port == GPIOF)
|
||||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
|
__HAL_RCC_GPIOF_CLK_ENABLE();
|
||||||
EXTI_Init((EXTI_InitTypeDef*)this->exti);
|
else if(this->port == GPIOG)
|
||||||
NVIC_Init((NVIC_InitTypeDef*)this->nvic);
|
__HAL_RCC_GPIOG_CLK_ENABLE();
|
||||||
}
|
else if(this->port == GPIOH)
|
||||||
|
__HAL_RCC_GPIOH_CLK_ENABLE();
|
||||||
|
else if(this->port == GPIOI)
|
||||||
|
__HAL_RCC_GPIOI_CLK_ENABLE();
|
||||||
|
HAL_GPIO_Init(this->port, (GPIO_InitTypeDef*)this->pin);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -129,7 +81,26 @@ int stm32f4_gpio_close(const void *gpio)
|
|||||||
{
|
{
|
||||||
if(gpio == NULL)
|
if(gpio == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
// TODO: deinit exti, nvic & gpio
|
struct stm32f4_gpio *this = (struct stm32f4_gpio *)gpio;
|
||||||
|
HAL_GPIO_DeInit(this->port, this->pin->Pin);
|
||||||
|
if(this->port == GPIOA)
|
||||||
|
__HAL_RCC_GPIOA_CLK_DISABLE();
|
||||||
|
else if(this->port == GPIOB)
|
||||||
|
__HAL_RCC_GPIOB_CLK_DISABLE();
|
||||||
|
else if(this->port == GPIOC)
|
||||||
|
__HAL_RCC_GPIOC_CLK_DISABLE();
|
||||||
|
else if(this->port == GPIOD)
|
||||||
|
__HAL_RCC_GPIOD_CLK_DISABLE();
|
||||||
|
else if(this->port == GPIOE)
|
||||||
|
__HAL_RCC_GPIOE_CLK_DISABLE();
|
||||||
|
else if(this->port == GPIOF)
|
||||||
|
__HAL_RCC_GPIOF_CLK_DISABLE();
|
||||||
|
else if(this->port == GPIOG)
|
||||||
|
__HAL_RCC_GPIOG_CLK_DISABLE();
|
||||||
|
else if(this->port == GPIOH)
|
||||||
|
__HAL_RCC_GPIOH_CLK_DISABLE();
|
||||||
|
else if(this->port == GPIOI)
|
||||||
|
__HAL_RCC_GPIOI_CLK_DISABLE();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -140,7 +111,7 @@ char stm32f4_gpio_read(const void *gpio)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
this = (struct stm32f4_gpio *)gpio;
|
this = (struct stm32f4_gpio *)gpio;
|
||||||
return GPIO_ReadOutputDataBit(this->port, this->pin->GPIO_Pin);
|
return HAL_GPIO_ReadPin(this->port, this->pin->Pin);
|
||||||
}
|
}
|
||||||
|
|
||||||
void stm32f4_gpio_write(const void *gpio, char byte) {
|
void stm32f4_gpio_write(const void *gpio, char byte) {
|
||||||
@@ -149,7 +120,7 @@ void stm32f4_gpio_write(const void *gpio, char byte) {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
this = (struct stm32f4_gpio *)gpio;
|
this = (struct stm32f4_gpio *)gpio;
|
||||||
GPIO_WriteBit(this->port, this->pin->GPIO_Pin, (BitAction)byte);
|
HAL_GPIO_WritePin(this->port, this->pin->Pin, (GPIO_PinState)(byte & 0x01));
|
||||||
}
|
}
|
||||||
|
|
||||||
void stm32f4_gpio_toggle(const void *gpio)
|
void stm32f4_gpio_toggle(const void *gpio)
|
||||||
@@ -159,16 +130,13 @@ void stm32f4_gpio_toggle(const void *gpio)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
this = (struct stm32f4_gpio *)gpio;
|
this = (struct stm32f4_gpio *)gpio;
|
||||||
BitAction act = Bit_SET;
|
HAL_GPIO_TogglePin(this->port, this->pin->Pin);
|
||||||
if(GPIO_ReadOutputDataBit(this->port, this->pin->GPIO_Pin))
|
|
||||||
act = Bit_RESET;
|
|
||||||
|
|
||||||
GPIO_WriteBit(this->port, this->pin->GPIO_Pin, act);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int stm32f4_gpio_set_exti_callback(const void *gpio,
|
int stm32f4_gpio_set_exti_callback(const void *gpio,
|
||||||
const void *callback, const void *param)
|
const void *callback, const void *param)
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
struct stm32f4_gpio *this;
|
struct stm32f4_gpio *this;
|
||||||
uint8_t pin;
|
uint8_t pin;
|
||||||
if((gpio == NULL) || (callback == NULL))
|
if((gpio == NULL) || (callback == NULL))
|
||||||
@@ -179,10 +147,11 @@ int stm32f4_gpio_set_exti_callback(const void *gpio,
|
|||||||
|
|
||||||
gpio_obj.callback_list[pin].callback = (gpio_ext_it_cb_t)callback;
|
gpio_obj.callback_list[pin].callback = (gpio_ext_it_cb_t)callback;
|
||||||
gpio_obj.callback_list[pin].param = (void*)param;
|
gpio_obj.callback_list[pin].param = (void*)param;
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
//! \brief The ISR for the EXTI0_IRQn interrupt.
|
//! \brief The ISR for the EXTI0_IRQn interrupt.
|
||||||
void EXTI0_IRQHandler(void)
|
void EXTI0_IRQHandler(void)
|
||||||
{
|
{
|
||||||
@@ -258,3 +227,4 @@ void EXTI9_5_IRQHandler(void) {
|
|||||||
void EXTI15_10_IRQHandler(void) {
|
void EXTI15_10_IRQHandler(void) {
|
||||||
// TODO: detect & clear pending bit
|
// TODO: detect & clear pending bit
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -9,9 +9,14 @@
|
|||||||
|
|
||||||
#include "stm32f4xx.h"
|
#include "stm32f4xx.h"
|
||||||
|
|
||||||
|
#include "gpio.h"
|
||||||
|
#include "stm32f4_gpio.h"
|
||||||
|
|
||||||
#include "pwm.h"
|
#include "pwm.h"
|
||||||
#include "stm32f4_pwm.h"
|
#include "stm32f4_pwm.h"
|
||||||
|
|
||||||
|
#pragma pack(push)
|
||||||
|
#pragma pack(1)
|
||||||
struct stm32f4_pwm_object {
|
struct stm32f4_pwm_object {
|
||||||
uint8_t used_channels;
|
uint8_t used_channels;
|
||||||
uint32_t channel_1_max_period;
|
uint32_t channel_1_max_period;
|
||||||
@@ -19,61 +24,38 @@ struct stm32f4_pwm_object {
|
|||||||
uint32_t channel_3_max_period;
|
uint32_t channel_3_max_period;
|
||||||
uint32_t channel_4_max_period;
|
uint32_t channel_4_max_period;
|
||||||
};
|
};
|
||||||
|
#pragma pack(pop)
|
||||||
static struct stm32f4_pwm_object stm32f4_pwm_object = {
|
|
||||||
.used_channels = 0,
|
|
||||||
.channel_1_max_period = 0,
|
|
||||||
.channel_2_max_period = 0,
|
|
||||||
.channel_3_max_period = 0,
|
|
||||||
.channel_4_max_period = 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
int stm32f4_pwm_open(const void *pwm)
|
int stm32f4_pwm_open(const void *pwm)
|
||||||
{
|
{
|
||||||
if(NULL == pwm)
|
if(NULL == pwm)
|
||||||
return -1;
|
return -1;
|
||||||
struct stm32f4_pwm *this = (struct stm32f4_pwm *)pwm;
|
struct stm32f4_pwm *this = (struct stm32f4_pwm *)pwm;
|
||||||
uint32_t clk_ahb_timer = 0, clk_ahb_gpio = 0;
|
stm32f4_gpio_open(this->pwm_gpio);
|
||||||
uint8_t gpio_af_timer = 0;
|
if(this->timer_handle->Instance == TIM4) {
|
||||||
if(this->timer == TIM4) {
|
__HAL_RCC_TIM4_CLK_ENABLE();
|
||||||
clk_ahb_timer = RCC_APB1Periph_TIM4;
|
|
||||||
gpio_af_timer = GPIO_AF_TIM4;
|
|
||||||
}
|
}
|
||||||
RCC_APB1PeriphClockCmd(clk_ahb_timer, ENABLE);
|
HAL_TIM_PWM_Init(this->timer_handle);
|
||||||
if(this->port == GPIOD) {
|
HAL_TIM_PWM_ConfigChannel(this->timer_handle, this->output_compare_cfg, this->channel);
|
||||||
clk_ahb_gpio = RCC_AHB1Periph_GPIOD;
|
|
||||||
}
|
|
||||||
RCC_AHB1PeriphClockCmd(clk_ahb_gpio, ENABLE);
|
|
||||||
GPIO_Init(this->port, (GPIO_InitTypeDef *)this->port_cfg);
|
|
||||||
GPIO_PinAFConfig(this->port, this->pin_src, gpio_af_timer);
|
|
||||||
|
|
||||||
TIM_TimeBaseInit(this->timer, (TIM_TimeBaseInitTypeDef *)this->timer_cfg);
|
TIM_MasterConfigTypeDef sMasterConfig;
|
||||||
|
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
|
||||||
|
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
|
||||||
|
HAL_TIMEx_MasterConfigSynchronization(this->timer_handle, &sMasterConfig);
|
||||||
|
|
||||||
switch(this->channel) {
|
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
|
||||||
case channel_1:
|
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
|
||||||
TIM_OC1Init(this->timer, (TIM_OCInitTypeDef *)this->output_compare_cfg);
|
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
|
||||||
TIM_OC1PreloadConfig(this->timer, TIM_OCPreload_Enable);
|
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
|
||||||
stm32f4_pwm_object.channel_1_max_period = this->timer_cfg->TIM_Period + 1;
|
sBreakDeadTimeConfig.DeadTime = 0;
|
||||||
break;
|
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
|
||||||
case channel_2:
|
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
|
||||||
TIM_OC2Init(this->timer, (TIM_OCInitTypeDef *)this->output_compare_cfg);
|
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
|
||||||
TIM_OC2PreloadConfig(this->timer, TIM_OCPreload_Enable);
|
HAL_TIMEx_ConfigBreakDeadTime(this->timer_handle, &sBreakDeadTimeConfig);
|
||||||
stm32f4_pwm_object.channel_2_max_period = this->timer_cfg->TIM_Period + 1;
|
|
||||||
break;
|
|
||||||
case channel_3:
|
HAL_TIM_Base_Start(this->timer_handle);
|
||||||
TIM_OC3Init(this->timer, (TIM_OCInitTypeDef *)this->output_compare_cfg);
|
HAL_TIM_PWM_Start(this->timer_handle, this->channel);
|
||||||
TIM_OC3PreloadConfig(this->timer, TIM_OCPreload_Enable);
|
|
||||||
stm32f4_pwm_object.channel_3_max_period = this->timer_cfg->TIM_Period + 1;
|
|
||||||
break;
|
|
||||||
case channel_4:
|
|
||||||
TIM_OC4Init(this->timer, (TIM_OCInitTypeDef *)this->output_compare_cfg);
|
|
||||||
TIM_OC4PreloadConfig(this->timer, TIM_OCPreload_Enable);
|
|
||||||
stm32f4_pwm_object.channel_4_max_period = this->timer_cfg->TIM_Period + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
TIM_ARRPreloadConfig(this->timer, ENABLE);
|
|
||||||
TIM_Cmd(this->timer, ENABLE);
|
|
||||||
stm32f4_pwm_object.used_channels++;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,12 +63,11 @@ int stm32f4_pwm_close(const void *pwm)
|
|||||||
{
|
{
|
||||||
if(NULL == pwm)
|
if(NULL == pwm)
|
||||||
return -1;
|
return -1;
|
||||||
struct stm32f4_pwm *this = (struct stm32f4_pwm *)pwm;
|
|
||||||
stm32f4_pwm_set_duty_cycle(pwm, 0);
|
stm32f4_pwm_set_duty_cycle(pwm, 0);
|
||||||
stm32f4_pwm_object.used_channels--;
|
struct stm32f4_pwm *this = (struct stm32f4_pwm *)pwm;
|
||||||
if(stm32f4_pwm_object.used_channels == 0) {
|
HAL_TIM_Base_Stop(this->timer_handle);
|
||||||
TIM_Cmd(this->timer, DISABLE);
|
HAL_TIM_PWM_Stop(this->timer_handle, this->channel);
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,20 +75,9 @@ int stm32f4_pwm_set_duty_cycle(const void *pwm, unsigned int duty_cycle_percent)
|
|||||||
{
|
{
|
||||||
if(NULL == pwm)
|
if(NULL == pwm)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
struct stm32f4_pwm *this = (struct stm32f4_pwm *)pwm;
|
struct stm32f4_pwm *this = (struct stm32f4_pwm *)pwm;
|
||||||
switch(this->channel) {
|
__HAL_TIM_SET_COMPARE(this->timer_handle, this->channel, this->timer_handle->Init.Period * duty_cycle_percent / 100);
|
||||||
case channel_1:
|
|
||||||
TIM_SetCompare1(this->timer, stm32f4_pwm_object.channel_1_max_period * duty_cycle_percent / 100);
|
|
||||||
break;
|
|
||||||
case channel_2:
|
|
||||||
TIM_SetCompare2(this->timer, stm32f4_pwm_object.channel_2_max_period * duty_cycle_percent / 100);
|
|
||||||
break;
|
|
||||||
case channel_3:
|
|
||||||
TIM_SetCompare3(this->timer, stm32f4_pwm_object.channel_3_max_period * duty_cycle_percent / 100);
|
|
||||||
break;
|
|
||||||
case channel_4:
|
|
||||||
TIM_SetCompare4(this->timer, stm32f4_pwm_object.channel_4_max_period * duty_cycle_percent / 100);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,78 +11,144 @@
|
|||||||
#include "stm32f4xx.h"
|
#include "stm32f4xx.h"
|
||||||
#include "stm32f4xx_isr.h"
|
#include "stm32f4xx_isr.h"
|
||||||
#include "stm32f4_uart.h"
|
#include "stm32f4_uart.h"
|
||||||
|
#include "gpio.h"
|
||||||
|
#include "stm32f4_gpio.h"
|
||||||
|
|
||||||
struct stm32f4_uart_obj {
|
struct stm32f4_uart_obj {
|
||||||
const void *callback; //!< Interrupt callback.
|
UART_HandleTypeDef *uart1_handle;
|
||||||
const void *parameter; //!< argument for the callback.
|
UART_HandleTypeDef *uart2_handle;
|
||||||
|
UART_HandleTypeDef *uart3_handle;
|
||||||
|
UART_HandleTypeDef *uart6_handle;
|
||||||
|
const void *uart1_callback; //!< Interrupt callback.
|
||||||
|
const void *uart1_parameter; //!< argument for the callback.
|
||||||
|
const void *uart2_callback; //!< Interrupt callback.
|
||||||
|
const void *uart2_parameter; //!< argument for the callback.
|
||||||
|
const void *uart3_callback; //!< Interrupt callback.
|
||||||
|
const void *uart3_parameter; //!< argument for the callback.
|
||||||
|
const void *uart6_callback; //!< Interrupt callback.
|
||||||
|
const void *uart6_parameter; //!< argument for the callback.
|
||||||
};
|
};
|
||||||
|
|
||||||
static volatile struct stm32f4_uart_obj uart1_obj;
|
static volatile struct stm32f4_uart_obj uart_obj = {
|
||||||
|
.uart1_handle = NULL,
|
||||||
|
.uart1_callback = NULL,
|
||||||
|
.uart1_parameter = NULL,
|
||||||
|
.uart2_handle = NULL,
|
||||||
|
.uart2_callback = NULL,
|
||||||
|
.uart2_parameter = NULL,
|
||||||
|
.uart3_handle = NULL,
|
||||||
|
.uart3_callback = NULL,
|
||||||
|
.uart3_parameter = NULL,
|
||||||
|
.uart6_handle = NULL,
|
||||||
|
.uart6_callback = NULL,
|
||||||
|
.uart6_parameter = NULL,
|
||||||
|
};
|
||||||
|
|
||||||
int stm32f4_uart_open(const void *this)
|
int stm32f4_uart_open(const void *this)
|
||||||
{
|
{
|
||||||
|
if(NULL == this)
|
||||||
|
return -1;
|
||||||
struct stm32f4_uart *uart = (struct stm32f4_uart *)this;
|
struct stm32f4_uart *uart = (struct stm32f4_uart *)this;
|
||||||
uint8_t gpio_af = 0;
|
IRQn_Type irq_type = USART1_IRQn;
|
||||||
uint32_t rcc_apb_uart = 0, rcc_apb_gpio = 0;
|
|
||||||
|
|
||||||
if(uart->usart_port == USART1) {
|
/* init gpio */
|
||||||
gpio_af = GPIO_AF_USART1;
|
stm32f4_gpio_open(uart->uart_gpio);
|
||||||
rcc_apb_uart = RCC_APB2Periph_USART1;
|
|
||||||
|
/* uart clock enable */
|
||||||
|
if(uart->uart_handle->Instance == USART1) {
|
||||||
|
__HAL_RCC_USART1_CLK_ENABLE();
|
||||||
|
irq_type = USART1_IRQn;
|
||||||
|
uart_obj.uart1_handle = uart->uart_handle;
|
||||||
}
|
}
|
||||||
if(uart->gpio_port == GPIOA) {
|
else if(uart->uart_handle->Instance == USART2) {
|
||||||
rcc_apb_gpio = RCC_AHB1Periph_GPIOA;
|
__HAL_RCC_USART2_CLK_ENABLE();
|
||||||
|
irq_type = USART2_IRQn;
|
||||||
|
uart_obj.uart2_handle = uart->uart_handle;
|
||||||
}
|
}
|
||||||
else if(uart->gpio_port == GPIOB) {
|
else if(uart->uart_handle->Instance == USART3) {
|
||||||
rcc_apb_gpio = RCC_AHB1Periph_GPIOB;
|
__HAL_RCC_USART3_CLK_ENABLE();
|
||||||
|
irq_type = USART3_IRQn;
|
||||||
|
uart_obj.uart3_handle = uart->uart_handle;
|
||||||
|
}
|
||||||
|
else if(uart->uart_handle->Instance == USART6) {
|
||||||
|
__HAL_RCC_USART6_CLK_ENABLE();
|
||||||
|
irq_type = USART6_IRQn;
|
||||||
|
uart_obj.uart3_handle = uart->uart_handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
RCC_APB2PeriphClockCmd(rcc_apb_uart, ENABLE);
|
HAL_UART_Init(uart->uart_handle);
|
||||||
RCC_AHB1PeriphClockCmd(rcc_apb_gpio, ENABLE);
|
HAL_NVIC_SetPriority(irq_type, 5, 1);
|
||||||
|
HAL_NVIC_EnableIRQ(USART1_IRQn);
|
||||||
|
__HAL_UART_ENABLE_IT(uart->uart_handle, UART_IT_RXNE);
|
||||||
|
__HAL_UART_DISABLE_IT(uart->uart_handle, UART_IT_TXE);
|
||||||
|
|
||||||
GPIO_Init(uart->gpio_port, (GPIO_InitTypeDef *)uart->gpio_init);
|
|
||||||
|
|
||||||
GPIO_PinAFConfig(uart->gpio_port, uart->pin_src_rx, gpio_af);
|
|
||||||
GPIO_PinAFConfig(uart->gpio_port, uart->pin_src_tx, gpio_af);
|
|
||||||
|
|
||||||
USART_Init(uart->usart_port, (USART_InitTypeDef *)uart->usart_init);
|
|
||||||
USART_ITConfig(uart->usart_port, uart->usart_it_select, ENABLE);
|
|
||||||
NVIC_Init((NVIC_InitTypeDef *)uart->nvic_init);
|
|
||||||
USART_Cmd(uart->usart_port, ENABLE);
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int stm32f4_uart_close(const void *this)
|
int stm32f4_uart_close(const void *this)
|
||||||
{
|
{
|
||||||
|
if(NULL == this)
|
||||||
|
return -1;
|
||||||
struct stm32f4_uart *uart = (struct stm32f4_uart *)this;
|
struct stm32f4_uart *uart = (struct stm32f4_uart *)this;
|
||||||
USART_Cmd(uart->usart_port, DISABLE);
|
IRQn_Type irq_type = USART1_IRQn;
|
||||||
|
|
||||||
|
HAL_UART_DeInit((UART_HandleTypeDef *)uart->uart_handle);
|
||||||
|
if(uart->uart_handle->Instance == USART1) {
|
||||||
|
__HAL_RCC_USART1_CLK_DISABLE();
|
||||||
|
irq_type = USART1_IRQn;
|
||||||
|
}
|
||||||
|
else if(uart->uart_handle->Instance == USART2) {
|
||||||
|
__HAL_RCC_USART2_CLK_DISABLE();
|
||||||
|
irq_type = USART2_IRQn;
|
||||||
|
}
|
||||||
|
else if(uart->uart_handle->Instance == USART3) {
|
||||||
|
__HAL_RCC_USART3_CLK_DISABLE();
|
||||||
|
irq_type = USART3_IRQn;
|
||||||
|
}
|
||||||
|
else if(uart->uart_handle->Instance == USART6) {
|
||||||
|
__HAL_RCC_USART6_CLK_DISABLE();
|
||||||
|
irq_type = USART6_IRQn;
|
||||||
|
}
|
||||||
|
HAL_NVIC_DisableIRQ(irq_type);
|
||||||
|
|
||||||
|
stm32f4_gpio_close(uart->uart_gpio);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int stm32f4_uart_read(const void *this, char *buffer, int len)
|
int stm32f4_uart_read(const void *this, char *buffer, int len)
|
||||||
{
|
{
|
||||||
struct stm32f4_uart *uart = (struct stm32f4_uart *)this;
|
struct stm32f4_uart *uart = (struct stm32f4_uart *)this;
|
||||||
*buffer = uart->usart_port->DR;
|
*buffer = uart->uart_handle->Instance->DR;
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int stm32f4_uart_write(const void *this, const char *buffer, int len)
|
int stm32f4_uart_write(const void *this, const char *buffer, int len)
|
||||||
{
|
{
|
||||||
|
if(NULL == this)
|
||||||
|
return -1;
|
||||||
struct stm32f4_uart *uart = (struct stm32f4_uart *)this;
|
struct stm32f4_uart *uart = (struct stm32f4_uart *)this;
|
||||||
int i;
|
HAL_UART_Transmit(uart->uart_handle, (uint8_t *)buffer, len, 1000);
|
||||||
for(i = 0; i < len; i++) {
|
return len;
|
||||||
// wait until data register is empty
|
|
||||||
while(!(uart->usart_port->SR & 0x00000040));
|
|
||||||
USART_SendData(uart->usart_port, buffer[i]);
|
|
||||||
}
|
|
||||||
return (i);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int stm32f4_uart_set_cb(const void *this, const void *callback, const void *param)
|
int stm32f4_uart_set_cb(const void *this, const void *callback, const void *param)
|
||||||
{
|
{
|
||||||
struct stm32f4_uart *uart = (struct stm32f4_uart *)this;
|
struct stm32f4_uart *uart = (struct stm32f4_uart *)this;
|
||||||
if(uart->usart_port == USART1) {
|
if(uart->uart_handle->Instance == USART1) {
|
||||||
uart1_obj.callback = callback;
|
uart_obj.uart1_callback = callback;
|
||||||
uart1_obj.parameter = param;
|
uart_obj.uart1_parameter = param;
|
||||||
|
}
|
||||||
|
else if(uart->uart_handle->Instance == USART2) {
|
||||||
|
uart_obj.uart2_callback = callback;
|
||||||
|
uart_obj.uart2_parameter = param;
|
||||||
|
}
|
||||||
|
else if(uart->uart_handle->Instance == USART3) {
|
||||||
|
uart_obj.uart3_callback = callback;
|
||||||
|
uart_obj.uart3_parameter = param;
|
||||||
|
}
|
||||||
|
else if(uart->uart_handle->Instance == USART6) {
|
||||||
|
uart_obj.uart6_callback = callback;
|
||||||
|
uart_obj.uart6_parameter = param;
|
||||||
}
|
}
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
@@ -91,11 +157,13 @@ int stm32f4_uart_set_cb(const void *this, const void *callback, const void *para
|
|||||||
void USART1_IRQHandler(void)
|
void USART1_IRQHandler(void)
|
||||||
{
|
{
|
||||||
enter_isr();
|
enter_isr();
|
||||||
// check if the USART1 receive interrupt flag was set
|
uint32_t tmp1 = 0U, tmp2 = 0U;
|
||||||
if(USART_GetITStatus(USART1, USART_IT_RXNE)) {
|
tmp1 = __HAL_UART_GET_FLAG(uart_obj.uart1_handle, UART_FLAG_RXNE);
|
||||||
if(uart1_obj.callback) {
|
tmp2 = __HAL_UART_GET_IT_SOURCE(uart_obj.uart1_handle, UART_IT_RXNE);
|
||||||
void (*cb)(const void *) = uart1_obj.callback;
|
if((tmp1 != RESET) && (tmp2 != RESET)) {
|
||||||
cb(uart1_obj.parameter);
|
if(uart_obj.uart1_callback) {
|
||||||
|
void (*cb)(const void *) = uart_obj.uart1_callback;
|
||||||
|
cb(uart_obj.uart1_parameter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
exit_isr();
|
exit_isr();
|
||||||
|
|||||||
Executable → Regular
+1
-1
@@ -1 +1 @@
|
|||||||
include source/firmware/arch/stm32f4xx/lib/stdperiph/stdperiph.mk
|
include source/firmware/arch/stm32f4xx/lib/system/system.mk
|
||||||
|
|||||||
-3711
File diff suppressed because it is too large
Load Diff
-3269
File diff suppressed because it is too large
Load Diff
-3711
File diff suppressed because it is too large
Load Diff
-3269
File diff suppressed because it is too large
Load Diff
-3969
File diff suppressed because it is too large
Load Diff
-6527
File diff suppressed because it is too large
Load Diff
-14
@@ -1,14 +0,0 @@
|
|||||||
|
|
||||||
SET TMP=C:\Temp
|
|
||||||
SET TEMP=C:\Temp
|
|
||||||
|
|
||||||
SET UVEXE=C:\Keil\UV4\UV4.EXE
|
|
||||||
|
|
||||||
%UVEXE% -rb arm_cortexM0x_math.uvproj -t"DSP_Lib CM0 LE" -o"DSP_Lib CM0 LE.txt"
|
|
||||||
%UVEXE% -rb arm_cortexM0x_math.uvproj -t"DSP_Lib CM0 BE" -o"DSP_Lib CM0 BE.txt"
|
|
||||||
%UVEXE% -rb arm_cortexM3x_math.uvproj -t"DSP_Lib CM3 LE" -o"DSP_Lib CM3 LE.txt"
|
|
||||||
%UVEXE% -rb arm_cortexM3x_math.uvproj -t"DSP_Lib CM3 BE" -o"DSP_Lib CM3 BE.txt"
|
|
||||||
%UVEXE% -rb arm_cortexM4x_math.uvproj -t"DSP_Lib CM4 LE" -o"DSP_Lib CM4 LE.txt"
|
|
||||||
%UVEXE% -rb arm_cortexM4x_math.uvproj -t"DSP_Lib CM4 BE" -o"DSP_Lib CM4 BE.txt"
|
|
||||||
%UVEXE% -rb arm_cortexM4x_math.uvproj -t"DSP_Lib CM4 LE FPU" -o"DSP_Lib CM4 LE FPU.txt"
|
|
||||||
%UVEXE% -rb arm_cortexM4x_math.uvproj -t"DSP_Lib CM4 BE FPU" -o"DSP_Lib CM4 BE FPU.txt"
|
|
||||||
-122
@@ -1,122 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_abs_f32.c
|
|
||||||
*
|
|
||||||
* Description: Vector absolute value.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup BasicAbs Vector Absolute Value
|
|
||||||
*
|
|
||||||
* Computes the absolute value of a vector on an element-by-element basis.
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* pDst[n] = abs(pSrcA[n]), 0 <= n < blockSize.
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* The operation can be done in-place by setting the input and output pointers to the same buffer.
|
|
||||||
* There are separate functions for floating-point, Q7, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicAbs
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Floating-point vector absolute value.
|
|
||||||
* @param[in] *pSrc points to the input buffer
|
|
||||||
* @param[out] *pDst points to the output buffer
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_abs_f32(
|
|
||||||
float32_t * pSrc,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = |A| */
|
|
||||||
/* Calculate absolute and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = fabsf(*pSrc++);
|
|
||||||
*pDst++ = fabsf(*pSrc++);
|
|
||||||
*pDst++ = fabsf(*pSrc++);
|
|
||||||
*pDst++ = fabsf(*pSrc++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = |A| */
|
|
||||||
/* Calculate absolute and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = fabsf(*pSrc++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicAbs group
|
|
||||||
*/
|
|
||||||
-170
@@ -1,170 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_abs_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 vector absolute value.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicAbs
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q15 vector absolute value.
|
|
||||||
* @param[in] *pSrc points to the input buffer
|
|
||||||
* @param[out] *pDst points to the output buffer
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* The Q15 value -1 (0x8000) will be saturated to the maximum allowable positive value 0x7FFF.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_abs_q15(
|
|
||||||
q15_t * pSrc,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
q15_t in1; /* Input value1 */
|
|
||||||
q15_t in2; /* Input value2 */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = |A| */
|
|
||||||
/* Read two inputs */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
|
|
||||||
|
|
||||||
/* Store the Absolute result in the destination buffer by packing the two values, in a single cycle */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ =
|
|
||||||
__PKHBT(((in1 > 0) ? in1 : __SSAT(-in1, 16)),
|
|
||||||
((in2 > 0) ? in2 : __SSAT(-in2, 16)), 16);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ =
|
|
||||||
__PKHBT(((in2 > 0) ? in2 : __SSAT(-in2, 16)),
|
|
||||||
((in1 > 0) ? in1 : __SSAT(-in1, 16)), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ =
|
|
||||||
__PKHBT(((in1 > 0) ? in1 : __SSAT(-in1, 16)),
|
|
||||||
((in2 > 0) ? in2 : __SSAT(-in2, 16)), 16);
|
|
||||||
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ =
|
|
||||||
__PKHBT(((in2 > 0) ? in2 : __SSAT(-in2, 16)),
|
|
||||||
((in1 > 0) ? in1 : __SSAT(-in1, 16)), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = |A| */
|
|
||||||
/* Read the input */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
|
|
||||||
/* Calculate absolute value of input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (in1 > 0) ? in1 : __SSAT(-in1, 16);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
q15_t in; /* Temporary input variable */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = |A| */
|
|
||||||
/* Read the input */
|
|
||||||
in = *pSrc++;
|
|
||||||
|
|
||||||
/* Calculate absolute value of input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (in > 0) ? in : __SSAT(-in, 16);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicAbs group
|
|
||||||
*/
|
|
||||||
-120
@@ -1,120 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_abs_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 vector absolute value.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicAbs
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q31 vector absolute value.
|
|
||||||
* @param[in] *pSrc points to the input buffer
|
|
||||||
* @param[out] *pDst points to the output buffer
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* The Q31 value -1 (0x80000000) will be saturated to the maximum allowable positive value 0x7FFFFFFF.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_abs_q31(
|
|
||||||
q31_t * pSrc,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
q31_t in; /* Input value */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = |A| */
|
|
||||||
/* Calculate absolute of input (if -1 then saturated to 0x7fffffff) and then store the results in the destination buffer. */
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in > 0) ? in : ((in == 0x80000000) ? 0x7fffffff : -in);
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in > 0) ? in : ((in == 0x80000000) ? 0x7fffffff : -in);
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in > 0) ? in : ((in == 0x80000000) ? 0x7fffffff : -in);
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in > 0) ? in : ((in == 0x80000000) ? 0x7fffffff : -in);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = |A| */
|
|
||||||
/* Calculate absolute value of the input (if -1 then saturated to 0x7fffffff) and then store the results in the destination buffer. */
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in > 0) ? in : ((in == 0x80000000) ? 0x7fffffff : -in);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicAbs group
|
|
||||||
*/
|
|
||||||
-143
@@ -1,143 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_abs_q7.c
|
|
||||||
*
|
|
||||||
* Description: Q7 vector absolute value.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicAbs
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q7 vector absolute value.
|
|
||||||
* @param[in] *pSrc points to the input buffer
|
|
||||||
* @param[out] *pDst points to the output buffer
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* The Q7 value -1 (0x80) will be saturated to the maximum allowable positive value 0x7F.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_abs_q7(
|
|
||||||
q7_t * pSrc,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
q7_t in1; /* Input value1 */
|
|
||||||
q7_t in2; /* Input value2 */
|
|
||||||
q7_t in3; /* Input value3 */
|
|
||||||
q7_t in4; /* Input value4 */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = |A| */
|
|
||||||
/* Read 4 inputs */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
in3 = *pSrc++;
|
|
||||||
in4 = *pSrc++;
|
|
||||||
|
|
||||||
/* Store the Absolute result in the destination buffer by packing the 4 values in single cycle */
|
|
||||||
*__SIMD32(pDst)++ =
|
|
||||||
__PACKq7(((in1 > 0) ? in1 : __SSAT(-in1, 8)),
|
|
||||||
((in2 > 0) ? in2 : __SSAT(-in2, 8)),
|
|
||||||
((in3 > 0) ? in3 : __SSAT(-in3, 8)),
|
|
||||||
((in4 > 0) ? in4 : __SSAT(-in4, 8)));
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = |A| */
|
|
||||||
/* Read the input */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
|
|
||||||
/* Store the Absolute result in the destination buffer */
|
|
||||||
*pDst++ = (in1 > 0) ? in1 : __SSAT(-in1, 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
q7_t in; /* Temporary input varible */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = |A| */
|
|
||||||
/* Read the input */
|
|
||||||
in = *pSrc++;
|
|
||||||
|
|
||||||
/* Store the Absolute result in the destination buffer */
|
|
||||||
*pDst++ = (in > 0) ? in : __SSAT(-in, 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicAbs group
|
|
||||||
*/
|
|
||||||
-121
@@ -1,121 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_add_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point vector addition.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup BasicAdd Vector Addition
|
|
||||||
*
|
|
||||||
* Element-by-element addition of two vectors.
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* pDst[n] = pSrcA[n] + pSrcB[n], 0 <= n < blockSize.
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* There are separate functions for floating-point, Q7, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicAdd
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Floating-point vector addition.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_add_f32(
|
|
||||||
float32_t * pSrcA,
|
|
||||||
float32_t * pSrcB,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrcA++) + (*pSrcB++);
|
|
||||||
*pDst++ = (*pSrcA++) + (*pSrcB++);
|
|
||||||
*pDst++ = (*pSrcA++) + (*pSrcB++);
|
|
||||||
*pDst++ = (*pSrcA++) + (*pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrcA++) + (*pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicAdd group
|
|
||||||
*/
|
|
||||||
-127
@@ -1,127 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_add_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 vector addition
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicAdd
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q15 vector addition.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q15 range [0x8000 0x7FFF] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_add_q15(
|
|
||||||
q15_t * pSrcA,
|
|
||||||
q15_t * pSrcB,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*__SIMD32(pDst)++ = __QADD16(*__SIMD32(pSrcA)++, *__SIMD32(pSrcB)++);
|
|
||||||
*__SIMD32(pDst)++ = __QADD16(*__SIMD32(pSrcA)++, *__SIMD32(pSrcB)++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) __QADD16(*pSrcA++, *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) __SSAT(((q31_t) * pSrcA++ + *pSrcB++), 16);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicAdd group
|
|
||||||
*/
|
|
||||||
-129
@@ -1,129 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_add_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 vector addition.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicAdd
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q31 vector addition.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q31 range[0x80000000 0x7FFFFFFF] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_add_q31(
|
|
||||||
q31_t * pSrcA,
|
|
||||||
q31_t * pSrcB,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = __QADD(*pSrcA++, *pSrcB++);
|
|
||||||
*pDst++ = __QADD(*pSrcA++, *pSrcB++);
|
|
||||||
*pDst++ = __QADD(*pSrcA++, *pSrcB++);
|
|
||||||
*pDst++ = __QADD(*pSrcA++, *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = __QADD(*pSrcA++, *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) clip_q63_to_q31((q63_t) * pSrcA++ + *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicAdd group
|
|
||||||
*/
|
|
||||||
-126
@@ -1,126 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_add_q7.c
|
|
||||||
*
|
|
||||||
* Description: Q7 vector addition.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicAdd
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q7 vector addition.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q7 range [0x80 0x7F] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_add_q7(
|
|
||||||
q7_t * pSrcA,
|
|
||||||
q7_t * pSrcB,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*__SIMD32(pDst)++ = __QADD8(*__SIMD32(pSrcA)++, *__SIMD32(pSrcB)++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (q7_t) __SSAT(*pSrcA++ + *pSrcB++, 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + B */
|
|
||||||
/* Add and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (q7_t) __SSAT((q15_t) * pSrcA++ + *pSrcB++, 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicAdd group
|
|
||||||
*/
|
|
||||||
-122
@@ -1,122 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_dot_prod_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point dot product.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup dot_prod Vector Dot Product
|
|
||||||
*
|
|
||||||
* Computes the dot product of two vectors.
|
|
||||||
* The vectors are multiplied element-by-element and then summed.
|
|
||||||
* There are separate functions for floating-point, Q7, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup dot_prod
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Dot product of floating-point vectors.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @param[out] *result output result returned here
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void arm_dot_prod_f32(
|
|
||||||
float32_t * pSrcA,
|
|
||||||
float32_t * pSrcB,
|
|
||||||
uint32_t blockSize,
|
|
||||||
float32_t * result)
|
|
||||||
{
|
|
||||||
float32_t sum = 0.0f; /* Temporary result storage */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Calculate dot product and then store the result in a temporary buffer */
|
|
||||||
sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Calculate dot product and then store the result in a temporary buffer. */
|
|
||||||
sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
/* Store the result back in the destination buffer */
|
|
||||||
*result = sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of dot_prod group
|
|
||||||
*/
|
|
||||||
-132
@@ -1,132 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_dot_prod_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 dot product.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup dot_prod
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Dot product of Q15 vectors.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @param[out] *result output result returned here
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The intermediate multiplications are in 1.15 x 1.15 = 2.30 format and these
|
|
||||||
* results are added to a 64-bit accumulator in 34.30 format.
|
|
||||||
* Nonsaturating additions are used and given that there are 33 guard bits in the accumulator
|
|
||||||
* there is no risk of overflow.
|
|
||||||
* The return result is in 34.30 format.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_dot_prod_q15(
|
|
||||||
q15_t * pSrcA,
|
|
||||||
q15_t * pSrcB,
|
|
||||||
uint32_t blockSize,
|
|
||||||
q63_t * result)
|
|
||||||
{
|
|
||||||
q63_t sum = 0; /* Temporary result storage */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Calculate dot product and then store the result in a temporary buffer. */
|
|
||||||
sum = __SMLALD(*__SIMD32(pSrcA)++, *__SIMD32(pSrcB)++, sum);
|
|
||||||
sum = __SMLALD(*__SIMD32(pSrcA)++, *__SIMD32(pSrcB)++, sum);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Calculate dot product and then store the results in a temporary buffer. */
|
|
||||||
sum = __SMLALD(*pSrcA++, *pSrcB++, sum);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Calculate dot product and then store the results in a temporary buffer. */
|
|
||||||
sum += (q63_t) ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
/* Store the result in the destination buffer in 34.30 format */
|
|
||||||
*result = sum;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of dot_prod group
|
|
||||||
*/
|
|
||||||
-124
@@ -1,124 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_dot_prod_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 dot product.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup dot_prod
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Dot product of Q31 vectors.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @param[out] *result output result returned here
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The intermediate multiplications are in 1.31 x 1.31 = 2.62 format and these
|
|
||||||
* are truncated to 2.48 format by discarding the lower 14 bits.
|
|
||||||
* The 2.48 result is then added without saturation to a 64-bit accumulator in 16.48 format.
|
|
||||||
* There are 15 guard bits in the accumulator and there is no risk of overflow as long as
|
|
||||||
* the length of the vectors is less than 2^16 elements.
|
|
||||||
* The return result is in 16.48 format.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_dot_prod_q31(
|
|
||||||
q31_t * pSrcA,
|
|
||||||
q31_t * pSrcB,
|
|
||||||
uint32_t blockSize,
|
|
||||||
q63_t * result)
|
|
||||||
{
|
|
||||||
q63_t sum = 0; /* Temporary result storage */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Calculate dot product and then store the result in a temporary buffer. */
|
|
||||||
sum += ((q63_t) * pSrcA++ * *pSrcB++) >> 14u;
|
|
||||||
sum += ((q63_t) * pSrcA++ * *pSrcB++) >> 14u;
|
|
||||||
sum += ((q63_t) * pSrcA++ * *pSrcB++) >> 14u;
|
|
||||||
sum += ((q63_t) * pSrcA++ * *pSrcB++) >> 14u;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Calculate dot product and then store the result in a temporary buffer. */
|
|
||||||
sum += ((q63_t) * pSrcA++ * *pSrcB++) >> 14u;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Store the result in the destination buffer in 16.48 format */
|
|
||||||
*result = sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of dot_prod group
|
|
||||||
*/
|
|
||||||
-163
@@ -1,163 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_dot_prod_q7.c
|
|
||||||
*
|
|
||||||
* Description: Q7 dot product.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup dot_prod
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Dot product of Q7 vectors.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @param[out] *result output result returned here
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The intermediate multiplications are in 1.7 x 1.7 = 2.14 format and these
|
|
||||||
* results are added to an accumulator in 18.14 format.
|
|
||||||
* Nonsaturating additions are used and there is no danger of wrap around as long as
|
|
||||||
* the vectors are less than 2^18 elements long.
|
|
||||||
* The return result is in 18.14 format.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_dot_prod_q7(
|
|
||||||
q7_t * pSrcA,
|
|
||||||
q7_t * pSrcB,
|
|
||||||
uint32_t blockSize,
|
|
||||||
q31_t * result)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
q31_t sum = 0; /* Temporary variables to store output */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
q31_t input1, input2; /* Temporary variables to store input */
|
|
||||||
q15_t in1, in2; /* Temporary variables to store input */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* Reading two inputs of SrcA buffer and packing */
|
|
||||||
in1 = (q15_t) * pSrcA++;
|
|
||||||
in2 = (q15_t) * pSrcA++;
|
|
||||||
input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16);
|
|
||||||
|
|
||||||
/* Reading two inputs of SrcB buffer and packing */
|
|
||||||
in1 = (q15_t) * pSrcB++;
|
|
||||||
in2 = (q15_t) * pSrcB++;
|
|
||||||
input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16);
|
|
||||||
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Perform Dot product of 2 packed inputs using SMLALD and store the result in a temporary variable. */
|
|
||||||
sum = __SMLAD(input1, input2, sum);
|
|
||||||
|
|
||||||
/* Reading two inputs of SrcA buffer and packing */
|
|
||||||
in1 = (q15_t) * pSrcA++;
|
|
||||||
in2 = (q15_t) * pSrcA++;
|
|
||||||
input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16);
|
|
||||||
|
|
||||||
/* Reading two inputs of SrcB buffer and packing */
|
|
||||||
in1 = (q15_t) * pSrcB++;
|
|
||||||
in2 = (q15_t) * pSrcB++;
|
|
||||||
input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16);
|
|
||||||
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Perform Dot product of 2 packed inputs using SMLALD and store the result in a temporary variable. */
|
|
||||||
sum = __SMLAD(input1, input2, sum);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Dot product and then store the results in a temporary buffer. */
|
|
||||||
sum = __SMLAD(*pSrcA++, *pSrcB++, sum);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
|
||||||
/* Dot product and then store the results in a temporary buffer. */
|
|
||||||
sum += (q31_t) ((q15_t) * pSrcA++ * *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
/* Store the result in the destination buffer in 18.14 format */
|
|
||||||
*result = sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of dot_prod group
|
|
||||||
*/
|
|
||||||
-126
@@ -1,126 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_mult_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point vector multiplication.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.5 2010/04/26
|
|
||||||
* incorporated review comments and updated with latest CMSIS layer
|
|
||||||
*
|
|
||||||
* Version 0.0.3 2010/03/10
|
|
||||||
* Initial version
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup BasicMult Vector Multiplication
|
|
||||||
*
|
|
||||||
* Element-by-element multiplication of two vectors.
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* pDst[n] = pSrcA[n] * pSrcB[n], 0 <= n < blockSize.
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* There are separate functions for floating-point, Q7, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicMult
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Floating-point vector multiplication.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_mult_f32(
|
|
||||||
float32_t * pSrcA,
|
|
||||||
float32_t * pSrcB,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counters */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * B */
|
|
||||||
/* Multiply the inputs and store the results in output buffer */
|
|
||||||
*pDst++ = (*pSrcA++) * (*pSrcB++);
|
|
||||||
*pDst++ = (*pSrcA++) * (*pSrcB++);
|
|
||||||
*pDst++ = (*pSrcA++) * (*pSrcB++);
|
|
||||||
*pDst++ = (*pSrcA++) * (*pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * B */
|
|
||||||
/* Multiply the inputs and store the results in output buffer */
|
|
||||||
*pDst++ = (*pSrcA++) * (*pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicMult group
|
|
||||||
*/
|
|
||||||
-119
@@ -1,119 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_mult_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 vector multiplication.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.5 2010/04/26
|
|
||||||
* incorporated review comments and updated with latest CMSIS layer
|
|
||||||
*
|
|
||||||
* Version 0.0.3 2010/03/10
|
|
||||||
* Initial version
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicMult
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q15 vector multiplication
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q15 range [0x8000 0x7FFF] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_mult_q15(
|
|
||||||
q15_t * pSrcA,
|
|
||||||
q15_t * pSrcB,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counters */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * B */
|
|
||||||
/* Multiply the inputs and store the result in the destination buffer */
|
|
||||||
*pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16);
|
|
||||||
*pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16);
|
|
||||||
*pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16);
|
|
||||||
*pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * B */
|
|
||||||
/* Multiply the inputs and store the result in the destination buffer */
|
|
||||||
*pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicMult group
|
|
||||||
*/
|
|
||||||
-121
@@ -1,121 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_mult_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 vector multiplication.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.5 2010/04/26
|
|
||||||
* incorporated review comments and updated with latest CMSIS layer
|
|
||||||
*
|
|
||||||
* Version 0.0.3 2010/03/10
|
|
||||||
* Initial version
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicMult
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q31 vector multiplication.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q31 range[0x80000000 0x7FFFFFFF] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_mult_q31(
|
|
||||||
q31_t * pSrcA,
|
|
||||||
q31_t * pSrcB,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counters */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * B */
|
|
||||||
/* Multiply the inputs and then store the results in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) (*pSrcA++) * (*pSrcB++)) >> 31);
|
|
||||||
*pDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) (*pSrcA++) * (*pSrcB++)) >> 31);
|
|
||||||
*pDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) (*pSrcA++) * (*pSrcB++)) >> 31);
|
|
||||||
*pDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) (*pSrcA++) * (*pSrcB++)) >> 31);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * B */
|
|
||||||
/* Multiply the inputs and then store the results in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) (*pSrcA++) * (*pSrcB++)) >> 31);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicMult group
|
|
||||||
*/
|
|
||||||
-125
@@ -1,125 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_mult_q7.c
|
|
||||||
*
|
|
||||||
* Description: Q7 vector multiplication.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
*
|
|
||||||
* Version 0.0.5 2010/04/26
|
|
||||||
* incorporated review comments and updated with latest CMSIS layer
|
|
||||||
*
|
|
||||||
* Version 0.0.3 2010/03/10 DP
|
|
||||||
* Initial version
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicMult
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q7 vector multiplication
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q7 range [0x80 0x7F] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_mult_q7(
|
|
||||||
q7_t * pSrcA,
|
|
||||||
q7_t * pSrcB,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counters */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
q7_t out1, out2, out3, out4; /* Temporary variables to store the product */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * B */
|
|
||||||
/* Multiply the inputs and store the results in temporary variables */
|
|
||||||
out1 = (q7_t) (((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7);
|
|
||||||
out2 = (q7_t) (((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7);
|
|
||||||
out3 = (q7_t) (((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7);
|
|
||||||
out4 = (q7_t) (((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7);
|
|
||||||
|
|
||||||
/* Store the results of 4 inputs in the destination buffer in single cycle by packing */
|
|
||||||
*__SIMD32(pDst)++ = __PACKq7(out1, out2, out3, out4);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * B */
|
|
||||||
/* Multiply the inputs and store the result in the destination buffer */
|
|
||||||
*pDst++ = (q7_t) (((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicMult group
|
|
||||||
*/
|
|
||||||
-117
@@ -1,117 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_negate_f32.c
|
|
||||||
*
|
|
||||||
* Description: Negates floating-point vectors.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup negate Vector Negate
|
|
||||||
*
|
|
||||||
* Negates the elements of a vector.
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* pDst[n] = -pSrc[n], 0 <= n < blockSize.
|
|
||||||
* </pre>
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup negate
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Negates the elements of a floating-point vector.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_negate_f32(
|
|
||||||
float32_t * pSrc,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = -A */
|
|
||||||
/* Negate and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = -A */
|
|
||||||
/* Negate and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of negate group
|
|
||||||
*/
|
|
||||||
-140
@@ -1,140 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_negate_q15.c
|
|
||||||
*
|
|
||||||
* Description: Negates Q15 vectors.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup negate
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Negates the elements of a Q15 vector.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* The Q15 value -1 (0x8000) will be saturated to the maximum allowable positive value 0x7FFF.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_negate_q15(
|
|
||||||
q15_t * pSrc,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
q15_t in1, in2; /* Temporary variables */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = -A */
|
|
||||||
/* Read two inputs */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
/* Negate and then store the results in the destination buffer by packing. */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT(__SSAT(-in1, 16), __SSAT(-in2, 16), 16);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT(__SSAT(-in2, 16), __SSAT(-in1, 16), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT(__SSAT(-in1, 16), __SSAT(-in2, 16), 16);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT(__SSAT(-in2, 16), __SSAT(-in1, 16), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = -A */
|
|
||||||
/* Negate and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = __SSAT(-*pSrc++, 16);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of negate group
|
|
||||||
*/
|
|
||||||
-119
@@ -1,119 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_negate_q31.c
|
|
||||||
*
|
|
||||||
* Description: Negates Q31 vectors.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup negate
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Negates the elements of a Q31 vector.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* The Q31 value -1 (0x80000000) will be saturated to the maximum allowable positive value 0x7FFFFFFF.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_negate_q31(
|
|
||||||
q31_t * pSrc,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
q31_t in; /* Temporary variable */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = -A */
|
|
||||||
/* Negate and then store the results in the destination buffer. */
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in == 0x80000000) ? 0x7fffffff : -in;
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in == 0x80000000) ? 0x7fffffff : -in;
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in == 0x80000000) ? 0x7fffffff : -in;
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in == 0x80000000) ? 0x7fffffff : -in;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = -A */
|
|
||||||
/* Negate and then store the result in the destination buffer. */
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in == 0x80000000) ? 0x7fffffff : -in;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of negate group
|
|
||||||
*/
|
|
||||||
-122
@@ -1,122 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_negate_q7.c
|
|
||||||
*
|
|
||||||
* Description: Negates Q7 vectors.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup negate
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Negates the elements of a Q7 vector.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* The Q7 value -1 (0x80) will be saturated to the maximum allowable positive value 0x7F.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_negate_q7(
|
|
||||||
q7_t * pSrc,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
q7_t in1; /* Input value1 */
|
|
||||||
q7_t in2; /* Input value2 */
|
|
||||||
q7_t in3; /* Input value3 */
|
|
||||||
q7_t in4; /* Input value4 */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = -A */
|
|
||||||
/* Read four inputs */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
in3 = *pSrc++;
|
|
||||||
in4 = *pSrc++;
|
|
||||||
|
|
||||||
/* Store the Negated results in the destination buffer in a single cycle by packing the results */
|
|
||||||
*__SIMD32(pDst)++ =
|
|
||||||
__PACKq7(__SSAT(-in1, 8), __SSAT(-in2, 8), __SSAT(-in3, 8),
|
|
||||||
__SSAT(-in4, 8));
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = -A */
|
|
||||||
/* Negate and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = __SSAT(-*pSrc++, 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of negate group
|
|
||||||
*/
|
|
||||||
-122
@@ -1,122 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_offset_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point vector offset.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup offset Vector Offset
|
|
||||||
*
|
|
||||||
* Adds a constant offset to each element of a vector.
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* pDst[n] = pSrc[n] + offset, 0 <= n < blockSize.
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* There are separate functions for floating-point, Q7, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup offset
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Adds a constant offset to a floating-point vector.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] offset is the offset to be added
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void arm_offset_f32(
|
|
||||||
float32_t * pSrc,
|
|
||||||
float32_t offset,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrc++) + offset;
|
|
||||||
*pDst++ = (*pSrc++) + offset;
|
|
||||||
*pDst++ = (*pSrc++) + offset;
|
|
||||||
*pDst++ = (*pSrc++) + offset;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrc++) + offset;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of offset group
|
|
||||||
*/
|
|
||||||
-128
@@ -1,128 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_offset_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 vector offset.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup offset
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Adds a constant offset to a Q15 vector.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] offset is the offset to be added
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q15 range [0x8000 0x7FFF] are saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_offset_q15(
|
|
||||||
q15_t * pSrc,
|
|
||||||
q15_t offset,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
q31_t offset_packed; /* Offset packed to 32 bit */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* Offset is packed to 32 bit in order to use SIMD32 for addition */
|
|
||||||
offset_packed = __PKHBT(offset, offset, 16);
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the results in the destination buffer, 2 samples at a time. */
|
|
||||||
*__SIMD32(pDst)++ = __QADD16(*__SIMD32(pSrc)++, offset_packed);
|
|
||||||
*__SIMD32(pDst)++ = __QADD16(*__SIMD32(pSrc)++, offset_packed);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) __QADD16(*pSrc++, offset);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) __SSAT(((q31_t) * pSrc++ + offset), 16);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of offset group
|
|
||||||
*/
|
|
||||||
-126
@@ -1,126 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_offset_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 vector offset.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup offset
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Adds a constant offset to a Q31 vector.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] offset is the offset to be added
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] are saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_offset_q31(
|
|
||||||
q31_t * pSrc,
|
|
||||||
q31_t offset,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = __QADD(*pSrc++, offset);
|
|
||||||
*pDst++ = __QADD(*pSrc++, offset);
|
|
||||||
*pDst++ = __QADD(*pSrc++, offset);
|
|
||||||
*pDst++ = __QADD(*pSrc++, offset);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = __QADD(*pSrc++, offset);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) clip_q63_to_q31((q63_t) * pSrc++ + offset);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of offset group
|
|
||||||
*/
|
|
||||||
-127
@@ -1,127 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_offset_q7.c
|
|
||||||
*
|
|
||||||
* Description: Q7 vector offset.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup offset
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Adds a constant offset to a Q7 vector.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] offset is the offset to be added
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q7 range [0x80 0x7F] are saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_offset_q7(
|
|
||||||
q7_t * pSrc,
|
|
||||||
q7_t offset,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
q31_t offset_packed; /* Offset packed to 32 bit */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* Offset is packed to 32 bit in order to use SIMD32 for addition */
|
|
||||||
offset_packed = __PACKq7(offset, offset, offset, offset);
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the results in the destination bufferfor 4 samples at a time. */
|
|
||||||
*__SIMD32(pDst)++ = __QADD8(*__SIMD32(pSrc)++, offset_packed);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q7_t) __SSAT(*pSrc++ + offset, 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A + offset */
|
|
||||||
/* Add offset and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q7_t) __SSAT((q15_t) * pSrc++ + offset, 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of offset group
|
|
||||||
*/
|
|
||||||
-133
@@ -1,133 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_scale_f32.c
|
|
||||||
*
|
|
||||||
* Description: Multiplies a floating-point vector by a scalar.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup scale Vector Scale
|
|
||||||
*
|
|
||||||
* Multiply a vector by a scalar value. For floating-point data, the algorithm used is:
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* pDst[n] = pSrc[n] * scale, 0 <= n < blockSize.
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* In the fixed-point Q7, Q15, and Q31 functions, <code>scale</code> is represented by
|
|
||||||
* a fractional multiplication <code>scaleFract</code> and an arithmetic shift <code>shift</code>.
|
|
||||||
* The shift allows the gain of the scaling operation to exceed 1.0.
|
|
||||||
* The algorithm used with fixed-point data is:
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* pDst[n] = (pSrc[n] * scaleFract) << shift, 0 <= n < blockSize.
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* The overall scale factor applied to the fixed-point data is
|
|
||||||
* <pre>
|
|
||||||
* scale = scaleFract * 2^shift.
|
|
||||||
* </pre>
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup scale
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Multiplies a floating-point vector by a scalar.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] scale scale factor to be applied
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void arm_scale_f32(
|
|
||||||
float32_t * pSrc,
|
|
||||||
float32_t scale,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * scale */
|
|
||||||
/* Scale the input and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrc++) * scale;
|
|
||||||
*pDst++ = (*pSrc++) * scale;
|
|
||||||
*pDst++ = (*pSrc++) * scale;
|
|
||||||
*pDst++ = (*pSrc++) * scale;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * scale */
|
|
||||||
/* Scale the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrc++) * scale;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of scale group
|
|
||||||
*/
|
|
||||||
-162
@@ -1,162 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_scale_q15.c
|
|
||||||
*
|
|
||||||
* Description: Multiplies a Q15 vector by a scalar.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup scale
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Multiplies a Q15 vector by a scalar.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] scaleFract fractional portion of the scale value
|
|
||||||
* @param[in] shift number of bits to shift the result by
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The input data <code>*pSrc</code> and <code>scaleFract</code> are in 1.15 format.
|
|
||||||
* These are multiplied to yield a 2.30 intermediate result and this is shifted with saturation to 1.15 format.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void arm_scale_q15(
|
|
||||||
q15_t * pSrc,
|
|
||||||
q15_t scaleFract,
|
|
||||||
int8_t shift,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
int8_t kShift = 15 - shift; /* shift to apply after scaling */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
q15_t in1, in2; /* Temporary variables */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* Reading 2 inputs from memory */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
/* C = A * scale */
|
|
||||||
/* Scale the inputs and then store the 2 results in the destination buffer
|
|
||||||
* in single cycle by packing the outputs */
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ =
|
|
||||||
__PKHBT(__SSAT((in1 * scaleFract) >> kShift, 16),
|
|
||||||
__SSAT((in2 * scaleFract) >> kShift, 16), 16);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ =
|
|
||||||
__PKHBT(__SSAT((in2 * scaleFract) >> kShift, 16),
|
|
||||||
__SSAT((in1 * scaleFract) >> kShift, 16), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ =
|
|
||||||
__PKHBT(__SSAT((in1 * scaleFract) >> kShift, 16),
|
|
||||||
__SSAT((in2 * scaleFract) >> kShift, 16), 16);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ =
|
|
||||||
__PKHBT(__SSAT((in2 * scaleFract) >> kShift, 16),
|
|
||||||
__SSAT((in1 * scaleFract) >> kShift, 16), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * scale */
|
|
||||||
/* Scale the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) (__SSAT(((*pSrc++) * scaleFract) >> kShift, 16));
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * scale */
|
|
||||||
/* Scale the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) (__SSAT(((q31_t) * pSrc++ * scaleFract) >> kShift, 16));
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of scale group
|
|
||||||
*/
|
|
||||||
-117
@@ -1,117 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_scale_q31.c
|
|
||||||
*
|
|
||||||
* Description: Multiplies a Q31 vector by a scalar.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup scale
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Multiplies a Q31 vector by a scalar.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] scaleFract fractional portion of the scale value
|
|
||||||
* @param[in] shift number of bits to shift the result by
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The input data <code>*pSrc</code> and <code>scaleFract</code> are in 1.31 format.
|
|
||||||
* These are multiplied to yield a 2.62 intermediate result and this is shifted with saturation to 1.31 format.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_scale_q31(
|
|
||||||
q31_t * pSrc,
|
|
||||||
q31_t scaleFract,
|
|
||||||
int8_t shift,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
int8_t kShift = 31 - shift; /* Shift to apply after scaling */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * scale */
|
|
||||||
/* Scale the input and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = clip_q63_to_q31(((q63_t) * pSrc++ * scaleFract) >> kShift);
|
|
||||||
*pDst++ = clip_q63_to_q31(((q63_t) * pSrc++ * scaleFract) >> kShift);
|
|
||||||
*pDst++ = clip_q63_to_q31(((q63_t) * pSrc++ * scaleFract) >> kShift);
|
|
||||||
*pDst++ = clip_q63_to_q31(((q63_t) * pSrc++ * scaleFract) >> kShift);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * scale */
|
|
||||||
/* Scale the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = clip_q63_to_q31(((q63_t) * pSrc++ * scaleFract) >> kShift);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of scale group
|
|
||||||
*/
|
|
||||||
-141
@@ -1,141 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_scale_q7.c
|
|
||||||
*
|
|
||||||
* Description: Multiplies a Q7 vector by a scalar.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup scale
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Multiplies a Q7 vector by a scalar.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] scaleFract fractional portion of the scale value
|
|
||||||
* @param[in] shift number of bits to shift the result by
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The input data <code>*pSrc</code> and <code>scaleFract</code> are in 1.7 format.
|
|
||||||
* These are multiplied to yield a 2.14 intermediate result and this is shifted with saturation to 1.7 format.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_scale_q7(
|
|
||||||
q7_t * pSrc,
|
|
||||||
q7_t scaleFract,
|
|
||||||
int8_t shift,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
int8_t kShift = 7 - shift; /* shift to apply after scaling */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
q7_t in1, in2, in3, in4, out1, out2, out3, out4; /* Temporary variables to store input & output */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* Reading 4 inputs from memory */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
in3 = *pSrc++;
|
|
||||||
in4 = *pSrc++;
|
|
||||||
|
|
||||||
/* C = A * scale */
|
|
||||||
/* Scale the inputs and then store the results in the temporary variables. */
|
|
||||||
out1 = (q7_t) (__SSAT(((in1) * scaleFract) >> kShift, 8));
|
|
||||||
out2 = (q7_t) (__SSAT(((in2) * scaleFract) >> kShift, 8));
|
|
||||||
out3 = (q7_t) (__SSAT(((in3) * scaleFract) >> kShift, 8));
|
|
||||||
out4 = (q7_t) (__SSAT(((in4) * scaleFract) >> kShift, 8));
|
|
||||||
|
|
||||||
/* Packing the individual outputs into 32bit and storing in
|
|
||||||
* destination buffer in single write */
|
|
||||||
*__SIMD32(pDst)++ = __PACKq7(out1, out2, out3, out4);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * scale */
|
|
||||||
/* Scale the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q7_t) (__SSAT(((*pSrc++) * scaleFract) >> kShift, 8));
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A * scale */
|
|
||||||
/* Scale the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q7_t) (__SSAT((((q15_t) * pSrc++ * scaleFract) >> kShift), 8));
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of scale group
|
|
||||||
*/
|
|
||||||
-239
@@ -1,239 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_shift_q15.c
|
|
||||||
*
|
|
||||||
* Description: Shifts the elements of a Q15 vector by a specified number of bits.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup shift
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Shifts the elements of a Q15 vector a specified number of bits.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right.
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q15 range [0x8000 0x7FFF] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_shift_q15(
|
|
||||||
q15_t * pSrc,
|
|
||||||
int8_t shiftBits,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
uint8_t sign; /* Sign of shiftBits */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
q15_t in1, in2; /* Temporary variables */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* Getting the sign of shiftBits */
|
|
||||||
sign = (shiftBits & 0x80);
|
|
||||||
|
|
||||||
/* If the shift value is positive then do right shift else left shift */
|
|
||||||
if(sign == 0u)
|
|
||||||
{
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* Read 2 inputs */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
/* C = A << shiftBits */
|
|
||||||
/* Shift the inputs and then store the results in the destination buffer. */
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT(__SSAT((in1 << shiftBits), 16),
|
|
||||||
__SSAT((in2 << shiftBits), 16), 16);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT(__SSAT((in2 << shiftBits), 16),
|
|
||||||
__SSAT((in1 << shiftBits), 16), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT(__SSAT((in1 << shiftBits), 16),
|
|
||||||
__SSAT((in2 << shiftBits), 16), 16);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT(__SSAT((in2 << shiftBits), 16),
|
|
||||||
__SSAT((in1 << shiftBits), 16), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A << shiftBits */
|
|
||||||
/* Shift and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = __SSAT((*pSrc++ << shiftBits), 16);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* Read 2 inputs */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
/* C = A >> shiftBits */
|
|
||||||
/* Shift the inputs and then store the results in the destination buffer. */
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT((in1 >> -shiftBits),
|
|
||||||
(in2 >> -shiftBits), 16);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT((in2 >> -shiftBits),
|
|
||||||
(in1 >> -shiftBits), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT((in1 >> -shiftBits),
|
|
||||||
(in2 >> -shiftBits), 16);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
*__SIMD32(pDst)++ = __PKHBT((in2 >> -shiftBits),
|
|
||||||
(in1 >> -shiftBits), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A >> shiftBits */
|
|
||||||
/* Shift the inputs and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrc++ >> -shiftBits);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Getting the sign of shiftBits */
|
|
||||||
sign = (shiftBits & 0x80);
|
|
||||||
|
|
||||||
/* If the shift value is positive then do right shift else left shift */
|
|
||||||
if(sign == 0u)
|
|
||||||
{
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A << shiftBits */
|
|
||||||
/* Shift and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = __SSAT(((q31_t) * pSrc++ << shiftBits), 16);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A >> shiftBits */
|
|
||||||
/* Shift the inputs and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrc++ >> -shiftBits);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of shift group
|
|
||||||
*/
|
|
||||||
-141
@@ -1,141 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_shift_q31.c
|
|
||||||
*
|
|
||||||
* Description: Shifts the elements of a Q31 vector by a specified number of bits.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @defgroup shift Vector Shift
|
|
||||||
*
|
|
||||||
* Shifts the elements of a fixed-point vector by a specified number of bits.
|
|
||||||
* There are separate functions for Q7, Q15, and Q31 data types.
|
|
||||||
* The underlying algorithm used is:
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* pDst[n] = pSrc[n] << shift, 0 <= n < blockSize.
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* If <code>shift</code> is positive then the elements of the vector are shifted to the left.
|
|
||||||
* If <code>shift</code> is negative then the elements of the vector are shifted to the right.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup shift
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Shifts the elements of a Q31 vector a specified number of bits.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right.
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_shift_q31(
|
|
||||||
q31_t * pSrc,
|
|
||||||
int8_t shiftBits,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
uint8_t sign; /* Sign of shiftBits */
|
|
||||||
/* Getting the sign of shiftBits */
|
|
||||||
sign = (shiftBits & 0x80);
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A (>> or <<) shiftBits */
|
|
||||||
/* Shift the input and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (sign == 0u) ? clip_q63_to_q31((q63_t) * pSrc++ << shiftBits) :
|
|
||||||
(*pSrc++ >> -shiftBits);
|
|
||||||
*pDst++ = (sign == 0u) ? clip_q63_to_q31((q63_t) * pSrc++ << shiftBits) :
|
|
||||||
(*pSrc++ >> -shiftBits);
|
|
||||||
*pDst++ = (sign == 0u) ? clip_q63_to_q31((q63_t) * pSrc++ << shiftBits) :
|
|
||||||
(*pSrc++ >> -shiftBits);
|
|
||||||
*pDst++ = (sign == 0u) ? clip_q63_to_q31((q63_t) * pSrc++ << shiftBits) :
|
|
||||||
(*pSrc++ >> -shiftBits);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A (>> or <<) shiftBits */
|
|
||||||
/* Shift the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (sign == 0u) ? clip_q63_to_q31((q63_t) * pSrc++ << shiftBits) :
|
|
||||||
(*pSrc++ >> -shiftBits);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of shift group
|
|
||||||
*/
|
|
||||||
-202
@@ -1,202 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_shift_q7.c
|
|
||||||
*
|
|
||||||
* Description: Processing function for the Q7 Shifting
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup shift
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Shifts the elements of a Q7 vector a specified number of bits.
|
|
||||||
* @param[in] *pSrc points to the input vector
|
|
||||||
* @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right.
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in the vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q7 range [0x8 0x7F] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_shift_q7(
|
|
||||||
q7_t * pSrc,
|
|
||||||
int8_t shiftBits,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
uint8_t sign; /* Sign of shiftBits */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
q7_t in1; /* Input value1 */
|
|
||||||
q7_t in2; /* Input value2 */
|
|
||||||
q7_t in3; /* Input value3 */
|
|
||||||
q7_t in4; /* Input value4 */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* Getting the sign of shiftBits */
|
|
||||||
sign = (shiftBits & 0x80);
|
|
||||||
|
|
||||||
/* If the shift value is positive then do right shift else left shift */
|
|
||||||
if(sign == 0u)
|
|
||||||
{
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A << shiftBits */
|
|
||||||
/* Read 4 inputs */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
in3 = *pSrc++;
|
|
||||||
in4 = *pSrc++;
|
|
||||||
|
|
||||||
/* Store the Shifted result in the destination buffer in single cycle by packing the outputs */
|
|
||||||
*__SIMD32(pDst)++ = __PACKq7(__SSAT((in1 << shiftBits), 8),
|
|
||||||
__SSAT((in2 << shiftBits), 8),
|
|
||||||
__SSAT((in3 << shiftBits), 8),
|
|
||||||
__SSAT((in4 << shiftBits), 8));
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A << shiftBits */
|
|
||||||
/* Shift the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q7_t) __SSAT((*pSrc++ << shiftBits), 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A >> shiftBits */
|
|
||||||
/* Read 4 inputs */
|
|
||||||
in1 = *pSrc++;
|
|
||||||
in2 = *pSrc++;
|
|
||||||
in3 = *pSrc++;
|
|
||||||
in4 = *pSrc++;
|
|
||||||
|
|
||||||
/* Store the Shifted result in the destination buffer in single cycle by packing the outputs */
|
|
||||||
*__SIMD32(pDst)++ = __PACKq7((in1 >> -shiftBits), (in2 >> -shiftBits),
|
|
||||||
(in3 >> -shiftBits), (in4 >> -shiftBits));
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A >> shiftBits */
|
|
||||||
/* Shift the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrc++ >> -shiftBits);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Getting the sign of shiftBits */
|
|
||||||
sign = (shiftBits & 0x80);
|
|
||||||
|
|
||||||
/* If the shift value is positive then do right shift else left shift */
|
|
||||||
if(sign == 0u)
|
|
||||||
{
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A << shiftBits */
|
|
||||||
/* Shift the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q7_t) __SSAT(((q15_t) * pSrc++ << shiftBits), 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A >> shiftBits */
|
|
||||||
/* Shift the input and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrc++ >> -shiftBits);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of shift group
|
|
||||||
*/
|
|
||||||
-122
@@ -1,122 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_sub_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point vector subtraction.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup BasicSub Vector Subtraction
|
|
||||||
*
|
|
||||||
* Element-by-element subtraction of two vectors.
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* pDst[n] = pSrcA[n] - pSrcB[n], 0 <= n < blockSize.
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* There are separate functions for floating-point, Q7, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicSub
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Floating-point vector subtraction.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_sub_f32(
|
|
||||||
float32_t * pSrcA,
|
|
||||||
float32_t * pSrcB,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrcA++) - (*pSrcB++);
|
|
||||||
*pDst++ = (*pSrcA++) - (*pSrcB++);
|
|
||||||
*pDst++ = (*pSrcA++) - (*pSrcB++);
|
|
||||||
*pDst++ = (*pSrcA++) - (*pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = (*pSrcA++) - (*pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicSub group
|
|
||||||
*/
|
|
||||||
-124
@@ -1,124 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_sub_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 vector subtraction.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicSub
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q15 vector subtraction.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q15 range [0x8000 0x7FFF] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_sub_q15(
|
|
||||||
q15_t * pSrcA,
|
|
||||||
q15_t * pSrcB,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the results in the destination buffer two samples at a time. */
|
|
||||||
*__SIMD32(pDst)++ = __QSUB16(*__SIMD32(pSrcA)++, *__SIMD32(pSrcB)++);
|
|
||||||
*__SIMD32(pDst)++ = __QSUB16(*__SIMD32(pSrcA)++, *__SIMD32(pSrcB)++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) __QSUB16(*pSrcA++, *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) __SSAT(((q31_t) * pSrcA++ - *pSrcB++), 16);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicSub group
|
|
||||||
*/
|
|
||||||
-125
@@ -1,125 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_sub_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 vector subtraction.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicSub
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q31 vector subtraction.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_sub_q31(
|
|
||||||
q31_t * pSrcA,
|
|
||||||
q31_t * pSrcB,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = __QSUB(*pSrcA++, *pSrcB++);
|
|
||||||
*pDst++ = __QSUB(*pSrcA++, *pSrcB++);
|
|
||||||
*pDst++ = __QSUB(*pSrcA++, *pSrcB++);
|
|
||||||
*pDst++ = __QSUB(*pSrcA++, *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = __QSUB(*pSrcA++, *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) clip_q63_to_q31((q63_t) * pSrcA++ - *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicSub group
|
|
||||||
*/
|
|
||||||
-123
@@ -1,123 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_sub_q7.c
|
|
||||||
*
|
|
||||||
* Description: Q7 vector subtraction.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Version 0.0.7 2010/06/10
|
|
||||||
* Misra-C changes done
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup BasicSub
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q7 vector subtraction.
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] blockSize number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q7 range [0x80 0x7F] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_sub_q7(
|
|
||||||
q7_t * pSrcA,
|
|
||||||
q7_t * pSrcB,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = blockSize >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the results in the destination buffer 4 samples at a time. */
|
|
||||||
*__SIMD32(pDst)++ = __QSUB8(*__SIMD32(pSrcA)++, *__SIMD32(pSrcB)++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = blockSize % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = __SSAT(*pSrcA++ - *pSrcB++, 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* Initialize blkCnt with number of samples */
|
|
||||||
blkCnt = blockSize;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C = A - B */
|
|
||||||
/* Subtract and then store the result in the destination buffer. */
|
|
||||||
*pDst++ = (q7_t) __SSAT((q15_t) * pSrcA++ - *pSrcB++, 8);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of BasicSub group
|
|
||||||
*/
|
|
||||||
-144
@@ -1,144 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_common_tables.c
|
|
||||||
*
|
|
||||||
* Description: This file has common tables like Bitreverse, reciprocal etc which are used across different functions
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupTransforms
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup CFFT_CIFFT
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \par
|
|
||||||
* Pseudo code for Generation of Bit reversal Table is
|
|
||||||
* \par
|
|
||||||
* <pre>for(l=1;l <= N/4;l++)
|
|
||||||
* {
|
|
||||||
* for(i=0;i<logN2;i++)
|
|
||||||
* {
|
|
||||||
* a[i]=l&(1<<i);
|
|
||||||
* }
|
|
||||||
* for(j=0; j<logN2; j++)
|
|
||||||
* {
|
|
||||||
* if (a[j]!=0)
|
|
||||||
* y[l]+=(1<<((logN2-1)-j));
|
|
||||||
* }
|
|
||||||
* y[l] = y[l] >> 1;
|
|
||||||
* } </pre>
|
|
||||||
* \par
|
|
||||||
* where N = 1024 logN2 = 10
|
|
||||||
* \par
|
|
||||||
* N is the maximum FFT Size supported
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Table for bit reversal process
|
|
||||||
*/
|
|
||||||
const uint16_t armBitRevTable[256] = {
|
|
||||||
0x100, 0x80, 0x180, 0x40, 0x140, 0xc0, 0x1c0,
|
|
||||||
0x20, 0x120, 0xa0, 0x1a0, 0x60, 0x160, 0xe0,
|
|
||||||
0x1e0, 0x10, 0x110, 0x90, 0x190, 0x50, 0x150,
|
|
||||||
0xd0, 0x1d0, 0x30, 0x130, 0xb0, 0x1b0, 0x70,
|
|
||||||
0x170, 0xf0, 0x1f0, 0x8, 0x108, 0x88, 0x188,
|
|
||||||
0x48, 0x148, 0xc8, 0x1c8, 0x28, 0x128, 0xa8,
|
|
||||||
0x1a8, 0x68, 0x168, 0xe8, 0x1e8, 0x18, 0x118,
|
|
||||||
0x98, 0x198, 0x58, 0x158, 0xd8, 0x1d8, 0x38,
|
|
||||||
0x138, 0xb8, 0x1b8, 0x78, 0x178, 0xf8, 0x1f8,
|
|
||||||
0x4, 0x104, 0x84, 0x184, 0x44, 0x144, 0xc4,
|
|
||||||
0x1c4, 0x24, 0x124, 0xa4, 0x1a4, 0x64, 0x164,
|
|
||||||
0xe4, 0x1e4, 0x14, 0x114, 0x94, 0x194, 0x54,
|
|
||||||
0x154, 0xd4, 0x1d4, 0x34, 0x134, 0xb4, 0x1b4,
|
|
||||||
0x74, 0x174, 0xf4, 0x1f4, 0xc, 0x10c, 0x8c,
|
|
||||||
0x18c, 0x4c, 0x14c, 0xcc, 0x1cc, 0x2c, 0x12c,
|
|
||||||
0xac, 0x1ac, 0x6c, 0x16c, 0xec, 0x1ec, 0x1c,
|
|
||||||
0x11c, 0x9c, 0x19c, 0x5c, 0x15c, 0xdc, 0x1dc,
|
|
||||||
0x3c, 0x13c, 0xbc, 0x1bc, 0x7c, 0x17c, 0xfc,
|
|
||||||
0x1fc, 0x2, 0x102, 0x82, 0x182, 0x42, 0x142,
|
|
||||||
0xc2, 0x1c2, 0x22, 0x122, 0xa2, 0x1a2, 0x62,
|
|
||||||
0x162, 0xe2, 0x1e2, 0x12, 0x112, 0x92, 0x192,
|
|
||||||
0x52, 0x152, 0xd2, 0x1d2, 0x32, 0x132, 0xb2,
|
|
||||||
0x1b2, 0x72, 0x172, 0xf2, 0x1f2, 0xa, 0x10a,
|
|
||||||
0x8a, 0x18a, 0x4a, 0x14a, 0xca, 0x1ca, 0x2a,
|
|
||||||
0x12a, 0xaa, 0x1aa, 0x6a, 0x16a, 0xea, 0x1ea,
|
|
||||||
0x1a, 0x11a, 0x9a, 0x19a, 0x5a, 0x15a, 0xda,
|
|
||||||
0x1da, 0x3a, 0x13a, 0xba, 0x1ba, 0x7a, 0x17a,
|
|
||||||
0xfa, 0x1fa, 0x6, 0x106, 0x86, 0x186, 0x46,
|
|
||||||
0x146, 0xc6, 0x1c6, 0x26, 0x126, 0xa6, 0x1a6,
|
|
||||||
0x66, 0x166, 0xe6, 0x1e6, 0x16, 0x116, 0x96,
|
|
||||||
0x196, 0x56, 0x156, 0xd6, 0x1d6, 0x36, 0x136,
|
|
||||||
0xb6, 0x1b6, 0x76, 0x176, 0xf6, 0x1f6, 0xe,
|
|
||||||
0x10e, 0x8e, 0x18e, 0x4e, 0x14e, 0xce, 0x1ce,
|
|
||||||
0x2e, 0x12e, 0xae, 0x1ae, 0x6e, 0x16e, 0xee,
|
|
||||||
0x1ee, 0x1e, 0x11e, 0x9e, 0x19e, 0x5e, 0x15e,
|
|
||||||
0xde, 0x1de, 0x3e, 0x13e, 0xbe, 0x1be, 0x7e,
|
|
||||||
0x17e, 0xfe, 0x1fe, 0x1
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of CFFT_CIFFT group
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Q15 table for reciprocal
|
|
||||||
*/
|
|
||||||
const q15_t armRecipTableQ15[64] = {
|
|
||||||
0x7F03, 0x7D13, 0x7B31, 0x795E, 0x7798, 0x75E0,
|
|
||||||
0x7434, 0x7294, 0x70FF, 0x6F76, 0x6DF6, 0x6C82,
|
|
||||||
0x6B16, 0x69B5, 0x685C, 0x670C, 0x65C4, 0x6484,
|
|
||||||
0x634C, 0x621C, 0x60F3, 0x5FD0, 0x5EB5, 0x5DA0,
|
|
||||||
0x5C91, 0x5B88, 0x5A85, 0x5988, 0x5890, 0x579E,
|
|
||||||
0x56B0, 0x55C8, 0x54E4, 0x5405, 0x532B, 0x5255,
|
|
||||||
0x5183, 0x50B6, 0x4FEC, 0x4F26, 0x4E64, 0x4DA6,
|
|
||||||
0x4CEC, 0x4C34, 0x4B81, 0x4AD0, 0x4A23, 0x4978,
|
|
||||||
0x48D1, 0x482D, 0x478C, 0x46ED, 0x4651, 0x45B8,
|
|
||||||
0x4521, 0x448D, 0x43FC, 0x436C, 0x42DF, 0x4255,
|
|
||||||
0x41CC, 0x4146, 0x40C2, 0x4040
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Q31 table for reciprocal
|
|
||||||
*/
|
|
||||||
const q31_t armRecipTableQ31[64] = {
|
|
||||||
0x7F03F03F, 0x7D137420, 0x7B31E739, 0x795E9F94, 0x7798FD29, 0x75E06928,
|
|
||||||
0x7434554D, 0x72943B4B, 0x70FF9C40, 0x6F760031, 0x6DF6F593, 0x6C8210E3,
|
|
||||||
0x6B16EC3A, 0x69B526F6, 0x685C655F, 0x670C505D, 0x65C4952D, 0x6484E519,
|
|
||||||
0x634CF53E, 0x621C7E4F, 0x60F33C61, 0x5FD0EEB3, 0x5EB55785, 0x5DA03BEB,
|
|
||||||
0x5C9163A1, 0x5B8898E6, 0x5A85A85A, 0x598860DF, 0x58909373, 0x579E1318,
|
|
||||||
0x56B0B4B8, 0x55C84F0B, 0x54E4BA80, 0x5405D124, 0x532B6E8F, 0x52556FD0,
|
|
||||||
0x5183B35A, 0x50B618F3, 0x4FEC81A2, 0x4F26CFA2, 0x4E64E64E, 0x4DA6AA1D,
|
|
||||||
0x4CEC008B, 0x4C34D010, 0x4B810016, 0x4AD078EF, 0x4A2323C4, 0x4978EA96,
|
|
||||||
0x48D1B827, 0x482D77FE, 0x478C1657, 0x46ED801D, 0x4651A2E5, 0x45B86CE2,
|
|
||||||
0x4521CCE1, 0x448DB244, 0x43FC0CFA, 0x436CCD78, 0x42DFE4B4, 0x42554426,
|
|
||||||
0x41CCDDB6, 0x4146A3C6, 0x40C28923, 0x40408102
|
|
||||||
};
|
|
||||||
-141
@@ -1,141 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_conj_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point complex conjugate.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup cmplx_conj Complex Conjugate
|
|
||||||
*
|
|
||||||
* Conjugates the elements of a complex data vector.
|
|
||||||
*
|
|
||||||
* The <code>pSrc</code> points to the source data and
|
|
||||||
* <code>pDst</code> points to the where the result should be written.
|
|
||||||
* <code>numSamples</code> specifies the number of complex samples
|
|
||||||
* and the data in each array is stored in an interleaved fashion
|
|
||||||
* (real, imag, real, imag, ...).
|
|
||||||
* Each array has a total of <code>2*numSamples</code> values.
|
|
||||||
* The underlying algorithm is used:
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* for(n=0; n<numSamples; n++) {
|
|
||||||
* pDst[(2*n)+0)] = pSrc[(2*n)+0]; // real part
|
|
||||||
* pDst[(2*n)+1)] = -pSrc[(2*n)+1]; // imag part
|
|
||||||
* }
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* There are separate functions for floating-point, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_conj
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Floating-point complex conjugate.
|
|
||||||
* @param *pSrc points to the input vector
|
|
||||||
* @param *pDst points to the output vector
|
|
||||||
* @param numSamples number of complex samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_conj_f32(
|
|
||||||
float32_t * pSrc,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0]+jC[1] = A[0]+ j (-1) A[1] */
|
|
||||||
/* Calculate Complex Conjugate and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0]+jC[1] = A[0]+ j (-1) A[1] */
|
|
||||||
/* Calculate Complex Conjugate and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* realOut + j (imagOut) = realIn + j (-1) imagIn */
|
|
||||||
/* Calculate Complex Conjugate and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_conj group
|
|
||||||
*/
|
|
||||||
-123
@@ -1,123 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_conj_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 complex conjugate.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_conj
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q15 complex conjugate.
|
|
||||||
* @param *pSrc points to the input vector
|
|
||||||
* @param *pDst points to the output vector
|
|
||||||
* @param numSamples number of complex samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* The Q15 value -1 (0x8000) will be saturated to the maximum allowable positive value 0x7FFF.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_conj_q15(
|
|
||||||
q15_t * pSrc,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0]+jC[1] = A[0]+ j (-1) A[1] */
|
|
||||||
/* Calculate Complex Conjugate and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = __SSAT(-*pSrc++, 16);
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = __SSAT(-*pSrc++, 16);
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = __SSAT(-*pSrc++, 16);
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = __SSAT(-*pSrc++, 16);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0]+jC[1] = A[0]+ j (-1) A[1] */
|
|
||||||
/* Calculate Complex Conjugate and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = __SSAT(-*pSrc++, 16);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* realOut + j (imagOut) = realIn+ j (-1) imagIn */
|
|
||||||
/* Calculate Complex Conjugate and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_conj group
|
|
||||||
*/
|
|
||||||
-131
@@ -1,131 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_conj_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 complex conjugate.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_conj
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q31 complex conjugate.
|
|
||||||
* @param *pSrc points to the input vector
|
|
||||||
* @param *pDst points to the output vector
|
|
||||||
* @param numSamples number of complex samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* The Q31 value -1 (0x80000000) will be saturated to the maximum allowable positive value 0x7FFFFFFF.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_conj_q31(
|
|
||||||
q31_t * pSrc,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
q31_t in; /* Input value */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0]+jC[1] = A[0]+ j (-1) A[1] */
|
|
||||||
/* Calculate Complex Conjugate and then store the results in the destination buffer. */
|
|
||||||
/* Saturated to 0x7fffffff if the input is -1(0x80000000) */
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in == 0x80000000) ? 0x7fffffff : -in;
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in == 0x80000000) ? 0x7fffffff : -in;
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in == 0x80000000) ? 0x7fffffff : -in;
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in == 0x80000000) ? 0x7fffffff : -in;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0]+jC[1] = A[0]+ j (-1) A[1] */
|
|
||||||
/* Calculate Complex Conjugate and then store the results in the destination buffer. */
|
|
||||||
/* Saturated to 0x7fffffff if the input is -1(0x80000000) */
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
in = *pSrc++;
|
|
||||||
*pDst++ = (in == 0x80000000) ? 0x7fffffff : -in;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* realOut + j (imagOut) = realIn+ j (-1) imagIn */
|
|
||||||
/* Calculate Complex Conjugate and then store the results in the destination buffer. */
|
|
||||||
*pDst++ = *pSrc++;
|
|
||||||
*pDst++ = -*pSrc++;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_conj group
|
|
||||||
*/
|
|
||||||
-157
@@ -1,157 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_dot_prod_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point complex dot product
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup cmplx_dot_prod Complex Dot Product
|
|
||||||
*
|
|
||||||
* Computes the dot product of two complex vectors.
|
|
||||||
* The vectors are multiplied element-by-element and then summed.
|
|
||||||
*
|
|
||||||
* The <code>pSrcA</code> points to the first complex input vector and
|
|
||||||
* <code>pSrcB</code> points to the second complex input vector.
|
|
||||||
* <code>numSamples</code> specifies the number of complex samples
|
|
||||||
* and the data in each array is stored in an interleaved fashion
|
|
||||||
* (real, imag, real, imag, ...).
|
|
||||||
* Each array has a total of <code>2*numSamples</code> values.
|
|
||||||
*
|
|
||||||
* The underlying algorithm is used:
|
|
||||||
* <pre>
|
|
||||||
* realResult=0;
|
|
||||||
* imagResult=0;
|
|
||||||
* for(n=0; n<numSamples; n++) {
|
|
||||||
* realResult += pSrcA[(2*n)+0]*pSrcB[(2*n)+0] - pSrcA[(2*n)+1]*pSrcB[(2*n)+1];
|
|
||||||
* imagResult += pSrcA[(2*n)+0]*pSrcB[(2*n)+1] + pSrcA[(2*n)+1]*pSrcB[(2*n)+0];
|
|
||||||
* }
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* There are separate functions for floating-point, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_dot_prod
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Floating-point complex dot product
|
|
||||||
* @param *pSrcA points to the first input vector
|
|
||||||
* @param *pSrcB points to the second input vector
|
|
||||||
* @param numSamples number of complex samples in each vector
|
|
||||||
* @param *realResult real part of the result returned here
|
|
||||||
* @param *imagResult imaginary part of the result returned here
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_dot_prod_f32(
|
|
||||||
float32_t * pSrcA,
|
|
||||||
float32_t * pSrcB,
|
|
||||||
uint32_t numSamples,
|
|
||||||
float32_t * realResult,
|
|
||||||
float32_t * imagResult)
|
|
||||||
{
|
|
||||||
float32_t real_sum = 0.0f, imag_sum = 0.0f; /* Temporary result storage */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* CReal = A[0]* B[0] + A[2]* B[2] + A[4]* B[4] + .....+ A[numSamples-2]* B[numSamples-2] */
|
|
||||||
real_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
/* CImag = A[1]* B[1] + A[3]* B[3] + A[5]* B[5] + .....+ A[numSamples-1]* B[numSamples-1] */
|
|
||||||
imag_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
|
|
||||||
real_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
imag_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
|
|
||||||
real_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
imag_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
|
|
||||||
real_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
imag_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* CReal = A[0]* B[0] + A[2]* B[2] + A[4]* B[4] + .....+ A[numSamples-2]* B[numSamples-2] */
|
|
||||||
real_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
/* CImag = A[1]* B[1] + A[3]* B[3] + A[5]* B[5] + .....+ A[numSamples-1]* B[numSamples-1] */
|
|
||||||
imag_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* CReal = A[0]* B[0] + A[2]* B[2] + A[4]* B[4] + .....+ A[numSamples-2]* B[numSamples-2] */
|
|
||||||
real_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
/* CImag = A[1]* B[1] + A[3]* B[3] + A[5]* B[5] + .....+ A[numSamples-1]* B[numSamples-1] */
|
|
||||||
imag_sum += (*pSrcA++) * (*pSrcB++);
|
|
||||||
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
/* Store the real and imaginary results in the destination buffers */
|
|
||||||
*realResult = real_sum;
|
|
||||||
*imagResult = imag_sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_dot_prod group
|
|
||||||
*/
|
|
||||||
-141
@@ -1,141 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_dot_prod_q15.c
|
|
||||||
*
|
|
||||||
* Description: Processing function for the Q15 Complex Dot product
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_dot_prod
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q15 complex dot product
|
|
||||||
* @param *pSrcA points to the first input vector
|
|
||||||
* @param *pSrcB points to the second input vector
|
|
||||||
* @param numSamples number of complex samples in each vector
|
|
||||||
* @param *realResult real part of the result returned here
|
|
||||||
* @param *imagResult imaginary part of the result returned here
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function is implemented using an internal 64-bit accumulator.
|
|
||||||
* The intermediate 1.15 by 1.15 multiplications are performed with full precision and yield a 2.30 result.
|
|
||||||
* These are accumulated in a 64-bit accumulator with 34.30 precision.
|
|
||||||
* As a final step, the accumulators are converted to 8.24 format.
|
|
||||||
* The return results <code>realResult</code> and <code>imagResult</code> are in 8.24 format.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_dot_prod_q15(
|
|
||||||
q15_t * pSrcA,
|
|
||||||
q15_t * pSrcB,
|
|
||||||
uint32_t numSamples,
|
|
||||||
q31_t * realResult,
|
|
||||||
q31_t * imagResult)
|
|
||||||
{
|
|
||||||
q63_t real_sum = 0, imag_sum = 0; /* Temporary result storage */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* CReal = A[0]* B[0] + A[2]* B[2] + A[4]* B[4] + .....+ A[numSamples-2]* B[numSamples-2] */
|
|
||||||
real_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
|
|
||||||
/* CImag = A[1]* B[1] + A[3]* B[3] + A[5]* B[5] + .....+ A[numSamples-1]* B[numSamples-1] */
|
|
||||||
imag_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
|
|
||||||
real_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
imag_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
|
|
||||||
real_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
imag_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
|
|
||||||
real_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
imag_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* CReal = A[0]* B[0] + A[2]* B[2] + A[4]* B[4] + .....+ A[numSamples-2]* B[numSamples-2] */
|
|
||||||
real_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
/* CImag = A[1]* B[1] + A[3]* B[3] + A[5]* B[5] + .....+ A[numSamples-1]* B[numSamples-1] */
|
|
||||||
imag_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* CReal = A[0]* B[0] + A[2]* B[2] + A[4]* B[4] + .....+ A[numSamples-2]* B[numSamples-2] */
|
|
||||||
real_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
/* CImag = A[1]* B[1] + A[3]* B[3] + A[5]* B[5] + .....+ A[numSamples-1]* B[numSamples-1] */
|
|
||||||
imag_sum += ((q31_t) * pSrcA++ * *pSrcB++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
/* Store the real and imaginary results in 8.24 format */
|
|
||||||
/* Convert real data in 34.30 to 8.24 by 6 right shifts */
|
|
||||||
*realResult = (q31_t) (real_sum) >> 6;
|
|
||||||
/* Convert imaginary data in 34.30 to 8.24 by 6 right shifts */
|
|
||||||
*imagResult = (q31_t) (imag_sum) >> 6;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_dot_prod group
|
|
||||||
*/
|
|
||||||
-142
@@ -1,142 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_dot_prod_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 complex dot product
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_dot_prod
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q31 complex dot product
|
|
||||||
* @param *pSrcA points to the first input vector
|
|
||||||
* @param *pSrcB points to the second input vector
|
|
||||||
* @param numSamples number of complex samples in each vector
|
|
||||||
* @param *realResult real part of the result returned here
|
|
||||||
* @param *imagResult imaginary part of the result returned here
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function is implemented using an internal 64-bit accumulator.
|
|
||||||
* The intermediate 1.31 by 1.31 multiplications are performed with 64-bit precision and then shifted to 16.48 format.
|
|
||||||
* The internal real and imaginary accumulators are in 16.48 format and provide 15 guard bits.
|
|
||||||
* Additions are nonsaturating and no overflow will occur as long as <code>numSamples</code> is less than 32768.
|
|
||||||
* The return results <code>realResult</code> and <code>imagResult</code> are in 16.48 format.
|
|
||||||
* Input down scaling is not required.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_dot_prod_q31(
|
|
||||||
q31_t * pSrcA,
|
|
||||||
q31_t * pSrcB,
|
|
||||||
uint32_t numSamples,
|
|
||||||
q63_t * realResult,
|
|
||||||
q63_t * imagResult)
|
|
||||||
{
|
|
||||||
q63_t real_sum = 0, imag_sum = 0; /* Temporary result storage */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* CReal = A[0]* B[0] + A[2]* B[2] + A[4]* B[4] + .....+ A[numSamples-2]* B[numSamples-2] */
|
|
||||||
/* Convert real data in 2.62 to 16.48 by 14 right shifts */
|
|
||||||
real_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
/* CImag = A[1]* B[1] + A[3]* B[3] + A[5]* B[5] + .....+ A[numSamples-1]* B[numSamples-1] */
|
|
||||||
/* Convert imag data in 2.62 to 16.48 by 14 right shifts */
|
|
||||||
imag_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
|
|
||||||
real_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
imag_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
|
|
||||||
real_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
imag_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
|
|
||||||
real_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
imag_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* CReal = A[0]* B[0] + A[2]* B[2] + A[4]* B[4] + .....+ A[numSamples-2]* B[numSamples-2] */
|
|
||||||
real_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
/* CImag = A[1]* B[1] + A[3]* B[3] + A[5]* B[5] + .....+ A[numSamples-1]* B[numSamples-1] */
|
|
||||||
imag_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* outReal = realA[0]* realB[0] + realA[2]* realB[2] + realA[4]* realB[4] + .....+ realA[numSamples-2]* realB[numSamples-2] */
|
|
||||||
real_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
/* outImag = imagA[1]* imagB[1] + imagA[3]* imagB[3] + imagA[5]* imagB[5] + .....+ imagA[numSamples-1]* imagB[numSamples-1] */
|
|
||||||
imag_sum += (q63_t) * pSrcA++ * (*pSrcB++) >> 14;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
/* Store the real and imaginary results in 16.48 format */
|
|
||||||
*realResult = real_sum;
|
|
||||||
*imagResult = imag_sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_dot_prod group
|
|
||||||
*/
|
|
||||||
-154
@@ -1,154 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mag_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point complex magnitude.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup cmplx_mag Complex Magnitude
|
|
||||||
*
|
|
||||||
* Computes the magnitude of the elements of a complex data vector.
|
|
||||||
*
|
|
||||||
* The <code>pSrc</code> points to the source data and
|
|
||||||
* <code>pDst</code> points to the where the result should be written.
|
|
||||||
* <code>numSamples</code> specifies the number of complex samples
|
|
||||||
* in the input array and the data is stored in an interleaved fashion
|
|
||||||
* (real, imag, real, imag, ...).
|
|
||||||
* The input array has a total of <code>2*numSamples</code> values;
|
|
||||||
* the output array has a total of <code>numSamples</code> values.
|
|
||||||
* The underlying algorithm is used:
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* for(n=0; n<numSamples; n++) {
|
|
||||||
* pDst[n] = sqrt(pSrc[(2*n)+0]^2 + pSrc[(2*n)+1]^2);
|
|
||||||
* }
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* There are separate functions for floating-point, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_mag
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @brief Floating-point complex magnitude.
|
|
||||||
* @param[in] *pSrc points to complex input buffer
|
|
||||||
* @param[out] *pDst points to real output buffer
|
|
||||||
* @param[in] numSamples number of complex samples in the input vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void arm_cmplx_mag_f32(
|
|
||||||
float32_t * pSrc,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
float32_t realIn, imagIn; /* Temporary variables to hold input values */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
realIn = *pSrc++;
|
|
||||||
imagIn = *pSrc++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
arm_sqrt_f32((realIn * realIn) + (imagIn * imagIn), pDst++);
|
|
||||||
|
|
||||||
realIn = *pSrc++;
|
|
||||||
imagIn = *pSrc++;
|
|
||||||
arm_sqrt_f32((realIn * realIn) + (imagIn * imagIn), pDst++);
|
|
||||||
|
|
||||||
realIn = *pSrc++;
|
|
||||||
imagIn = *pSrc++;
|
|
||||||
arm_sqrt_f32((realIn * realIn) + (imagIn * imagIn), pDst++);
|
|
||||||
|
|
||||||
realIn = *pSrc++;
|
|
||||||
imagIn = *pSrc++;
|
|
||||||
arm_sqrt_f32((realIn * realIn) + (imagIn * imagIn), pDst++);
|
|
||||||
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
realIn = *pSrc++;
|
|
||||||
imagIn = *pSrc++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
arm_sqrt_f32((realIn * realIn) + (imagIn * imagIn), pDst++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* out = sqrt((real * real) + (imag * imag)) */
|
|
||||||
realIn = *pSrc++;
|
|
||||||
imagIn = *pSrc++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
arm_sqrt_f32((realIn * realIn) + (imagIn * imagIn), pDst++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_mag group
|
|
||||||
*/
|
|
||||||
-153
@@ -1,153 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mag_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 complex magnitude.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_mag
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q15 complex magnitude
|
|
||||||
* @param *pSrc points to the complex input vector
|
|
||||||
* @param *pDst points to the real output vector
|
|
||||||
* @param numSamples number of complex samples in the input vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function implements 1.15 by 1.15 multiplications and finally output is converted into 2.14 format.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mag_q15(
|
|
||||||
q15_t * pSrc,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
q15_t real, imag; /* Temporary variables to hold input values */
|
|
||||||
q31_t acc0, acc1; /* Accumulators */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = __SMUAD(real, real);
|
|
||||||
acc1 = __SMUAD(imag, imag);
|
|
||||||
/* store the result in 2.14 format in the destination buffer. */
|
|
||||||
arm_sqrt_q15((q15_t) (((q63_t) acc0 + acc1) >> 17), pDst++);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = __SMUAD(real, real);
|
|
||||||
acc1 = __SMUAD(imag, imag);
|
|
||||||
/* store the result in 2.14 format in the destination buffer. */
|
|
||||||
arm_sqrt_q15((q15_t) (((q63_t) acc0 + acc1) >> 17), pDst++);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = __SMUAD(real, real);
|
|
||||||
acc1 = __SMUAD(imag, imag);
|
|
||||||
/* store the result in 2.14 format in the destination buffer. */
|
|
||||||
arm_sqrt_q15((q15_t) (((q63_t) acc0 + acc1) >> 17), pDst++);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = __SMUAD(real, real);
|
|
||||||
acc1 = __SMUAD(imag, imag);
|
|
||||||
/* store the result in 2.14 format in the destination buffer. */
|
|
||||||
arm_sqrt_q15((q15_t) (((q63_t) acc0 + acc1) >> 17), pDst++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = __SMUAD(real, real);
|
|
||||||
acc1 = __SMUAD(imag, imag);
|
|
||||||
/* store the result in 2.14 format in the destination buffer. */
|
|
||||||
arm_sqrt_q15((q15_t) (((q63_t) acc0 + acc1) >> 17), pDst++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* out = sqrt(real * real + imag * imag) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
|
|
||||||
acc0 = (real * real);
|
|
||||||
acc1 = (imag * imag);
|
|
||||||
|
|
||||||
/* store the result in 2.14 format in the destination buffer. */
|
|
||||||
arm_sqrt_q15((q15_t) (((q63_t) acc0 + acc1) >> 17), pDst++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_mag group
|
|
||||||
*/
|
|
||||||
-151
@@ -1,151 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mag_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 complex magnitude
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_mag
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q31 complex magnitude
|
|
||||||
* @param *pSrc points to the complex input vector
|
|
||||||
* @param *pDst points to the real output vector
|
|
||||||
* @param numSamples number of complex samples in the input vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function implements 1.31 by 1.31 multiplications and finally output is converted into 2.30 format.
|
|
||||||
* Input down scaling is not required.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mag_q31(
|
|
||||||
q31_t * pSrc,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
q31_t real, imag; /* Temporary variables to hold input values */
|
|
||||||
q31_t acc0, acc1; /* Accumulators */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 2.30 format in the destination buffer. */
|
|
||||||
arm_sqrt_q31(acc0 + acc1, pDst++);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 2.30 format in the destination buffer. */
|
|
||||||
arm_sqrt_q31(acc0 + acc1, pDst++);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 2.30 format in the destination buffer. */
|
|
||||||
arm_sqrt_q31(acc0 + acc1, pDst++);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 2.30 format in the destination buffer. */
|
|
||||||
arm_sqrt_q31(acc0 + acc1, pDst++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 2.30 format in the destination buffer. */
|
|
||||||
arm_sqrt_q31(acc0 + acc1, pDst++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* out = sqrt((real * real) + (imag * imag)) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 2.30 format in the destination buffer. */
|
|
||||||
arm_sqrt_q31(acc0 + acc1, pDst++);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_mag group
|
|
||||||
*/
|
|
||||||
-155
@@ -1,155 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mag_squared_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point complex magnitude squared.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup cmplx_mag_squared Complex Magnitude Squared
|
|
||||||
*
|
|
||||||
* Computes the magnitude squared of the elements of a complex data vector.
|
|
||||||
*
|
|
||||||
* The <code>pSrc</code> points to the source data and
|
|
||||||
* <code>pDst</code> points to the where the result should be written.
|
|
||||||
* <code>numSamples</code> specifies the number of complex samples
|
|
||||||
* in the input array and the data is stored in an interleaved fashion
|
|
||||||
* (real, imag, real, imag, ...).
|
|
||||||
* The input array has a total of <code>2*numSamples</code> values;
|
|
||||||
* the output array has a total of <code>numSamples</code> values.
|
|
||||||
*
|
|
||||||
* The underlying algorithm is used:
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* for(n=0; n<numSamples; n++) {
|
|
||||||
* pDst[n] = pSrc[(2*n)+0]^2 + pSrc[(2*n)+1]^2;
|
|
||||||
* }
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* There are separate functions for floating-point, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_mag_squared
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Floating-point complex magnitude squared
|
|
||||||
* @param[in] *pSrc points to the complex input vector
|
|
||||||
* @param[out] *pDst points to the real output vector
|
|
||||||
* @param[in] numSamples number of complex samples in the input vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mag_squared_f32(
|
|
||||||
float32_t * pSrc,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
float32_t real, imag; /* Temporary variables to store real and imaginary values */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0] = (A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pDst++ = (real * real) + (imag * imag);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
*pDst++ = (real * real) + (imag * imag);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
*pDst++ = (real * real) + (imag * imag);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
*pDst++ = (real * real) + (imag * imag);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0] = (A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pDst++ = (real * real) + (imag * imag);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* reading real and imaginary values */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
|
|
||||||
/* out = (real * real) + (imag * imag) */
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pDst++ = (real * real) + (imag * imag);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_mag_squared group
|
|
||||||
*/
|
|
||||||
-148
@@ -1,148 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mag_squared_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 complex magnitude squared.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_mag_squared
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q15 complex magnitude squared
|
|
||||||
* @param *pSrc points to the complex input vector
|
|
||||||
* @param *pDst points to the real output vector
|
|
||||||
* @param numSamples number of complex samples in the input vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function implements 1.15 by 1.15 multiplications and finally output is converted into 3.13 format.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mag_squared_q15(
|
|
||||||
q15_t * pSrc,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
q15_t real, imag; /* Temporary variables to store real and imaginary values */
|
|
||||||
q31_t acc0, acc1; /* Accumulators */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
/*loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0] = (A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = __SMUAD(real, real);
|
|
||||||
acc1 = __SMUAD(imag, imag);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) (((q63_t) acc0 + acc1) >> 17);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = __SMUAD(real, real);
|
|
||||||
acc1 = __SMUAD(imag, imag);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) (((q63_t) acc0 + acc1) >> 17);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = __SMUAD(real, real);
|
|
||||||
acc1 = __SMUAD(imag, imag);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) (((q63_t) acc0 + acc1) >> 17);
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = __SMUAD(real, real);
|
|
||||||
acc1 = __SMUAD(imag, imag);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) (((q63_t) acc0 + acc1) >> 17);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0] = (A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = __SMUAD(real, real);
|
|
||||||
acc1 = __SMUAD(imag, imag);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) (((q63_t) acc0 + acc1) >> 17);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* out = ((real * real) + (imag * imag)) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (real * real);
|
|
||||||
acc1 = (imag * imag);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ = (q15_t) (((q63_t) acc0 + acc1) >> 17);
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_mag_squared group
|
|
||||||
*/
|
|
||||||
-150
@@ -1,150 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mag_squared_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 complex magnitude squared.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* ---------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup cmplx_mag_squared
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q31 complex magnitude squared
|
|
||||||
* @param *pSrc points to the complex input vector
|
|
||||||
* @param *pDst points to the real output vector
|
|
||||||
* @param numSamples number of complex samples in the input vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function implements 1.31 by 1.31 multiplications and finally output is converted into 3.29 format.
|
|
||||||
* Input down scaling is not required.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mag_squared_q31(
|
|
||||||
q31_t * pSrc,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
q31_t real, imag; /* Temporary variables to store real and imaginary values */
|
|
||||||
q31_t acc0, acc1; /* Accumulators */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counter */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0] = (A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = acc0 + acc1;
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = acc0 + acc1;
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = acc0 + acc1;
|
|
||||||
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = acc0 + acc1;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[0] = (A[0] * A[0] + A[1] * A[1]) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = acc0 + acc1;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* out = ((real * real) + (imag * imag)) */
|
|
||||||
real = *pSrc++;
|
|
||||||
imag = *pSrc++;
|
|
||||||
acc0 = (q31_t) (((q63_t) real * real) >> 33);
|
|
||||||
acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = acc0 + acc1;
|
|
||||||
|
|
||||||
/* Decrement the loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of cmplx_mag_squared group
|
|
||||||
*/
|
|
||||||
-180
@@ -1,180 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mult_cmplx_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point complex-by-complex multiplication
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup CmplxByCmplxMult Complex-by-Complex Multiplication
|
|
||||||
*
|
|
||||||
* Multiplies a complex vector by another complex vector and generates a complex result.
|
|
||||||
* The data in the complex arrays is stored in an interleaved fashion
|
|
||||||
* (real, imag, real, imag, ...).
|
|
||||||
* The parameter <code>numSamples</code> represents the number of complex
|
|
||||||
* samples processed. The complex arrays have a total of <code>2*numSamples</code>
|
|
||||||
* real values.
|
|
||||||
*
|
|
||||||
* The underlying algorithm is used:
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* for(n=0; n<numSamples; n++) {
|
|
||||||
* pDst[(2*n)+0] = pSrcA[(2*n)+0] * pSrcB[(2*n)+0] - pSrcA[(2*n)+1] * pSrcB[(2*n)+1];
|
|
||||||
* pDst[(2*n)+1] = pSrcA[(2*n)+0] * pSrcB[(2*n)+1] + pSrcA[(2*n)+1] * pSrcB[(2*n)+0];
|
|
||||||
* }
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* There are separate functions for floating-point, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup CmplxByCmplxMult
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Floating-point complex-by-complex multiplication
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] numSamples number of complex samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mult_cmplx_f32(
|
|
||||||
float32_t * pSrcA,
|
|
||||||
float32_t * pSrcB,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
float32_t a, b, c, d; /* Temporary variables to store real and imaginary values */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counters */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i]. */
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pDst++ = (a * c) - (b * d);
|
|
||||||
*pDst++ = (a * d) + (b * c);
|
|
||||||
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
*pDst++ = (a * c) - (b * d);
|
|
||||||
*pDst++ = (a * d) + (b * c);
|
|
||||||
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
*pDst++ = (a * c) - (b * d);
|
|
||||||
*pDst++ = (a * d) + (b * c);
|
|
||||||
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
*pDst++ = (a * c) - (b * d);
|
|
||||||
*pDst++ = (a * d) + (b * c);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i]. */
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pDst++ = (a * c) - (b * d);
|
|
||||||
*pDst++ = (a * d) + (b * c);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i]. */
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pDst++ = (a * c) - (b * d);
|
|
||||||
*pDst++ = (a * d) + (b * c);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of CmplxByCmplxMult group
|
|
||||||
*/
|
|
||||||
-182
@@ -1,182 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mult_cmplx_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 complex-by-complex multiplication
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup CmplxByCmplxMult
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q15 complex-by-complex multiplication
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] numSamples number of complex samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function implements 1.15 by 1.15 multiplications and finally output is converted into 3.13 format.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mult_cmplx_q15(
|
|
||||||
q15_t * pSrcA,
|
|
||||||
q15_t * pSrcB,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
q15_t a, b, c, d; /* Temporary variables to store real and imaginary values */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counters */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i]. */
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17);
|
|
||||||
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17);
|
|
||||||
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17);
|
|
||||||
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i]. */
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i]. */
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17);
|
|
||||||
/* store the result in 3.13 format in the destination buffer. */
|
|
||||||
*pDst++ =
|
|
||||||
(q15_t) (q31_t) (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17);
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of CmplxByCmplxMult group
|
|
||||||
*/
|
|
||||||
-209
@@ -1,209 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mult_cmplx_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 complex-by-complex multiplication
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup CmplxByCmplxMult
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q31 complex-by-complex multiplication
|
|
||||||
* @param[in] *pSrcA points to the first input vector
|
|
||||||
* @param[in] *pSrcB points to the second input vector
|
|
||||||
* @param[out] *pDst points to the output vector
|
|
||||||
* @param[in] numSamples number of complex samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function implements 1.31 by 1.31 multiplications and finally output is converted into 3.29 format.
|
|
||||||
* Input down scaling is not required.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mult_cmplx_q31(
|
|
||||||
q31_t * pSrcA,
|
|
||||||
q31_t * pSrcB,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
q31_t a, b, c, d; /* Temporary variables to store real and imaginary values */
|
|
||||||
uint32_t blkCnt; /* loop counters */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i]. */
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the real result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33));
|
|
||||||
/* store the imag result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33));
|
|
||||||
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33));
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33));
|
|
||||||
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33));
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33));
|
|
||||||
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33));
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33));
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i]. */
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33));
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33));
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 1u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 2 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 sample. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i]. */
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the real result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33));
|
|
||||||
/* store the imag result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33));
|
|
||||||
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33));
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33));
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the blockSize is not a multiple of 2, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x2u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i]. */
|
|
||||||
a = *pSrcA++;
|
|
||||||
b = *pSrcA++;
|
|
||||||
c = *pSrcB++;
|
|
||||||
d = *pSrcB++;
|
|
||||||
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33));
|
|
||||||
/* store the result in 3.29 format in the destination buffer. */
|
|
||||||
*pDst++ = (q31_t) ((((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33));
|
|
||||||
|
|
||||||
/* Decrement the blockSize loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of CmplxByCmplxMult group
|
|
||||||
*/
|
|
||||||
-157
@@ -1,157 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mult_real_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point complex by real multiplication
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup CmplxByRealMult Complex-by-Real Multiplication
|
|
||||||
*
|
|
||||||
* Multiplies a complex vector by a real vector and generates a complex result.
|
|
||||||
* The data in the complex arrays is stored in an interleaved fashion
|
|
||||||
* (real, imag, real, imag, ...).
|
|
||||||
* The parameter <code>numSamples</code> represents the number of complex
|
|
||||||
* samples processed. The complex arrays have a total of <code>2*numSamples</code>
|
|
||||||
* real values while the real array has a total of <code>numSamples</code>
|
|
||||||
* real values.
|
|
||||||
*
|
|
||||||
* The underlying algorithm is used:
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* for(n=0; n<numSamples; n++) {
|
|
||||||
* pCmplxDst[(2*n)+0] = pSrcCmplx[(2*n)+0] * pSrcReal[n];
|
|
||||||
* pCmplxDst[(2*n)+1] = pSrcCmplx[(2*n)+1] * pSrcReal[n];
|
|
||||||
* }
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* There are separate functions for floating-point, Q15, and Q31 data types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup CmplxByRealMult
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Floating-point complex-by-real multiplication
|
|
||||||
* @param[in] *pSrcCmplx points to the complex input vector
|
|
||||||
* @param[in] *pSrcReal points to the real input vector
|
|
||||||
* @param[out] *pCmplxDst points to the complex output vector
|
|
||||||
* @param[in] numSamples number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mult_real_f32(
|
|
||||||
float32_t * pSrcCmplx,
|
|
||||||
float32_t * pSrcReal,
|
|
||||||
float32_t * pCmplxDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
float32_t in; /* Temporary variable to store input value */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counters */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[i]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i + 1] * B[i]. */
|
|
||||||
in = *pSrcReal++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
|
|
||||||
in = *pSrcReal++;
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
|
|
||||||
in = *pSrcReal++;
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
|
|
||||||
in = *pSrcReal++;
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[i]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i + 1] * B[i]. */
|
|
||||||
in = *pSrcReal++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* realOut = realA * realB. */
|
|
||||||
/* imagOut = imagA * realB. */
|
|
||||||
in = *pSrcReal++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
*pCmplxDst++ = (*pSrcCmplx++) * (in);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of CmplxByRealMult group
|
|
||||||
*/
|
|
||||||
-151
@@ -1,151 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mult_real_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 complex by real multiplication
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup CmplxByRealMult
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q15 complex-by-real multiplication
|
|
||||||
* @param[in] *pSrcCmplx points to the complex input vector
|
|
||||||
* @param[in] *pSrcReal points to the real input vector
|
|
||||||
* @param[out] *pCmplxDst points to the complex output vector
|
|
||||||
* @param[in] numSamples number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q15 range [0x8000 0x7FFF] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mult_real_q15(
|
|
||||||
q15_t * pSrcCmplx,
|
|
||||||
q15_t * pSrcReal,
|
|
||||||
q15_t * pCmplxDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
q15_t in; /* Temporary variable to store input value */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counters */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[i]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i + 1] * B[i]. */
|
|
||||||
in = *pSrcReal++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
|
|
||||||
in = *pSrcReal++;
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
|
|
||||||
in = *pSrcReal++;
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
|
|
||||||
in = *pSrcReal++;
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[i]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i + 1] * B[i]. */
|
|
||||||
in = *pSrcReal++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* realOut = realA * realB. */
|
|
||||||
/* imagOut = imagA * realB. */
|
|
||||||
in = *pSrcReal++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of CmplxByRealMult group
|
|
||||||
*/
|
|
||||||
-151
@@ -1,151 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_cmplx_mult_real_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 complex by real multiplication
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupCmplxMath
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup CmplxByRealMult
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Q31 complex-by-real multiplication
|
|
||||||
* @param[in] *pSrcCmplx points to the complex input vector
|
|
||||||
* @param[in] *pSrcReal points to the real input vector
|
|
||||||
* @param[out] *pCmplxDst points to the complex output vector
|
|
||||||
* @param[in] numSamples number of samples in each vector
|
|
||||||
* @return none.
|
|
||||||
*
|
|
||||||
* <b>Scaling and Overflow Behavior:</b>
|
|
||||||
* \par
|
|
||||||
* The function uses saturating arithmetic.
|
|
||||||
* Results outside of the allowable Q31 range[0x80000000 0x7FFFFFFF] will be saturated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_cmplx_mult_real_q31(
|
|
||||||
q31_t * pSrcCmplx,
|
|
||||||
q31_t * pSrcReal,
|
|
||||||
q31_t * pCmplxDst,
|
|
||||||
uint32_t numSamples)
|
|
||||||
{
|
|
||||||
q31_t in; /* Temporary variable to store input value */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
uint32_t blkCnt; /* loop counters */
|
|
||||||
|
|
||||||
/* loop Unrolling */
|
|
||||||
blkCnt = numSamples >> 2u;
|
|
||||||
|
|
||||||
/* First part of the processing with loop unrolling. Compute 4 outputs at a time.
|
|
||||||
** a second loop below computes the remaining 1 to 3 samples. */
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[i]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i + 1] * B[i]. */
|
|
||||||
in = *pSrcReal++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
|
|
||||||
in = *pSrcReal++;
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
|
|
||||||
in = *pSrcReal++;
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
|
|
||||||
in = *pSrcReal++;
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the numSamples is not a multiple of 4, compute any remaining output samples here.
|
|
||||||
** No loop unrolling is used. */
|
|
||||||
blkCnt = numSamples % 0x4u;
|
|
||||||
|
|
||||||
while(blkCnt > 0u)
|
|
||||||
{
|
|
||||||
/* C[2 * i] = A[2 * i] * B[i]. */
|
|
||||||
/* C[2 * i + 1] = A[2 * i + 1] * B[i]. */
|
|
||||||
in = *pSrcReal++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
blkCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
while(numSamples > 0u)
|
|
||||||
{
|
|
||||||
/* realOut = realA * realB. */
|
|
||||||
/* imagReal = imagA * realB. */
|
|
||||||
in = *pSrcReal++;
|
|
||||||
/* store the result in the destination buffer. */
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
*pCmplxDst++ =
|
|
||||||
(q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * in) >> 31);
|
|
||||||
|
|
||||||
/* Decrement the numSamples loop counter */
|
|
||||||
numSamples--;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of CmplxByRealMult group
|
|
||||||
*/
|
|
||||||
-76
@@ -1,76 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_pid_init_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point PID Control initialization function
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* ------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup PID
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Initialization function for the floating-point PID Control.
|
|
||||||
* @param[in,out] *S points to an instance of the PID structure.
|
|
||||||
* @param[in] resetStateFlag flag to reset the state. 0 = no change in state & 1 = reset the state.
|
|
||||||
* @return none.
|
|
||||||
* \par Description:
|
|
||||||
* \par
|
|
||||||
* The <code>resetStateFlag</code> specifies whether to set state to zero or not. \n
|
|
||||||
* The function computes the structure fields: <code>A0</code>, <code>A1</code> <code>A2</code>
|
|
||||||
* using the proportional gain( \c Kp), integral gain( \c Ki) and derivative gain( \c Kd)
|
|
||||||
* also sets the state variables to all zeros.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_pid_init_f32(
|
|
||||||
arm_pid_instance_f32 * S,
|
|
||||||
int32_t resetStateFlag)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* Derived coefficient A0 */
|
|
||||||
S->A0 = S->Kp + S->Ki + S->Kd;
|
|
||||||
|
|
||||||
/* Derived coefficient A1 */
|
|
||||||
S->A1 = (-S->Kp) - ((float32_t) 2.0 * S->Kd);
|
|
||||||
|
|
||||||
/* Derived coefficient A2 */
|
|
||||||
S->A2 = S->Kd;
|
|
||||||
|
|
||||||
/* Check whether state needs reset or not */
|
|
||||||
if(resetStateFlag)
|
|
||||||
{
|
|
||||||
/* Clear the state buffer. The size will be always 3 samples */
|
|
||||||
memset(S->state, 0, 3u * sizeof(float32_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of PID group
|
|
||||||
*/
|
|
||||||
-111
@@ -1,111 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_pid_init_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 PID Control initialization function
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup PID
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @details
|
|
||||||
* @param[in,out] *S points to an instance of the Q15 PID structure.
|
|
||||||
* @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state.
|
|
||||||
* @return none.
|
|
||||||
* \par Description:
|
|
||||||
* \par
|
|
||||||
* The <code>resetStateFlag</code> specifies whether to set state to zero or not. \n
|
|
||||||
* The function computes the structure fields: <code>A0</code>, <code>A1</code> <code>A2</code>
|
|
||||||
* using the proportional gain( \c Kp), integral gain( \c Ki) and derivative gain( \c Kd)
|
|
||||||
* also sets the state variables to all zeros.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_pid_init_q15(
|
|
||||||
arm_pid_instance_q15 * S,
|
|
||||||
int32_t resetStateFlag)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/* Derived coefficient A0 */
|
|
||||||
S->A0 = __QADD16(__QADD16(S->Kp, S->Ki), S->Kd);
|
|
||||||
|
|
||||||
/* Derived coefficients and pack into A1 */
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
|
||||||
|
|
||||||
S->A1 = __PKHBT(-__QADD16(__QADD16(S->Kd, S->Kd), S->Kp), S->Kd, 16);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
S->A1 = __PKHBT(S->Kd, -__QADD16(__QADD16(S->Kd, S->Kd), S->Kp), 16);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
|
||||||
|
|
||||||
/* Check whether state needs reset or not */
|
|
||||||
if(resetStateFlag)
|
|
||||||
{
|
|
||||||
/* Clear the state buffer. The size will be always 3 samples */
|
|
||||||
memset(S->state, 0, 3u * sizeof(q15_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
q31_t temp; /*to store the sum */
|
|
||||||
|
|
||||||
/* Derived coefficient A0 */
|
|
||||||
temp = S->Kp + S->Ki + S->Kd;
|
|
||||||
S->A0 = (q15_t) __SSAT(temp, 16);
|
|
||||||
|
|
||||||
/* Derived coefficients and pack into A1 */
|
|
||||||
temp = -(S->Kd + S->Kd + S->Kp);
|
|
||||||
S->A1 = (q15_t) __SSAT(temp, 16);
|
|
||||||
S->A2 = S->Kd;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Check whether state needs reset or not */
|
|
||||||
if(resetStateFlag)
|
|
||||||
{
|
|
||||||
/* Clear the state buffer. The size will be always 3 samples */
|
|
||||||
memset(S->state, 0, 3u * sizeof(q15_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of PID group
|
|
||||||
*/
|
|
||||||
-96
@@ -1,96 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_pid_init_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 PID Control initialization function
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* ------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup PID
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Initialization function for the Q31 PID Control.
|
|
||||||
* @param[in,out] *S points to an instance of the Q31 PID structure.
|
|
||||||
* @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state.
|
|
||||||
* @return none.
|
|
||||||
* \par Description:
|
|
||||||
* \par
|
|
||||||
* The <code>resetStateFlag</code> specifies whether to set state to zero or not. \n
|
|
||||||
* The function computes the structure fields: <code>A0</code>, <code>A1</code> <code>A2</code>
|
|
||||||
* using the proportional gain( \c Kp), integral gain( \c Ki) and derivative gain( \c Kd)
|
|
||||||
* also sets the state variables to all zeros.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void arm_pid_init_q31(
|
|
||||||
arm_pid_instance_q31 * S,
|
|
||||||
int32_t resetStateFlag)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifndef ARM_MATH_CM0
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M4 and Cortex-M3 */
|
|
||||||
|
|
||||||
/* Derived coefficient A0 */
|
|
||||||
S->A0 = __QADD(__QADD(S->Kp, S->Ki), S->Kd);
|
|
||||||
|
|
||||||
/* Derived coefficient A1 */
|
|
||||||
S->A1 = -__QADD(__QADD(S->Kd, S->Kd), S->Kp);
|
|
||||||
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Run the below code for Cortex-M0 */
|
|
||||||
|
|
||||||
q31_t temp;
|
|
||||||
|
|
||||||
/* Derived coefficient A0 */
|
|
||||||
temp = clip_q63_to_q31((q63_t) S->Kp + S->Ki);
|
|
||||||
S->A0 = clip_q63_to_q31((q63_t) temp + S->Kd);
|
|
||||||
|
|
||||||
/* Derived coefficient A1 */
|
|
||||||
temp = clip_q63_to_q31((q63_t) S->Kd + S->Kd);
|
|
||||||
S->A1 = -clip_q63_to_q31((q63_t) temp + S->Kp);
|
|
||||||
|
|
||||||
#endif /* #ifndef ARM_MATH_CM0 */
|
|
||||||
|
|
||||||
/* Derived coefficient A2 */
|
|
||||||
S->A2 = S->Kd;
|
|
||||||
|
|
||||||
/* Check whether state needs reset or not */
|
|
||||||
if(resetStateFlag)
|
|
||||||
{
|
|
||||||
/* Clear the state buffer. The size will be always 3 samples */
|
|
||||||
memset(S->state, 0, 3u * sizeof(q31_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of PID group
|
|
||||||
*/
|
|
||||||
-54
@@ -1,54 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_pid_reset_f32.c
|
|
||||||
*
|
|
||||||
* Description: Floating-point PID Control reset function
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* ------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup PID
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Reset function for the floating-point PID Control.
|
|
||||||
* @param[in] *S Instance pointer of PID control data structure.
|
|
||||||
* @return none.
|
|
||||||
* \par Description:
|
|
||||||
* The function resets the state buffer to zeros.
|
|
||||||
*/
|
|
||||||
void arm_pid_reset_f32(
|
|
||||||
arm_pid_instance_f32 * S)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* Clear the state buffer. The size will be always 3 samples */
|
|
||||||
memset(S->state, 0, 3u * sizeof(float32_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of PID group
|
|
||||||
*/
|
|
||||||
-53
@@ -1,53 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_pid_reset_q15.c
|
|
||||||
*
|
|
||||||
* Description: Q15 PID Control reset function
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup PID
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Reset function for the Q15 PID Control.
|
|
||||||
* @param[in] *S Instance pointer of PID control data structure.
|
|
||||||
* @return none.
|
|
||||||
* \par Description:
|
|
||||||
* The function resets the state buffer to zeros.
|
|
||||||
*/
|
|
||||||
void arm_pid_reset_q15(
|
|
||||||
arm_pid_instance_q15 * S)
|
|
||||||
{
|
|
||||||
/* Reset state to zero, The size will be always 3 samples */
|
|
||||||
memset(S->state, 0, 3u * sizeof(q15_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of PID group
|
|
||||||
*/
|
|
||||||
-54
@@ -1,54 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_pid_reset_q31.c
|
|
||||||
*
|
|
||||||
* Description: Q31 PID Control reset function
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* ------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup PID
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Reset function for the Q31 PID Control.
|
|
||||||
* @param[in] *S Instance pointer of PID control data structure.
|
|
||||||
* @return none.
|
|
||||||
* \par Description:
|
|
||||||
* The function resets the state buffer to zeros.
|
|
||||||
*/
|
|
||||||
void arm_pid_reset_q31(
|
|
||||||
arm_pid_instance_q31 * S)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* Clear the state buffer. The size will be always 3 samples */
|
|
||||||
memset(S->state, 0, 3u * sizeof(q31_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of PID group
|
|
||||||
*/
|
|
||||||
-408
@@ -1,408 +0,0 @@
|
|||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 15. July 2011
|
|
||||||
* $Revision: V1.0.10
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_sin_cos_f32.c
|
|
||||||
*
|
|
||||||
* Description: Sine and Cosine calculation for floating-point values.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
|
|
||||||
*
|
|
||||||
* Version 1.0.10 2011/7/15
|
|
||||||
* Big Endian support added and Merged M0 and M3/M4 Source code.
|
|
||||||
*
|
|
||||||
* Version 1.0.3 2010/11/29
|
|
||||||
* Re-organized the CMSIS folders and updated documentation.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup groupController
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup SinCos Sine Cosine
|
|
||||||
*
|
|
||||||
* Computes the trigonometric sine and cosine values using a combination of table lookup
|
|
||||||
* and linear interpolation.
|
|
||||||
* There are separate functions for Q31 and floating-point data types.
|
|
||||||
* The input to the floating-point version is in degrees while the
|
|
||||||
* fixed-point Q31 have a scaled input with the range
|
|
||||||
* [-1 1) mapping to [-180 180) degrees.
|
|
||||||
*
|
|
||||||
* The implementation is based on table lookup using 360 values together with linear interpolation.
|
|
||||||
* The steps used are:
|
|
||||||
* -# Calculation of the nearest integer table index.
|
|
||||||
* -# Compute the fractional portion (fract) of the input.
|
|
||||||
* -# Fetch the value corresponding to \c index from sine table to \c y0 and also value from \c index+1 to \c y1.
|
|
||||||
* -# Sine value is computed as <code> *psinVal = y0 + (fract * (y1 - y0))</code>.
|
|
||||||
* -# Fetch the value corresponding to \c index from cosine table to \c y0 and also value from \c index+1 to \c y1.
|
|
||||||
* -# Cosine value is computed as <code> *pcosVal = y0 + (fract * (y1 - y0))</code>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup SinCos
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \par
|
|
||||||
* Cosine Table is generated from following loop
|
|
||||||
* <pre>for(i = 0; i < 360; i++)
|
|
||||||
* {
|
|
||||||
* cosTable[i]= cos((i-180) * PI/180.0);
|
|
||||||
* } </pre>
|
|
||||||
*/
|
|
||||||
|
|
||||||
static const float32_t cosTable[360] = {
|
|
||||||
-0.999847695156391270f, -0.999390827019095760f, -0.998629534754573830f,
|
|
||||||
-0.997564050259824200f, -0.996194698091745550f, -0.994521895368273290f,
|
|
||||||
-0.992546151641321980f, -0.990268068741570250f,
|
|
||||||
-0.987688340595137660f, -0.984807753012208020f, -0.981627183447663980f,
|
|
||||||
-0.978147600733805690f, -0.974370064785235250f, -0.970295726275996470f,
|
|
||||||
-0.965925826289068200f, -0.961261695938318670f,
|
|
||||||
-0.956304755963035440f, -0.951056516295153530f, -0.945518575599316740f,
|
|
||||||
-0.939692620785908320f, -0.933580426497201740f, -0.927183854566787310f,
|
|
||||||
-0.920504853452440150f, -0.913545457642600760f,
|
|
||||||
-0.906307787036649940f, -0.898794046299167040f, -0.891006524188367790f,
|
|
||||||
-0.882947592858926770f, -0.874619707139395740f, -0.866025403784438710f,
|
|
||||||
-0.857167300702112220f, -0.848048096156425960f,
|
|
||||||
-0.838670567945424160f, -0.829037572555041620f, -0.819152044288991580f,
|
|
||||||
-0.809016994374947340f, -0.798635510047292940f, -0.788010753606721900f,
|
|
||||||
-0.777145961456970680f, -0.766044443118977900f,
|
|
||||||
-0.754709580222772010f, -0.743144825477394130f, -0.731353701619170460f,
|
|
||||||
-0.719339800338651300f, -0.707106781186547460f, -0.694658370458997030f,
|
|
||||||
-0.681998360062498370f, -0.669130606358858240f,
|
|
||||||
-0.656059028990507500f, -0.642787609686539360f, -0.629320391049837280f,
|
|
||||||
-0.615661475325658290f, -0.601815023152048380f, -0.587785252292473030f,
|
|
||||||
-0.573576436351045830f, -0.559192903470746680f,
|
|
||||||
-0.544639035015027080f, -0.529919264233204790f, -0.515038074910054270f,
|
|
||||||
-0.499999999999999780f, -0.484809620246337000f, -0.469471562785890530f,
|
|
||||||
-0.453990499739546750f, -0.438371146789077510f,
|
|
||||||
-0.422618261740699330f, -0.406736643075800100f, -0.390731128489273600f,
|
|
||||||
-0.374606593415912070f, -0.358367949545300270f, -0.342020143325668710f,
|
|
||||||
-0.325568154457156420f, -0.309016994374947340f,
|
|
||||||
-0.292371704722736660f, -0.275637355816999050f, -0.258819045102520850f,
|
|
||||||
-0.241921895599667790f, -0.224951054343864810f, -0.207911690817759120f,
|
|
||||||
-0.190808995376544800f, -0.173648177666930300f,
|
|
||||||
-0.156434465040231040f, -0.139173100960065350f, -0.121869343405147370f,
|
|
||||||
-0.104528463267653330f, -0.087155742747658235f, -0.069756473744125330f,
|
|
||||||
-0.052335956242943620f, -0.034899496702500733f,
|
|
||||||
-0.017452406437283477f, 0.000000000000000061f, 0.017452406437283376f,
|
|
||||||
0.034899496702501080f, 0.052335956242943966f, 0.069756473744125455f,
|
|
||||||
0.087155742747658138f, 0.104528463267653460f,
|
|
||||||
0.121869343405147490f, 0.139173100960065690f, 0.156434465040230920f,
|
|
||||||
0.173648177666930410f, 0.190808995376544920f, 0.207911690817759450f,
|
|
||||||
0.224951054343864920f, 0.241921895599667900f,
|
|
||||||
0.258819045102520740f, 0.275637355816999160f, 0.292371704722736770f,
|
|
||||||
0.309016994374947450f, 0.325568154457156760f, 0.342020143325668820f,
|
|
||||||
0.358367949545300380f, 0.374606593415911960f,
|
|
||||||
0.390731128489273940f, 0.406736643075800210f, 0.422618261740699440f,
|
|
||||||
0.438371146789077460f, 0.453990499739546860f, 0.469471562785890860f,
|
|
||||||
0.484809620246337110f, 0.500000000000000110f,
|
|
||||||
0.515038074910054380f, 0.529919264233204900f, 0.544639035015027200f,
|
|
||||||
0.559192903470746790f, 0.573576436351046050f, 0.587785252292473140f,
|
|
||||||
0.601815023152048270f, 0.615661475325658290f,
|
|
||||||
0.629320391049837500f, 0.642787609686539360f, 0.656059028990507280f,
|
|
||||||
0.669130606358858240f, 0.681998360062498480f, 0.694658370458997370f,
|
|
||||||
0.707106781186547570f, 0.719339800338651190f,
|
|
||||||
0.731353701619170570f, 0.743144825477394240f, 0.754709580222772010f,
|
|
||||||
0.766044443118978010f, 0.777145961456970900f, 0.788010753606722010f,
|
|
||||||
0.798635510047292830f, 0.809016994374947450f,
|
|
||||||
0.819152044288991800f, 0.829037572555041620f, 0.838670567945424050f,
|
|
||||||
0.848048096156425960f, 0.857167300702112330f, 0.866025403784438710f,
|
|
||||||
0.874619707139395740f, 0.882947592858926990f,
|
|
||||||
0.891006524188367900f, 0.898794046299167040f, 0.906307787036649940f,
|
|
||||||
0.913545457642600870f, 0.920504853452440370f, 0.927183854566787420f,
|
|
||||||
0.933580426497201740f, 0.939692620785908430f,
|
|
||||||
0.945518575599316850f, 0.951056516295153530f, 0.956304755963035440f,
|
|
||||||
0.961261695938318890f, 0.965925826289068310f, 0.970295726275996470f,
|
|
||||||
0.974370064785235250f, 0.978147600733805690f,
|
|
||||||
0.981627183447663980f, 0.984807753012208020f, 0.987688340595137770f,
|
|
||||||
0.990268068741570360f, 0.992546151641321980f, 0.994521895368273290f,
|
|
||||||
0.996194698091745550f, 0.997564050259824200f,
|
|
||||||
0.998629534754573830f, 0.999390827019095760f, 0.999847695156391270f,
|
|
||||||
1.000000000000000000f, 0.999847695156391270f, 0.999390827019095760f,
|
|
||||||
0.998629534754573830f, 0.997564050259824200f,
|
|
||||||
0.996194698091745550f, 0.994521895368273290f, 0.992546151641321980f,
|
|
||||||
0.990268068741570360f, 0.987688340595137770f, 0.984807753012208020f,
|
|
||||||
0.981627183447663980f, 0.978147600733805690f,
|
|
||||||
0.974370064785235250f, 0.970295726275996470f, 0.965925826289068310f,
|
|
||||||
0.961261695938318890f, 0.956304755963035440f, 0.951056516295153530f,
|
|
||||||
0.945518575599316850f, 0.939692620785908430f,
|
|
||||||
0.933580426497201740f, 0.927183854566787420f, 0.920504853452440370f,
|
|
||||||
0.913545457642600870f, 0.906307787036649940f, 0.898794046299167040f,
|
|
||||||
0.891006524188367900f, 0.882947592858926990f,
|
|
||||||
0.874619707139395740f, 0.866025403784438710f, 0.857167300702112330f,
|
|
||||||
0.848048096156425960f, 0.838670567945424050f, 0.829037572555041620f,
|
|
||||||
0.819152044288991800f, 0.809016994374947450f,
|
|
||||||
0.798635510047292830f, 0.788010753606722010f, 0.777145961456970900f,
|
|
||||||
0.766044443118978010f, 0.754709580222772010f, 0.743144825477394240f,
|
|
||||||
0.731353701619170570f, 0.719339800338651190f,
|
|
||||||
0.707106781186547570f, 0.694658370458997370f, 0.681998360062498480f,
|
|
||||||
0.669130606358858240f, 0.656059028990507280f, 0.642787609686539360f,
|
|
||||||
0.629320391049837500f, 0.615661475325658290f,
|
|
||||||
0.601815023152048270f, 0.587785252292473140f, 0.573576436351046050f,
|
|
||||||
0.559192903470746790f, 0.544639035015027200f, 0.529919264233204900f,
|
|
||||||
0.515038074910054380f, 0.500000000000000110f,
|
|
||||||
0.484809620246337110f, 0.469471562785890860f, 0.453990499739546860f,
|
|
||||||
0.438371146789077460f, 0.422618261740699440f, 0.406736643075800210f,
|
|
||||||
0.390731128489273940f, 0.374606593415911960f,
|
|
||||||
0.358367949545300380f, 0.342020143325668820f, 0.325568154457156760f,
|
|
||||||
0.309016994374947450f, 0.292371704722736770f, 0.275637355816999160f,
|
|
||||||
0.258819045102520740f, 0.241921895599667900f,
|
|
||||||
0.224951054343864920f, 0.207911690817759450f, 0.190808995376544920f,
|
|
||||||
0.173648177666930410f, 0.156434465040230920f, 0.139173100960065690f,
|
|
||||||
0.121869343405147490f, 0.104528463267653460f,
|
|
||||||
0.087155742747658138f, 0.069756473744125455f, 0.052335956242943966f,
|
|
||||||
0.034899496702501080f, 0.017452406437283376f, 0.000000000000000061f,
|
|
||||||
-0.017452406437283477f, -0.034899496702500733f,
|
|
||||||
-0.052335956242943620f, -0.069756473744125330f, -0.087155742747658235f,
|
|
||||||
-0.104528463267653330f, -0.121869343405147370f, -0.139173100960065350f,
|
|
||||||
-0.156434465040231040f, -0.173648177666930300f,
|
|
||||||
-0.190808995376544800f, -0.207911690817759120f, -0.224951054343864810f,
|
|
||||||
-0.241921895599667790f, -0.258819045102520850f, -0.275637355816999050f,
|
|
||||||
-0.292371704722736660f, -0.309016994374947340f,
|
|
||||||
-0.325568154457156420f, -0.342020143325668710f, -0.358367949545300270f,
|
|
||||||
-0.374606593415912070f, -0.390731128489273600f, -0.406736643075800100f,
|
|
||||||
-0.422618261740699330f, -0.438371146789077510f,
|
|
||||||
-0.453990499739546750f, -0.469471562785890530f, -0.484809620246337000f,
|
|
||||||
-0.499999999999999780f, -0.515038074910054270f, -0.529919264233204790f,
|
|
||||||
-0.544639035015027080f, -0.559192903470746680f,
|
|
||||||
-0.573576436351045830f, -0.587785252292473030f, -0.601815023152048380f,
|
|
||||||
-0.615661475325658290f, -0.629320391049837280f, -0.642787609686539360f,
|
|
||||||
-0.656059028990507500f, -0.669130606358858240f,
|
|
||||||
-0.681998360062498370f, -0.694658370458997030f, -0.707106781186547460f,
|
|
||||||
-0.719339800338651300f, -0.731353701619170460f, -0.743144825477394130f,
|
|
||||||
-0.754709580222772010f, -0.766044443118977900f,
|
|
||||||
-0.777145961456970680f, -0.788010753606721900f, -0.798635510047292940f,
|
|
||||||
-0.809016994374947340f, -0.819152044288991580f, -0.829037572555041620f,
|
|
||||||
-0.838670567945424160f, -0.848048096156425960f,
|
|
||||||
-0.857167300702112220f, -0.866025403784438710f, -0.874619707139395740f,
|
|
||||||
-0.882947592858926770f, -0.891006524188367790f, -0.898794046299167040f,
|
|
||||||
-0.906307787036649940f, -0.913545457642600760f,
|
|
||||||
-0.920504853452440150f, -0.927183854566787310f, -0.933580426497201740f,
|
|
||||||
-0.939692620785908320f, -0.945518575599316740f, -0.951056516295153530f,
|
|
||||||
-0.956304755963035440f, -0.961261695938318670f,
|
|
||||||
-0.965925826289068200f, -0.970295726275996470f, -0.974370064785235250f,
|
|
||||||
-0.978147600733805690f, -0.981627183447663980f, -0.984807753012208020f,
|
|
||||||
-0.987688340595137660f, -0.990268068741570250f,
|
|
||||||
-0.992546151641321980f, -0.994521895368273290f, -0.996194698091745550f,
|
|
||||||
-0.997564050259824200f, -0.998629534754573830f, -0.999390827019095760f,
|
|
||||||
-0.999847695156391270f, -1.000000000000000000f
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \par
|
|
||||||
* Sine Table is generated from following loop
|
|
||||||
* <pre>for(i = 0; i < 360; i++)
|
|
||||||
* {
|
|
||||||
* sinTable[i]= sin((i-180) * PI/180.0);
|
|
||||||
* } </pre>
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
static const float32_t sinTable[360] = {
|
|
||||||
-0.017452406437283439f, -0.034899496702500699f, -0.052335956242943807f,
|
|
||||||
-0.069756473744125524f, -0.087155742747658638f, -0.104528463267653730f,
|
|
||||||
-0.121869343405147550f, -0.139173100960065740f,
|
|
||||||
-0.156434465040230980f, -0.173648177666930280f, -0.190808995376544970f,
|
|
||||||
-0.207911690817759310f, -0.224951054343864780f, -0.241921895599667730f,
|
|
||||||
-0.258819045102521020f, -0.275637355816999660f,
|
|
||||||
-0.292371704722737050f, -0.309016994374947510f, -0.325568154457156980f,
|
|
||||||
-0.342020143325668880f, -0.358367949545300210f, -0.374606593415912240f,
|
|
||||||
-0.390731128489274160f, -0.406736643075800430f,
|
|
||||||
-0.422618261740699500f, -0.438371146789077290f, -0.453990499739546860f,
|
|
||||||
-0.469471562785891080f, -0.484809620246337170f, -0.499999999999999940f,
|
|
||||||
-0.515038074910054380f, -0.529919264233204900f,
|
|
||||||
-0.544639035015026860f, -0.559192903470746900f, -0.573576436351046380f,
|
|
||||||
-0.587785252292473250f, -0.601815023152048160f, -0.615661475325658400f,
|
|
||||||
-0.629320391049837720f, -0.642787609686539470f,
|
|
||||||
-0.656059028990507280f, -0.669130606358858350f, -0.681998360062498590f,
|
|
||||||
-0.694658370458997140f, -0.707106781186547570f, -0.719339800338651410f,
|
|
||||||
-0.731353701619170570f, -0.743144825477394240f,
|
|
||||||
-0.754709580222771790f, -0.766044443118978010f, -0.777145961456971010f,
|
|
||||||
-0.788010753606722010f, -0.798635510047292720f, -0.809016994374947450f,
|
|
||||||
-0.819152044288992020f, -0.829037572555041740f,
|
|
||||||
-0.838670567945424050f, -0.848048096156426070f, -0.857167300702112330f,
|
|
||||||
-0.866025403784438710f, -0.874619707139395850f, -0.882947592858927100f,
|
|
||||||
-0.891006524188367900f, -0.898794046299166930f,
|
|
||||||
-0.906307787036650050f, -0.913545457642600980f, -0.920504853452440370f,
|
|
||||||
-0.927183854566787420f, -0.933580426497201740f, -0.939692620785908430f,
|
|
||||||
-0.945518575599316850f, -0.951056516295153640f,
|
|
||||||
-0.956304755963035550f, -0.961261695938318890f, -0.965925826289068310f,
|
|
||||||
-0.970295726275996470f, -0.974370064785235250f, -0.978147600733805690f,
|
|
||||||
-0.981627183447663980f, -0.984807753012208020f,
|
|
||||||
-0.987688340595137660f, -0.990268068741570360f, -0.992546151641322090f,
|
|
||||||
-0.994521895368273400f, -0.996194698091745550f, -0.997564050259824200f,
|
|
||||||
-0.998629534754573830f, -0.999390827019095760f,
|
|
||||||
-0.999847695156391270f, -1.000000000000000000f, -0.999847695156391270f,
|
|
||||||
-0.999390827019095760f, -0.998629534754573830f, -0.997564050259824200f,
|
|
||||||
-0.996194698091745550f, -0.994521895368273290f,
|
|
||||||
-0.992546151641321980f, -0.990268068741570250f, -0.987688340595137770f,
|
|
||||||
-0.984807753012208020f, -0.981627183447663980f, -0.978147600733805580f,
|
|
||||||
-0.974370064785235250f, -0.970295726275996470f,
|
|
||||||
-0.965925826289068310f, -0.961261695938318890f, -0.956304755963035440f,
|
|
||||||
-0.951056516295153530f, -0.945518575599316740f, -0.939692620785908320f,
|
|
||||||
-0.933580426497201740f, -0.927183854566787420f,
|
|
||||||
-0.920504853452440260f, -0.913545457642600870f, -0.906307787036649940f,
|
|
||||||
-0.898794046299167040f, -0.891006524188367790f, -0.882947592858926880f,
|
|
||||||
-0.874619707139395740f, -0.866025403784438600f,
|
|
||||||
-0.857167300702112220f, -0.848048096156426070f, -0.838670567945423940f,
|
|
||||||
-0.829037572555041740f, -0.819152044288991800f, -0.809016994374947450f,
|
|
||||||
-0.798635510047292830f, -0.788010753606722010f,
|
|
||||||
-0.777145961456970790f, -0.766044443118978010f, -0.754709580222772010f,
|
|
||||||
-0.743144825477394240f, -0.731353701619170460f, -0.719339800338651080f,
|
|
||||||
-0.707106781186547460f, -0.694658370458997250f,
|
|
||||||
-0.681998360062498480f, -0.669130606358858240f, -0.656059028990507160f,
|
|
||||||
-0.642787609686539250f, -0.629320391049837390f, -0.615661475325658180f,
|
|
||||||
-0.601815023152048270f, -0.587785252292473140f,
|
|
||||||
-0.573576436351046050f, -0.559192903470746900f, -0.544639035015027080f,
|
|
||||||
-0.529919264233204900f, -0.515038074910054160f, -0.499999999999999940f,
|
|
||||||
-0.484809620246337060f, -0.469471562785890810f,
|
|
||||||
-0.453990499739546750f, -0.438371146789077400f, -0.422618261740699440f,
|
|
||||||
-0.406736643075800150f, -0.390731128489273720f, -0.374606593415912010f,
|
|
||||||
-0.358367949545300270f, -0.342020143325668710f,
|
|
||||||
-0.325568154457156640f, -0.309016994374947400f, -0.292371704722736770f,
|
|
||||||
-0.275637355816999160f, -0.258819045102520740f, -0.241921895599667730f,
|
|
||||||
-0.224951054343865000f, -0.207911690817759310f,
|
|
||||||
-0.190808995376544800f, -0.173648177666930330f, -0.156434465040230870f,
|
|
||||||
-0.139173100960065440f, -0.121869343405147480f, -0.104528463267653460f,
|
|
||||||
-0.087155742747658166f, -0.069756473744125302f,
|
|
||||||
-0.052335956242943828f, -0.034899496702500969f, -0.017452406437283512f,
|
|
||||||
0.000000000000000000f, 0.017452406437283512f, 0.034899496702500969f,
|
|
||||||
0.052335956242943828f, 0.069756473744125302f,
|
|
||||||
0.087155742747658166f, 0.104528463267653460f, 0.121869343405147480f,
|
|
||||||
0.139173100960065440f, 0.156434465040230870f, 0.173648177666930330f,
|
|
||||||
0.190808995376544800f, 0.207911690817759310f,
|
|
||||||
0.224951054343865000f, 0.241921895599667730f, 0.258819045102520740f,
|
|
||||||
0.275637355816999160f, 0.292371704722736770f, 0.309016994374947400f,
|
|
||||||
0.325568154457156640f, 0.342020143325668710f,
|
|
||||||
0.358367949545300270f, 0.374606593415912010f, 0.390731128489273720f,
|
|
||||||
0.406736643075800150f, 0.422618261740699440f, 0.438371146789077400f,
|
|
||||||
0.453990499739546750f, 0.469471562785890810f,
|
|
||||||
0.484809620246337060f, 0.499999999999999940f, 0.515038074910054160f,
|
|
||||||
0.529919264233204900f, 0.544639035015027080f, 0.559192903470746900f,
|
|
||||||
0.573576436351046050f, 0.587785252292473140f,
|
|
||||||
0.601815023152048270f, 0.615661475325658180f, 0.629320391049837390f,
|
|
||||||
0.642787609686539250f, 0.656059028990507160f, 0.669130606358858240f,
|
|
||||||
0.681998360062498480f, 0.694658370458997250f,
|
|
||||||
0.707106781186547460f, 0.719339800338651080f, 0.731353701619170460f,
|
|
||||||
0.743144825477394240f, 0.754709580222772010f, 0.766044443118978010f,
|
|
||||||
0.777145961456970790f, 0.788010753606722010f,
|
|
||||||
0.798635510047292830f, 0.809016994374947450f, 0.819152044288991800f,
|
|
||||||
0.829037572555041740f, 0.838670567945423940f, 0.848048096156426070f,
|
|
||||||
0.857167300702112220f, 0.866025403784438600f,
|
|
||||||
0.874619707139395740f, 0.882947592858926880f, 0.891006524188367790f,
|
|
||||||
0.898794046299167040f, 0.906307787036649940f, 0.913545457642600870f,
|
|
||||||
0.920504853452440260f, 0.927183854566787420f,
|
|
||||||
0.933580426497201740f, 0.939692620785908320f, 0.945518575599316740f,
|
|
||||||
0.951056516295153530f, 0.956304755963035440f, 0.961261695938318890f,
|
|
||||||
0.965925826289068310f, 0.970295726275996470f,
|
|
||||||
0.974370064785235250f, 0.978147600733805580f, 0.981627183447663980f,
|
|
||||||
0.984807753012208020f, 0.987688340595137770f, 0.990268068741570250f,
|
|
||||||
0.992546151641321980f, 0.994521895368273290f,
|
|
||||||
0.996194698091745550f, 0.997564050259824200f, 0.998629534754573830f,
|
|
||||||
0.999390827019095760f, 0.999847695156391270f, 1.000000000000000000f,
|
|
||||||
0.999847695156391270f, 0.999390827019095760f,
|
|
||||||
0.998629534754573830f, 0.997564050259824200f, 0.996194698091745550f,
|
|
||||||
0.994521895368273400f, 0.992546151641322090f, 0.990268068741570360f,
|
|
||||||
0.987688340595137660f, 0.984807753012208020f,
|
|
||||||
0.981627183447663980f, 0.978147600733805690f, 0.974370064785235250f,
|
|
||||||
0.970295726275996470f, 0.965925826289068310f, 0.961261695938318890f,
|
|
||||||
0.956304755963035550f, 0.951056516295153640f,
|
|
||||||
0.945518575599316850f, 0.939692620785908430f, 0.933580426497201740f,
|
|
||||||
0.927183854566787420f, 0.920504853452440370f, 0.913545457642600980f,
|
|
||||||
0.906307787036650050f, 0.898794046299166930f,
|
|
||||||
0.891006524188367900f, 0.882947592858927100f, 0.874619707139395850f,
|
|
||||||
0.866025403784438710f, 0.857167300702112330f, 0.848048096156426070f,
|
|
||||||
0.838670567945424050f, 0.829037572555041740f,
|
|
||||||
0.819152044288992020f, 0.809016994374947450f, 0.798635510047292720f,
|
|
||||||
0.788010753606722010f, 0.777145961456971010f, 0.766044443118978010f,
|
|
||||||
0.754709580222771790f, 0.743144825477394240f,
|
|
||||||
0.731353701619170570f, 0.719339800338651410f, 0.707106781186547570f,
|
|
||||||
0.694658370458997140f, 0.681998360062498590f, 0.669130606358858350f,
|
|
||||||
0.656059028990507280f, 0.642787609686539470f,
|
|
||||||
0.629320391049837720f, 0.615661475325658400f, 0.601815023152048160f,
|
|
||||||
0.587785252292473250f, 0.573576436351046380f, 0.559192903470746900f,
|
|
||||||
0.544639035015026860f, 0.529919264233204900f,
|
|
||||||
0.515038074910054380f, 0.499999999999999940f, 0.484809620246337170f,
|
|
||||||
0.469471562785891080f, 0.453990499739546860f, 0.438371146789077290f,
|
|
||||||
0.422618261740699500f, 0.406736643075800430f,
|
|
||||||
0.390731128489274160f, 0.374606593415912240f, 0.358367949545300210f,
|
|
||||||
0.342020143325668880f, 0.325568154457156980f, 0.309016994374947510f,
|
|
||||||
0.292371704722737050f, 0.275637355816999660f,
|
|
||||||
0.258819045102521020f, 0.241921895599667730f, 0.224951054343864780f,
|
|
||||||
0.207911690817759310f, 0.190808995376544970f, 0.173648177666930280f,
|
|
||||||
0.156434465040230980f, 0.139173100960065740f,
|
|
||||||
0.121869343405147550f, 0.104528463267653730f, 0.087155742747658638f,
|
|
||||||
0.069756473744125524f, 0.052335956242943807f, 0.034899496702500699f,
|
|
||||||
0.017452406437283439f, 0.000000000000000122f
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Floating-point sin_cos function.
|
|
||||||
* @param[in] theta input value in degrees
|
|
||||||
* @param[out] *pSinVal points to the processed sine output.
|
|
||||||
* @param[out] *pCosVal points to the processed cos output.
|
|
||||||
* @return none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void arm_sin_cos_f32(
|
|
||||||
float32_t theta,
|
|
||||||
float32_t * pSinVal,
|
|
||||||
float32_t * pCosVal)
|
|
||||||
{
|
|
||||||
uint32_t i; /* Index for reading nearwst output values */
|
|
||||||
float32_t x1 = -179.0f; /* Initial input value */
|
|
||||||
float32_t y0, y1; /* nearest output values */
|
|
||||||
float32_t fract; /* fractional part of input */
|
|
||||||
|
|
||||||
/* Calculation of fractional part */
|
|
||||||
if(theta > 0.0f)
|
|
||||||
{
|
|
||||||
fract = theta - (float32_t) ((int32_t) theta);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fract = (theta - (float32_t) ((int32_t) theta)) + 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* index calculation for reading nearest output values */
|
|
||||||
i = (uint32_t) (theta - x1);
|
|
||||||
|
|
||||||
/* reading nearest sine output values */
|
|
||||||
y0 = sinTable[i];
|
|
||||||
y1 = sinTable[i + 1u];
|
|
||||||
|
|
||||||
/* Calculation of sine value */
|
|
||||||
*pSinVal = y0 + (fract * (y1 - y0));
|
|
||||||
|
|
||||||
/* reading nearest cosine output values */
|
|
||||||
y0 = cosTable[i];
|
|
||||||
y1 = cosTable[i + 1u];
|
|
||||||
|
|
||||||
/* Calculation of cosine value */
|
|
||||||
*pCosVal = y0 + (fract * (y1 - y0));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @} end of SinCos group
|
|
||||||
*/
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user