提交 9367bba6 编写于 作者: wuyangyong's avatar wuyangyong

update CMSIS version to 3.20

上级 8fdbb7c9
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
* Copyright (C) 2010 ARM Limited. All rights reserved. * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
* *
* $Date: 11. November 2010 * $Date: 17. January 2013
* $Revision: V1.0.2 * $Revision: V1.4.1
* *
* Project: CMSIS DSP Library * Project: CMSIS DSP Library
* Title: arm_common_tables.h * Title: arm_common_tables.h
* *
* Description: This file has extern declaration for common tables like Bitreverse, reciprocal etc which are used across different functions * Description: This file has extern declaration for common tables like Bitreverse, reciprocal etc which are used across different functions
* *
* Target Processor: Cortex-M4/Cortex-M3 * Target Processor: Cortex-M4/Cortex-M3
* *
* Version 1.0.2 2010/11/11 * Redistribution and use in source and binary forms, with or without
* Documentation updated. * modification, are permitted provided that the following conditions
* * are met:
* Version 1.0.1 2010/10/05 * - Redistributions of source code must retain the above copyright
* Production release and review comments incorporated. * notice, this list of conditions and the following disclaimer.
* * - Redistributions in binary form must reproduce the above copyright
* Version 1.0.0 2010/09/20 * notice, this list of conditions and the following disclaimer in
* Production release and review comments incorporated. * the documentation and/or other materials provided with the
* distribution.
* - Neither the name of ARM LIMITED nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#ifndef _ARM_COMMON_TABLES_H #ifndef _ARM_COMMON_TABLES_H
...@@ -31,8 +48,46 @@ extern const q15_t armRecipTableQ15[64]; ...@@ -31,8 +48,46 @@ extern const q15_t armRecipTableQ15[64];
extern const q31_t armRecipTableQ31[64]; extern const q31_t armRecipTableQ31[64];
extern const q31_t realCoefAQ31[1024]; extern const q31_t realCoefAQ31[1024];
extern const q31_t realCoefBQ31[1024]; extern const q31_t realCoefBQ31[1024];
extern const float32_t twiddleCoef[6144]; extern const float32_t twiddleCoef_16[32];
extern const float32_t twiddleCoef_32[64];
extern const float32_t twiddleCoef_64[128];
extern const float32_t twiddleCoef_128[256];
extern const float32_t twiddleCoef_256[512];
extern const float32_t twiddleCoef_512[1024];
extern const float32_t twiddleCoef_1024[2048];
extern const float32_t twiddleCoef_2048[4096];
extern const float32_t twiddleCoef_4096[8192];
#define twiddleCoef twiddleCoef_4096
extern const q31_t twiddleCoefQ31[6144]; extern const q31_t twiddleCoefQ31[6144];
extern const q15_t twiddleCoefQ15[6144]; extern const q15_t twiddleCoefQ15[6144];
extern const float32_t twiddleCoef_rfft_32[32];
extern const float32_t twiddleCoef_rfft_64[64];
extern const float32_t twiddleCoef_rfft_128[128];
extern const float32_t twiddleCoef_rfft_256[256];
extern const float32_t twiddleCoef_rfft_512[512];
extern const float32_t twiddleCoef_rfft_1024[1024];
extern const float32_t twiddleCoef_rfft_2048[2048];
extern const float32_t twiddleCoef_rfft_4096[4096];
#define ARMBITREVINDEXTABLE__16_TABLE_LENGTH ((uint16_t)20 )
#define ARMBITREVINDEXTABLE__32_TABLE_LENGTH ((uint16_t)48 )
#define ARMBITREVINDEXTABLE__64_TABLE_LENGTH ((uint16_t)56 )
#define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208 )
#define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440 )
#define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448 )
#define ARMBITREVINDEXTABLE1024_TABLE_LENGTH ((uint16_t)1800)
#define ARMBITREVINDEXTABLE2048_TABLE_LENGTH ((uint16_t)3808)
#define ARMBITREVINDEXTABLE4096_TABLE_LENGTH ((uint16_t)4032)
extern const uint16_t armBitRevIndexTable16[ARMBITREVINDEXTABLE__16_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable32[ARMBITREVINDEXTABLE__32_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable64[ARMBITREVINDEXTABLE__64_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable128[ARMBITREVINDEXTABLE_128_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable256[ARMBITREVINDEXTABLE_256_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable512[ARMBITREVINDEXTABLE_512_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable1024[ARMBITREVINDEXTABLE1024_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE2048_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE4096_TABLE_LENGTH];
#endif /* ARM_COMMON_TABLES_H */ #endif /* ARM_COMMON_TABLES_H */
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
* Copyright (C) 2010-2011 ARM Limited. All rights reserved. * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
* *
* $Date: 15. February 2012 * $Date: 17. January 2013
* $Revision: V1.1.0 * $Revision: V1.4.1
* *
* Project: CMSIS DSP Library * Project: CMSIS DSP Library
* Title: arm_math.h * Title: arm_math.h
* *
* Description: Public header file for CMSIS DSP Library * Description: Public header file for CMSIS DSP Library
* *
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 * Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
* *
* Version 1.1.0 2012/02/15 * Redistribution and use in source and binary forms, with or without
* Updated with more optimizations, bug fixes and minor API changes. * modification, are permitted provided that the following conditions
* * are met:
* Version 1.0.10 2011/7/15 * - Redistributions of source code must retain the above copyright
* Big Endian support added and Merged M0 and M3/M4 Source code. * notice, this list of conditions and the following disclaimer.
* * - Redistributions in binary form must reproduce the above copyright
* Version 1.0.3 2010/11/29 * notice, this list of conditions and the following disclaimer in
* Re-organized the CMSIS folders and updated documentation. * the documentation and/or other materials provided with the
* * distribution.
* Version 1.0.2 2010/11/11 * - Neither the name of ARM LIMITED nor the names of its contributors
* Documentation updated. * may be used to endorse or promote products derived from this
* * software without specific prior written permission.
* Version 1.0.1 2010/10/05 *
* Production release and review comments incorporated. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* Version 1.0.0 2010/09/20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* Production release and review comments incorporated. * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
/** /**
...@@ -35,10 +43,10 @@ ...@@ -35,10 +43,10 @@
* *
* <b>Introduction</b> * <b>Introduction</b>
* *
* This user manual describes the CMSIS DSP software library, * This user manual describes the CMSIS DSP software library,
* a suite of common signal processing functions for use on Cortex-M processor based devices. * a suite of common signal processing functions for use on Cortex-M processor based devices.
* *
* The library is divided into a number of functions each covering a specific category: * The library is divided into a number of functions each covering a specific category:
* - Basic math functions * - Basic math functions
* - Fast math functions * - Fast math functions
* - Complex math functions * - Complex math functions
...@@ -51,41 +59,7 @@ ...@@ -51,41 +59,7 @@
* - Interpolation functions * - Interpolation functions
* *
* The library has separate functions for operating on 8-bit integers, 16-bit integers, * The library has separate functions for operating on 8-bit integers, 16-bit integers,
* 32-bit integer and 32-bit floating-point values. * 32-bit integer and 32-bit floating-point values.
*
* <b>Pre-processor Macros</b>
*
* Each library project have differant pre-processor macros.
*
* - UNALIGNED_SUPPORT_DISABLE:
*
* Define macro UNALIGNED_SUPPORT_DISABLE, If the silicon does not support unaligned memory access
*
* - ARM_MATH_BIG_ENDIAN:
*
* Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets.
*
* - ARM_MATH_MATRIX_CHECK:
*
* Define macro ARM_MATH_MATRIX_CHECK for checking on the input and output sizes of matrices
*
* - ARM_MATH_ROUNDING:
*
* Define macro ARM_MATH_ROUNDING for rounding on support functions
*
* - ARM_MATH_CMx:
*
* Define macro ARM_MATH_CM4 for building the library on Cortex-M4 target, ARM_MATH_CM3 for building library on Cortex-M3 target
* and ARM_MATH_CM0 for building library on cortex-M0 target.
*
* - __FPU_PRESENT:
*
* Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for M4bf and M4lf libraries
*
* <b>Toolchain Support</b>
*
* The library has been developed and tested with MDK-ARM version 4.23.
* The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly.
* *
* <b>Using the Library</b> * <b>Using the Library</b>
* *
...@@ -100,33 +74,67 @@ ...@@ -100,33 +74,67 @@
* - arm_cortexM0b_math.lib (Big endian on Cortex-M3) * - arm_cortexM0b_math.lib (Big endian on Cortex-M3)
* *
* The library functions are declared in the public file <code>arm_math.h</code> which is placed in the <code>Include</code> folder. * The library functions are declared in the public file <code>arm_math.h</code> which is placed in the <code>Include</code> folder.
* Simply include this file and link the appropriate library in the application and begin calling the library functions. The Library supports single * Simply include this file and link the appropriate library in the application and begin calling the library functions. The Library supports single
* public header file <code> arm_math.h</code> for Cortex-M4/M3/M0 with little endian and big endian. Same header file will be used for floating point unit(FPU) variants. * public header file <code> arm_math.h</code> for Cortex-M4/M3/M0 with little endian and big endian. Same header file will be used for floating point unit(FPU) variants.
* Define the appropriate pre processor MACRO ARM_MATH_CM4 or ARM_MATH_CM3 or * Define the appropriate pre processor MACRO ARM_MATH_CM4 or ARM_MATH_CM3 or
* ARM_MATH_CM0 depending on the target processor in the application. * ARM_MATH_CM0 or ARM_MATH_CM0PLUS depending on the target processor in the application.
* *
* <b>Examples</b> * <b>Examples</b>
* *
* The library ships with a number of examples which demonstrate how to use the library functions. * The library ships with a number of examples which demonstrate how to use the library functions.
* *
* <b>Toolchain Support</b>
*
* The library has been developed and tested with MDK-ARM version 4.60.
* The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly.
*
* <b>Building the Library</b> * <b>Building the Library</b>
* *
* The library installer contains project files to re build libraries on MDK Tool chain in the <code>CMSIS\\DSP_Lib\\Source\\ARM</code> folder. * The library installer contains project files to re build libraries on MDK Tool chain in the <code>CMSIS\\DSP_Lib\\Source\\ARM</code> folder.
* - arm_cortexM0b_math.uvproj * - arm_cortexM0b_math.uvproj
* - arm_cortexM0l_math.uvproj * - arm_cortexM0l_math.uvproj
* - arm_cortexM3b_math.uvproj * - arm_cortexM3b_math.uvproj
* - arm_cortexM3l_math.uvproj * - arm_cortexM3l_math.uvproj
* - arm_cortexM4b_math.uvproj * - arm_cortexM4b_math.uvproj
* - arm_cortexM4l_math.uvproj * - arm_cortexM4l_math.uvproj
* - arm_cortexM4bf_math.uvproj * - arm_cortexM4bf_math.uvproj
* - arm_cortexM4lf_math.uvproj * - arm_cortexM4lf_math.uvproj
* *
* *
* The project can be built by opening the appropriate project in MDK-ARM 4.23 chain and defining the optional pre processor MACROs detailed above. * The project can be built by opening the appropriate project in MDK-ARM 4.60 chain and defining the optional pre processor MACROs detailed above.
*
* <b>Pre-processor Macros</b>
*
* Each library project have differant pre-processor macros.
*
* - UNALIGNED_SUPPORT_DISABLE:
*
* Define macro UNALIGNED_SUPPORT_DISABLE, If the silicon does not support unaligned memory access
*
* - ARM_MATH_BIG_ENDIAN:
*
* Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets.
*
* - ARM_MATH_MATRIX_CHECK:
*
* Define macro ARM_MATH_MATRIX_CHECK for checking on the input and output sizes of matrices
*
* - ARM_MATH_ROUNDING:
*
* Define macro ARM_MATH_ROUNDING for rounding on support functions
*
* - ARM_MATH_CMx:
*
* Define macro ARM_MATH_CM4 for building the library on Cortex-M4 target, ARM_MATH_CM3 for building library on Cortex-M3 target
* and ARM_MATH_CM0 for building library on cortex-M0 target, ARM_MATH_CM0PLUS for building library on cortex-M0+ target.
*
* - __FPU_PRESENT:
*
* Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for M4bf and M4lf libraries
* *
* <b>Copyright Notice</b> * <b>Copyright Notice</b>
* *
* Copyright (C) 2010 ARM Limited. All rights reserved. * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
*/ */
...@@ -264,6 +272,10 @@ ...@@ -264,6 +272,10 @@
#include "core_cm3.h" #include "core_cm3.h"
#elif defined (ARM_MATH_CM0) #elif defined (ARM_MATH_CM0)
#include "core_cm0.h" #include "core_cm0.h"
#define ARM_MATH_CM0_FAMILY
#elif defined (ARM_MATH_CM0PLUS)
#include "core_cm0plus.h"
#define ARM_MATH_CM0_FAMILY
#else #else
#include "ARMCM4.h" #include "ARMCM4.h"
#warning "Define either ARM_MATH_CM4 OR ARM_MATH_CM3...By Default building on ARM_MATH_CM4....." #warning "Define either ARM_MATH_CM4 OR ARM_MATH_CM3...By Default building on ARM_MATH_CM4....."
...@@ -365,17 +377,27 @@ extern "C" ...@@ -365,17 +377,27 @@ extern "C"
/** /**
* @brief definition to read/write two 16 bit values. * @brief definition to read/write two 16 bit values.
*/ */
#if defined (__GNUC__) #if defined __CC_ARM
#define __SIMD32(addr) (*( int32_t **) & (addr)) #define __SIMD32_TYPE int32_t __packed
#define _SIMD32_OFFSET(addr) (*( int32_t * ) (addr)) #define CMSIS_UNUSED __attribute__((unused))
#elif defined __ICCARM__
#define CMSIS_UNUSED
#define __SIMD32_TYPE int32_t __packed
#elif defined __GNUC__
#define __SIMD32_TYPE int32_t
#define CMSIS_UNUSED __attribute__((unused))
#else #else
#define __SIMD32(addr) (*(__packed int32_t **) & (addr)) #error Unknown compiler
#define _SIMD32_OFFSET(addr) (*(__packed int32_t * ) (addr)) #endif
#endif
#define __SIMD64(addr) (*(int64_t **) & (addr)) #define __SIMD32(addr) (*(__SIMD32_TYPE **) & (addr))
#define __SIMD32_CONST(addr) ((__SIMD32_TYPE *)(addr))
#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0) #define _SIMD32_OFFSET(addr) (*(__SIMD32_TYPE *) (addr))
#define __SIMD64(addr) (*(int64_t **) & (addr))
#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY)
/** /**
* @brief definition to pack two 16 bit values. * @brief definition to pack two 16 bit values.
*/ */
...@@ -409,7 +431,7 @@ extern "C" ...@@ -409,7 +431,7 @@ extern "C"
/** /**
* @brief Clips Q63 to Q31 values. * @brief Clips Q63 to Q31 values.
*/ */
__STATIC_INLINE q31_t clip_q63_to_q31( static __INLINE q31_t clip_q63_to_q31(
q63_t x) q63_t x)
{ {
return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ?
...@@ -419,7 +441,7 @@ extern "C" ...@@ -419,7 +441,7 @@ extern "C"
/** /**
* @brief Clips Q63 to Q15 values. * @brief Clips Q63 to Q15 values.
*/ */
__STATIC_INLINE q15_t clip_q63_to_q15( static __INLINE q15_t clip_q63_to_q15(
q63_t x) q63_t x)
{ {
return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ?
...@@ -429,7 +451,7 @@ extern "C" ...@@ -429,7 +451,7 @@ extern "C"
/** /**
* @brief Clips Q31 to Q7 values. * @brief Clips Q31 to Q7 values.
*/ */
__STATIC_INLINE q7_t clip_q31_to_q7( static __INLINE q7_t clip_q31_to_q7(
q31_t x) q31_t x)
{ {
return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ? return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ?
...@@ -439,7 +461,7 @@ extern "C" ...@@ -439,7 +461,7 @@ extern "C"
/** /**
* @brief Clips Q31 to Q15 values. * @brief Clips Q31 to Q15 values.
*/ */
__STATIC_INLINE q15_t clip_q31_to_q15( static __INLINE q15_t clip_q31_to_q15(
q31_t x) q31_t x)
{ {
return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ? return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ?
...@@ -450,7 +472,7 @@ extern "C" ...@@ -450,7 +472,7 @@ extern "C"
* @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format. * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format.
*/ */
__STATIC_INLINE q63_t mult32x64( static __INLINE q63_t mult32x64(
q63_t x, q63_t x,
q31_t y) q31_t y)
{ {
...@@ -459,20 +481,18 @@ extern "C" ...@@ -459,20 +481,18 @@ extern "C"
} }
#if defined (ARM_MATH_CM0) && defined ( __CC_ARM ) #if defined (ARM_MATH_CM0_FAMILY) && defined ( __CC_ARM )
#define __CLZ __clz #define __CLZ __clz
#endif #endif
#if defined (ARM_MATH_CM0) && defined ( __TASKING__ ) #if defined (ARM_MATH_CM0_FAMILY) && ((defined (__ICCARM__)) ||(defined (__GNUC__)) || defined (__TASKING__) )
/* No need to redefine __CLZ */
#endif
#if defined (ARM_MATH_CM0) && ((defined (__ICCARM__)) ||(defined (__GNUC__)) )
__STATIC_INLINE uint32_t __CLZ(q31_t data); static __INLINE uint32_t __CLZ(
q31_t data);
__STATIC_INLINE uint32_t __CLZ(q31_t data) static __INLINE uint32_t __CLZ(
q31_t data)
{ {
uint32_t count = 0; uint32_t count = 0;
uint32_t mask = 0x80000000; uint32_t mask = 0x80000000;
...@@ -490,10 +510,10 @@ extern "C" ...@@ -490,10 +510,10 @@ extern "C"
#endif #endif
/** /**
* @brief Function to Calculates 1/in(reciprocal) value of Q31 Data type. * @brief Function to Calculates 1/in (reciprocal) value of Q31 Data type.
*/ */
__STATIC_INLINE uint32_t arm_recip_q31( static __INLINE uint32_t arm_recip_q31(
q31_t in, q31_t in,
q31_t * dst, q31_t * dst,
q31_t * pRecipTable) q31_t * pRecipTable)
...@@ -542,9 +562,9 @@ extern "C" ...@@ -542,9 +562,9 @@ extern "C"
} }
/** /**
* @brief Function to Calculates 1/in(reciprocal) value of Q15 Data type. * @brief Function to Calculates 1/in (reciprocal) value of Q15 Data type.
*/ */
__STATIC_INLINE uint32_t arm_recip_q15( static __INLINE uint32_t arm_recip_q15(
q15_t in, q15_t in,
q15_t * dst, q15_t * dst,
q15_t * pRecipTable) q15_t * pRecipTable)
...@@ -595,9 +615,9 @@ extern "C" ...@@ -595,9 +615,9 @@ extern "C"
/* /*
* @brief C custom defined intrinisic function for only M0 processors * @brief C custom defined intrinisic function for only M0 processors
*/ */
#if defined(ARM_MATH_CM0) #if defined(ARM_MATH_CM0_FAMILY)
__STATIC_INLINE q31_t __SSAT( static __INLINE q31_t __SSAT(
q31_t x, q31_t x,
uint32_t y) uint32_t y)
{ {
...@@ -633,19 +653,19 @@ extern "C" ...@@ -633,19 +653,19 @@ extern "C"
} }
#endif /* end of ARM_MATH_CM0 */ #endif /* end of ARM_MATH_CM0_FAMILY */
/* /*
* @brief C custom defined intrinsic function for M3 and M0 processors * @brief C custom defined intrinsic function for M3 and M0 processors
*/ */
#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0) #if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY)
/* /*
* @brief C custom defined QADD8 for M3 and M0 processors * @brief C custom defined QADD8 for M3 and M0 processors
*/ */
__STATIC_INLINE q31_t __QADD8( static __INLINE q31_t __QADD8(
q31_t x, q31_t x,
q31_t y) q31_t y)
{ {
...@@ -672,7 +692,7 @@ extern "C" ...@@ -672,7 +692,7 @@ extern "C"
/* /*
* @brief C custom defined QSUB8 for M3 and M0 processors * @brief C custom defined QSUB8 for M3 and M0 processors
*/ */
__STATIC_INLINE q31_t __QSUB8( static __INLINE q31_t __QSUB8(
q31_t x, q31_t x,
q31_t y) q31_t y)
{ {
...@@ -702,7 +722,7 @@ extern "C" ...@@ -702,7 +722,7 @@ extern "C"
/* /*
* @brief C custom defined QADD16 for M3 and M0 processors * @brief C custom defined QADD16 for M3 and M0 processors
*/ */
__STATIC_INLINE q31_t __QADD16( static __INLINE q31_t __QADD16(
q31_t x, q31_t x,
q31_t y) q31_t y)
{ {
...@@ -725,7 +745,7 @@ extern "C" ...@@ -725,7 +745,7 @@ extern "C"
/* /*
* @brief C custom defined SHADD16 for M3 and M0 processors * @brief C custom defined SHADD16 for M3 and M0 processors
*/ */
__STATIC_INLINE q31_t __SHADD16( static __INLINE q31_t __SHADD16(
q31_t x, q31_t x,
q31_t y) q31_t y)
{ {
...@@ -748,7 +768,7 @@ extern "C" ...@@ -748,7 +768,7 @@ extern "C"
/* /*
* @brief C custom defined QSUB16 for M3 and M0 processors * @brief C custom defined QSUB16 for M3 and M0 processors
*/ */
__STATIC_INLINE q31_t __QSUB16( static __INLINE q31_t __QSUB16(
q31_t x, q31_t x,
q31_t y) q31_t y)
{ {
...@@ -770,7 +790,7 @@ extern "C" ...@@ -770,7 +790,7 @@ extern "C"
/* /*
* @brief C custom defined SHSUB16 for M3 and M0 processors * @brief C custom defined SHSUB16 for M3 and M0 processors
*/ */
__STATIC_INLINE q31_t __SHSUB16( static __INLINE q31_t __SHSUB16(
q31_t x, q31_t x,
q31_t y) q31_t y)
{ {
...@@ -792,7 +812,7 @@ extern "C" ...@@ -792,7 +812,7 @@ extern "C"
/* /*
* @brief C custom defined QASX for M3 and M0 processors * @brief C custom defined QASX for M3 and M0 processors
*/ */
__STATIC_INLINE q31_t __QASX( static __INLINE q31_t __QASX(
q31_t x, q31_t x,
q31_t y) q31_t y)
{ {
...@@ -810,7 +830,7 @@ extern "C" ...@@ -810,7 +830,7 @@ extern "C"
/* /*
* @brief C custom defined SHASX for M3 and M0 processors * @brief C custom defined SHASX for M3 and M0 processors
*/ */
__STATIC_INLINE q31_t __SHASX( static __INLINE q31_t __SHASX(
q31_t x, q31_t x,
q31_t y) q31_t y)
{ {
...@@ -833,7 +853,7 @@ extern "C" ...@@ -833,7 +853,7 @@ extern "C"
/* /*
* @brief C custom defined QSAX for M3 and M0 processors * @brief C custom defined QSAX for M3 and M0 processors
*/ */
__STATIC_INLINE q31_t __QSAX( static __INLINE q31_t __QSAX(
q31_t x, q31_t x,
q31_t y) q31_t y)
{ {
...@@ -851,7 +871,7 @@ extern "C" ...@@ -851,7 +871,7 @@ extern "C"
/* /*
* @brief C custom defined SHSAX for M3 and M0 processors * @brief C custom defined SHSAX for M3 and M0 processors
*/ */
__STATIC_INLINE q31_t __SHSAX( static __INLINE q31_t __SHSAX(
q31_t x, q31_t x,
q31_t y) q31_t y)
{ {
...@@ -873,7 +893,7 @@ extern "C" ...@@ -873,7 +893,7 @@ extern "C"
/* /*
* @brief C custom defined SMUSDX for M3 and M0 processors * @brief C custom defined SMUSDX for M3 and M0 processors
*/ */
__STATIC_INLINE q31_t __SMUSDX( static __INLINE q31_t __SMUSDX(
q31_t x, q31_t x,
q31_t y) q31_t y)
{ {
...@@ -885,7 +905,7 @@ extern "C" ...@@ -885,7 +905,7 @@ extern "C"
/* /*
* @brief C custom defined SMUADX for M3 and M0 processors * @brief C custom defined SMUADX for M3 and M0 processors
*/ */
__STATIC_INLINE q31_t __SMUADX( static __INLINE q31_t __SMUADX(
q31_t x, q31_t x,
q31_t y) q31_t y)
{ {
...@@ -897,7 +917,7 @@ extern "C" ...@@ -897,7 +917,7 @@ extern "C"
/* /*
* @brief C custom defined QADD for M3 and M0 processors * @brief C custom defined QADD for M3 and M0 processors
*/ */
__STATIC_INLINE q31_t __QADD( static __INLINE q31_t __QADD(
q31_t x, q31_t x,
q31_t y) q31_t y)
{ {
...@@ -907,7 +927,7 @@ extern "C" ...@@ -907,7 +927,7 @@ extern "C"
/* /*
* @brief C custom defined QSUB for M3 and M0 processors * @brief C custom defined QSUB for M3 and M0 processors
*/ */
__STATIC_INLINE q31_t __QSUB( static __INLINE q31_t __QSUB(
q31_t x, q31_t x,
q31_t y) q31_t y)
{ {
...@@ -917,7 +937,7 @@ extern "C" ...@@ -917,7 +937,7 @@ extern "C"
/* /*
* @brief C custom defined SMLAD for M3 and M0 processors * @brief C custom defined SMLAD for M3 and M0 processors
*/ */
__STATIC_INLINE q31_t __SMLAD( static __INLINE q31_t __SMLAD(
q31_t x, q31_t x,
q31_t y, q31_t y,
q31_t sum) q31_t sum)
...@@ -930,7 +950,7 @@ extern "C" ...@@ -930,7 +950,7 @@ extern "C"
/* /*
* @brief C custom defined SMLADX for M3 and M0 processors * @brief C custom defined SMLADX for M3 and M0 processors
*/ */
__STATIC_INLINE q31_t __SMLADX( static __INLINE q31_t __SMLADX(
q31_t x, q31_t x,
q31_t y, q31_t y,
q31_t sum) q31_t sum)
...@@ -943,7 +963,7 @@ extern "C" ...@@ -943,7 +963,7 @@ extern "C"
/* /*
* @brief C custom defined SMLSDX for M3 and M0 processors * @brief C custom defined SMLSDX for M3 and M0 processors
*/ */
__STATIC_INLINE q31_t __SMLSDX( static __INLINE q31_t __SMLSDX(
q31_t x, q31_t x,
q31_t y, q31_t y,
q31_t sum) q31_t sum)
...@@ -956,7 +976,7 @@ extern "C" ...@@ -956,7 +976,7 @@ extern "C"
/* /*
* @brief C custom defined SMLALD for M3 and M0 processors * @brief C custom defined SMLALD for M3 and M0 processors
*/ */
__STATIC_INLINE q63_t __SMLALD( static __INLINE q63_t __SMLALD(
q31_t x, q31_t x,
q31_t y, q31_t y,
q63_t sum) q63_t sum)
...@@ -969,7 +989,7 @@ extern "C" ...@@ -969,7 +989,7 @@ extern "C"
/* /*
* @brief C custom defined SMLALDX for M3 and M0 processors * @brief C custom defined SMLALDX for M3 and M0 processors
*/ */
__STATIC_INLINE q63_t __SMLALDX( static __INLINE q63_t __SMLALDX(
q31_t x, q31_t x,
q31_t y, q31_t y,
q63_t sum) q63_t sum)
...@@ -982,7 +1002,7 @@ extern "C" ...@@ -982,7 +1002,7 @@ extern "C"
/* /*
* @brief C custom defined SMUAD for M3 and M0 processors * @brief C custom defined SMUAD for M3 and M0 processors
*/ */
__STATIC_INLINE q31_t __SMUAD( static __INLINE q31_t __SMUAD(
q31_t x, q31_t x,
q31_t y) q31_t y)
{ {
...@@ -994,7 +1014,7 @@ extern "C" ...@@ -994,7 +1014,7 @@ extern "C"
/* /*
* @brief C custom defined SMUSD for M3 and M0 processors * @brief C custom defined SMUSD for M3 and M0 processors
*/ */
__STATIC_INLINE q31_t __SMUSD( static __INLINE q31_t __SMUSD(
q31_t x, q31_t x,
q31_t y) q31_t y)
{ {
...@@ -1007,7 +1027,7 @@ extern "C" ...@@ -1007,7 +1027,7 @@ extern "C"
/* /*
* @brief C custom defined SXTB16 for M3 and M0 processors * @brief C custom defined SXTB16 for M3 and M0 processors
*/ */
__STATIC_INLINE q31_t __SXTB16( static __INLINE q31_t __SXTB16(
q31_t x) q31_t x)
{ {
...@@ -1016,7 +1036,7 @@ extern "C" ...@@ -1016,7 +1036,7 @@ extern "C"
} }
#endif /* defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0) */ #endif /* defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) */
/** /**
...@@ -1516,6 +1536,7 @@ extern "C" ...@@ -1516,6 +1536,7 @@ extern "C"
* @param[in] *pSrcA points to the first input matrix structure * @param[in] *pSrcA points to the first input matrix structure
* @param[in] *pSrcB points to the second input matrix structure * @param[in] *pSrcB points to the second input matrix structure
* @param[out] *pDst points to output matrix structure * @param[out] *pDst points to output matrix structure
* @param[in] *pState points to the array for storing intermediate results
* @return The function returns either * @return The function returns either
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
*/ */
...@@ -1531,7 +1552,7 @@ extern "C" ...@@ -1531,7 +1552,7 @@ extern "C"
* @param[in] *pSrcA points to the first input matrix structure * @param[in] *pSrcA points to the first input matrix structure
* @param[in] *pSrcB points to the second input matrix structure * @param[in] *pSrcB points to the second input matrix structure
* @param[out] *pDst points to output matrix structure * @param[out] *pDst points to output matrix structure
* @param[in] *pState points to the array for storing intermediate results * @param[in] *pState points to the array for storing intermediate results
* @return The function returns either * @return The function returns either
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
*/ */
...@@ -1713,7 +1734,7 @@ extern "C" ...@@ -1713,7 +1734,7 @@ extern "C"
typedef struct typedef struct
{ {
q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */
#ifdef ARM_MATH_CM0 #ifdef ARM_MATH_CM0_FAMILY
q15_t A1; q15_t A1;
q15_t A2; q15_t A2;
#else #else
...@@ -1931,23 +1952,12 @@ extern "C" ...@@ -1931,23 +1952,12 @@ extern "C"
uint32_t blockSize); uint32_t blockSize);
/**
* @brief Instance structure for the Q15 CFFT/CIFFT function.
*/
typedef struct
{
uint16_t fftLen; /**< length of the FFT. */
uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
q15_t *pTwiddle; /**< points to the twiddle factor table. */
uint16_t *pBitRevTable; /**< points to the bit reversal table. */
uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
} arm_cfft_radix4_instance_q15;
/** /**
* @brief Instance structure for the Q31 CFFT/CIFFT function. * @brief Instance structure for the Q15 CFFT/CIFFT function.
*/ */
typedef struct typedef struct
...@@ -1955,28 +1965,22 @@ extern "C" ...@@ -1955,28 +1965,22 @@ extern "C"
uint16_t fftLen; /**< length of the FFT. */ uint16_t fftLen; /**< length of the FFT. */
uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
q31_t *pTwiddle; /**< points to the twiddle factor table. */ q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */
uint16_t *pBitRevTable; /**< points to the bit reversal table. */ uint16_t *pBitRevTable; /**< points to the bit reversal table. */
uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
} arm_cfft_radix4_instance_q31; } arm_cfft_radix2_instance_q15;
arm_status arm_cfft_radix2_init_q15(
arm_cfft_radix2_instance_q15 * S,
uint16_t fftLen,
uint8_t ifftFlag,
uint8_t bitReverseFlag);
/** void arm_cfft_radix2_q15(
* @brief Instance structure for the floating-point CFFT/CIFFT function. const arm_cfft_radix2_instance_q15 * S,
*/ q15_t * pSrc);
typedef struct
{
uint16_t fftLen; /**< length of the FFT. */
uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
float32_t *pTwiddle; /**< points to the twiddle factor table. */
uint16_t *pBitRevTable; /**< points to the bit reversal table. */
uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
float32_t onebyfftLen; /**< value of 1/fftLen. */
} arm_cfft_radix4_instance_f32;
/** /**
...@@ -1988,11 +1992,21 @@ extern "C" ...@@ -1988,11 +1992,21 @@ extern "C"
uint16_t fftLen; /**< length of the FFT. */ uint16_t fftLen; /**< length of the FFT. */
uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */ q15_t *pTwiddle; /**< points to the twiddle factor table. */
uint16_t *pBitRevTable; /**< points to the bit reversal table. */ uint16_t *pBitRevTable; /**< points to the bit reversal table. */
uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
} arm_cfft_radix2_instance_q15; } arm_cfft_radix4_instance_q15;
arm_status arm_cfft_radix4_init_q15(
arm_cfft_radix4_instance_q15 * S,
uint16_t fftLen,
uint8_t ifftFlag,
uint8_t bitReverseFlag);
void arm_cfft_radix4_q15(
const arm_cfft_radix4_instance_q15 * S,
q15_t * pSrc);
/** /**
* @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function. * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function.
...@@ -2009,95 +2023,36 @@ extern "C" ...@@ -2009,95 +2023,36 @@ extern "C"
uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
} arm_cfft_radix2_instance_q31; } arm_cfft_radix2_instance_q31;
/** arm_status arm_cfft_radix2_init_q31(
* @brief Instance structure for the floating-point CFFT/CIFFT function. arm_cfft_radix2_instance_q31 * S,
*/
typedef struct
{
uint16_t fftLen; /**< length of the FFT. */
uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
float32_t *pTwiddle; /**< points to the Twiddle factor table. */
uint16_t *pBitRevTable; /**< points to the bit reversal table. */
uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
float32_t onebyfftLen; /**< value of 1/fftLen. */
} arm_cfft_radix2_instance_f32;
/**
* @brief Processing function for the Q15 CFFT/CIFFT.
* @param[in] *S points to an instance of the Q15 CFFT/CIFFT structure.
* @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place.
* @return none.
*/
void arm_cfft_radix4_q15(
const arm_cfft_radix4_instance_q15 * S,
q15_t * pSrc);
/**
* @brief Processing function for the Q15 CFFT/CIFFT.
* @param[in] *S points to an instance of the Q15 CFFT/CIFFT structure.
* @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place.
* @return none.
*/
void arm_cfft_radix2_q15(
const arm_cfft_radix2_instance_q15 * S,
q15_t * pSrc);
/**
* @brief Initialization function for the Q15 CFFT/CIFFT.
* @param[in,out] *S points to an instance of the Q15 CFFT/CIFFT structure.
* @param[in] fftLen length of the FFT.
* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform.
* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output.
* @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLen</code> is not a supported value.
*/
arm_status arm_cfft_radix4_init_q15(
arm_cfft_radix4_instance_q15 * S,
uint16_t fftLen, uint16_t fftLen,
uint8_t ifftFlag, uint8_t ifftFlag,
uint8_t bitReverseFlag); uint8_t bitReverseFlag);
void arm_cfft_radix2_q31(
const arm_cfft_radix2_instance_q31 * S,
q31_t * pSrc);
/** /**
* @brief Initialization function for the Q15 CFFT/CIFFT. * @brief Instance structure for the Q31 CFFT/CIFFT function.
* @param[in,out] *S points to an instance of the Q15 CFFT/CIFFT structure.
* @param[in] fftLen length of the FFT.
* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform.
* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output.
* @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLen</code> is not a supported value.
*/ */
arm_status arm_cfft_radix2_init_q15( typedef struct
arm_cfft_radix2_instance_q15 * S, {
uint16_t fftLen, uint16_t fftLen; /**< length of the FFT. */
uint8_t ifftFlag, uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
uint8_t bitReverseFlag); uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
q31_t *pTwiddle; /**< points to the twiddle factor table. */
uint16_t *pBitRevTable; /**< points to the bit reversal table. */
uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
} arm_cfft_radix4_instance_q31;
/**
* @brief Processing function for the Q31 CFFT/CIFFT.
* @param[in] *S points to an instance of the Q31 CFFT/CIFFT structure.
* @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place.
* @return none.
*/
void arm_cfft_radix4_q31( void arm_cfft_radix4_q31(
const arm_cfft_radix4_instance_q31 * S, const arm_cfft_radix4_instance_q31 * S,
q31_t * pSrc); q31_t * pSrc);
/**
* @brief Initialization function for the Q31 CFFT/CIFFT.
* @param[in,out] *S points to an instance of the Q31 CFFT/CIFFT structure.
* @param[in] fftLen length of the FFT.
* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform.
* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output.
* @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLen</code> is not a supported value.
*/
arm_status arm_cfft_radix4_init_q31( arm_status arm_cfft_radix4_init_q31(
arm_cfft_radix4_instance_q31 * S, arm_cfft_radix4_instance_q31 * S,
uint16_t fftLen, uint16_t fftLen,
...@@ -2105,322 +2060,79 @@ extern "C" ...@@ -2105,322 +2060,79 @@ extern "C"
uint8_t bitReverseFlag); uint8_t bitReverseFlag);
/** /**
* @brief Processing function for the Radix-2 Q31 CFFT/CIFFT. * @brief Instance structure for the floating-point CFFT/CIFFT function.
* @param[in] *S points to an instance of the Radix-2 Q31 CFFT/CIFFT structure.
* @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place.
* @return none.
*/ */
void arm_cfft_radix2_q31( typedef struct
const arm_cfft_radix2_instance_q31 * S, {
q31_t * pSrc); uint16_t fftLen; /**< length of the FFT. */
uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
/** uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
* @brief Initialization function for the Radix-2 Q31 CFFT/CIFFT. float32_t *pTwiddle; /**< points to the Twiddle factor table. */
* @param[in,out] *S points to an instance of the Radix-2 Q31 CFFT/CIFFT structure. uint16_t *pBitRevTable; /**< points to the bit reversal table. */
* @param[in] fftLen length of the FFT. uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. float32_t onebyfftLen; /**< value of 1/fftLen. */
* @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLen</code> is not a supported value. } arm_cfft_radix2_instance_f32;
*/
arm_status arm_cfft_radix2_init_q31( /* Deprecated */
arm_cfft_radix2_instance_q31 * S, arm_status arm_cfft_radix2_init_f32(
arm_cfft_radix2_instance_f32 * S,
uint16_t fftLen, uint16_t fftLen,
uint8_t ifftFlag, uint8_t ifftFlag,
uint8_t bitReverseFlag); uint8_t bitReverseFlag);
/* Deprecated */
/**
* @brief Processing function for the floating-point CFFT/CIFFT.
* @param[in] *S points to an instance of the floating-point CFFT/CIFFT structure.
* @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place.
* @return none.
*/
void arm_cfft_radix2_f32( void arm_cfft_radix2_f32(
const arm_cfft_radix2_instance_f32 * S, const arm_cfft_radix2_instance_f32 * S,
float32_t * pSrc); float32_t * pSrc);
/** /**
* @brief Initialization function for the floating-point CFFT/CIFFT. * @brief Instance structure for the floating-point CFFT/CIFFT function.
* @param[in,out] *S points to an instance of the floating-point CFFT/CIFFT structure.
* @param[in] fftLen length of the FFT.
* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform.
* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output.
* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLen</code> is not a supported value.
*/ */
arm_status arm_cfft_radix2_init_f32( typedef struct
arm_cfft_radix2_instance_f32 * S, {
uint16_t fftLen; /**< length of the FFT. */
uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
float32_t *pTwiddle; /**< points to the Twiddle factor table. */
uint16_t *pBitRevTable; /**< points to the bit reversal table. */
uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
float32_t onebyfftLen; /**< value of 1/fftLen. */
} arm_cfft_radix4_instance_f32;
/* Deprecated */
arm_status arm_cfft_radix4_init_f32(
arm_cfft_radix4_instance_f32 * S,
uint16_t fftLen, uint16_t fftLen,
uint8_t ifftFlag, uint8_t ifftFlag,
uint8_t bitReverseFlag); uint8_t bitReverseFlag);
/** /* Deprecated */
* @brief Processing function for the floating-point CFFT/CIFFT.
* @param[in] *S points to an instance of the floating-point CFFT/CIFFT structure.
* @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place.
* @return none.
*/
void arm_cfft_radix4_f32( void arm_cfft_radix4_f32(
const arm_cfft_radix4_instance_f32 * S, const arm_cfft_radix4_instance_f32 * S,
float32_t * pSrc); float32_t * pSrc);
/** /**
* @brief Initialization function for the floating-point CFFT/CIFFT. * @brief Instance structure for the floating-point CFFT/CIFFT function.
* @param[in,out] *S points to an instance of the floating-point CFFT/CIFFT structure.
* @param[in] fftLen length of the FFT.
* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform.
* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output.
* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLen</code> is not a supported value.
*/ */
arm_status arm_cfft_radix4_init_f32( typedef struct
arm_cfft_radix4_instance_f32 * S, {
uint16_t fftLen, uint16_t fftLen; /**< length of the FFT. */
const float32_t *pTwiddle; /**< points to the Twiddle factor table. */
const uint16_t *pBitRevTable; /**< points to the bit reversal table. */
uint16_t bitRevLength; /**< bit reversal table length. */
} arm_cfft_instance_f32;
void arm_cfft_f32(
const arm_cfft_instance_f32 * S,
float32_t * p1,
uint8_t ifftFlag, uint8_t ifftFlag,
uint8_t bitReverseFlag); uint8_t bitReverseFlag);
/*----------------------------------------------------------------------
* Internal functions prototypes FFT function
----------------------------------------------------------------------*/
/**
* @brief Core function for the floating-point CFFT butterfly process.
* @param[in, out] *pSrc points to the in-place buffer of floating-point data type.
* @param[in] fftLen length of the FFT.
* @param[in] *pCoef points to the twiddle coefficient buffer.
* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
* @return none.
*/
void arm_radix4_butterfly_f32(
float32_t * pSrc,
uint16_t fftLen,
float32_t * pCoef,
uint16_t twidCoefModifier);
/**
* @brief Core function for the floating-point CIFFT butterfly process.
* @param[in, out] *pSrc points to the in-place buffer of floating-point data type.
* @param[in] fftLen length of the FFT.
* @param[in] *pCoef points to twiddle coefficient buffer.
* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
* @param[in] onebyfftLen value of 1/fftLen.
* @return none.
*/
void arm_radix4_butterfly_inverse_f32(
float32_t * pSrc,
uint16_t fftLen,
float32_t * pCoef,
uint16_t twidCoefModifier,
float32_t onebyfftLen);
/**
* @brief In-place bit reversal function.
* @param[in, out] *pSrc points to the in-place buffer of floating-point data type.
* @param[in] fftSize length of the FFT.
* @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table.
* @param[in] *pBitRevTab points to the bit reversal table.
* @return none.
*/
void arm_bitreversal_f32(
float32_t * pSrc,
uint16_t fftSize,
uint16_t bitRevFactor,
uint16_t * pBitRevTab);
/**
* @brief Core function for the Q31 CFFT butterfly process.
* @param[in, out] *pSrc points to the in-place buffer of Q31 data type.
* @param[in] fftLen length of the FFT.
* @param[in] *pCoef points to Twiddle coefficient buffer.
* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
* @return none.
*/
void arm_radix4_butterfly_q31(
q31_t * pSrc,
uint32_t fftLen,
q31_t * pCoef,
uint32_t twidCoefModifier);
/**
* @brief Core function for the f32 FFT butterfly process.
* @param[in, out] *pSrc points to the in-place buffer of f32 data type.
* @param[in] fftLen length of the FFT.
* @param[in] *pCoef points to Twiddle coefficient buffer.
* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
* @return none.
*/
void arm_radix2_butterfly_f32(
float32_t * pSrc,
uint32_t fftLen,
float32_t * pCoef,
uint16_t twidCoefModifier);
/**
* @brief Core function for the Radix-2 Q31 CFFT butterfly process.
* @param[in, out] *pSrc points to the in-place buffer of Q31 data type.
* @param[in] fftLen length of the FFT.
* @param[in] *pCoef points to Twiddle coefficient buffer.
* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
* @return none.
*/
void arm_radix2_butterfly_q31(
q31_t * pSrc,
uint32_t fftLen,
q31_t * pCoef,
uint16_t twidCoefModifier);
/**
* @brief Core function for the Radix-2 Q15 CFFT butterfly process.
* @param[in, out] *pSrc points to the in-place buffer of Q15 data type.
* @param[in] fftLen length of the FFT.
* @param[in] *pCoef points to Twiddle coefficient buffer.
* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
* @return none.
*/
void arm_radix2_butterfly_q15(
q15_t * pSrc,
uint32_t fftLen,
q15_t * pCoef,
uint16_t twidCoefModifier);
/**
* @brief Core function for the Radix-2 Q15 CFFT Inverse butterfly process.
* @param[in, out] *pSrc points to the in-place buffer of Q15 data type.
* @param[in] fftLen length of the FFT.
* @param[in] *pCoef points to Twiddle coefficient buffer.
* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
* @return none.
*/
void arm_radix2_butterfly_inverse_q15(
q15_t * pSrc,
uint32_t fftLen,
q15_t * pCoef,
uint16_t twidCoefModifier);
/**
* @brief Core function for the Radix-2 Q31 CFFT Inverse butterfly process.
* @param[in, out] *pSrc points to the in-place buffer of Q31 data type.
* @param[in] fftLen length of the FFT.
* @param[in] *pCoef points to Twiddle coefficient buffer.
* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
* @return none.
*/
void arm_radix2_butterfly_inverse_q31(
q31_t * pSrc,
uint32_t fftLen,
q31_t * pCoef,
uint16_t twidCoefModifier);
/**
* @brief Core function for the f32 IFFT butterfly process.
* @param[in, out] *pSrc points to the in-place buffer of f32 data type.
* @param[in] fftLen length of the FFT.
* @param[in] *pCoef points to Twiddle coefficient buffer.
* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
* @param[in] onebyfftLen 1/fftLenfth
* @return none.
*/
void arm_radix2_butterfly_inverse_f32(
float32_t * pSrc,
uint32_t fftLen,
float32_t * pCoef,
uint16_t twidCoefModifier,
float32_t onebyfftLen);
/**
* @brief Core function for the Q31 CIFFT butterfly process.
* @param[in, out] *pSrc points to the in-place buffer of Q31 data type.
* @param[in] fftLen length of the FFT.
* @param[in] *pCoef points to twiddle coefficient buffer.
* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
* @return none.
*/
void arm_radix4_butterfly_inverse_q31(
q31_t * pSrc,
uint32_t fftLen,
q31_t * pCoef,
uint32_t twidCoefModifier);
/**
* @brief In-place bit reversal function.
* @param[in, out] *pSrc points to the in-place buffer of Q31 data type.
* @param[in] fftLen length of the FFT.
* @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table
* @param[in] *pBitRevTab points to bit reversal table.
* @return none.
*/
void arm_bitreversal_q31(
q31_t * pSrc,
uint32_t fftLen,
uint16_t bitRevFactor,
uint16_t * pBitRevTab);
/**
* @brief Core function for the Q15 CFFT butterfly process.
* @param[in, out] *pSrc16 points to the in-place buffer of Q15 data type.
* @param[in] fftLen length of the FFT.
* @param[in] *pCoef16 points to twiddle coefficient buffer.
* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
* @return none.
*/
void arm_radix4_butterfly_q15(
q15_t * pSrc16,
uint32_t fftLen,
q15_t * pCoef16,
uint32_t twidCoefModifier);
/**
* @brief Core function for the Q15 CIFFT butterfly process.
* @param[in, out] *pSrc16 points to the in-place buffer of Q15 data type.
* @param[in] fftLen length of the FFT.
* @param[in] *pCoef16 points to twiddle coefficient buffer.
* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
* @return none.
*/
void arm_radix4_butterfly_inverse_q15(
q15_t * pSrc16,
uint32_t fftLen,
q15_t * pCoef16,
uint32_t twidCoefModifier);
/**
* @brief In-place bit reversal function.
* @param[in, out] *pSrc points to the in-place buffer of Q15 data type.
* @param[in] fftLen length of the FFT.
* @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table
* @param[in] *pBitRevTab points to bit reversal table.
* @return none.
*/
void arm_bitreversal_q15(
q15_t * pSrc,
uint32_t fftLen,
uint16_t bitRevFactor,
uint16_t * pBitRevTab);
/** /**
* @brief Instance structure for the Q15 RFFT/RIFFT function. * @brief Instance structure for the Q15 RFFT/RIFFT function.
*/ */
...@@ -2437,6 +2149,18 @@ extern "C" ...@@ -2437,6 +2149,18 @@ extern "C"
arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */
} arm_rfft_instance_q15; } arm_rfft_instance_q15;
arm_status arm_rfft_init_q15(
arm_rfft_instance_q15 * S,
arm_cfft_radix4_instance_q15 * S_CFFT,
uint32_t fftLenReal,
uint32_t ifftFlagR,
uint32_t bitReverseFlag);
void arm_rfft_q15(
const arm_rfft_instance_q15 * S,
q15_t * pSrc,
q15_t * pDst);
/** /**
* @brief Instance structure for the Q31 RFFT/RIFFT function. * @brief Instance structure for the Q31 RFFT/RIFFT function.
*/ */
...@@ -2453,6 +2177,18 @@ extern "C" ...@@ -2453,6 +2177,18 @@ extern "C"
arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */
} arm_rfft_instance_q31; } arm_rfft_instance_q31;
arm_status arm_rfft_init_q31(
arm_rfft_instance_q31 * S,
arm_cfft_radix4_instance_q31 * S_CFFT,
uint32_t fftLenReal,
uint32_t ifftFlagR,
uint32_t bitReverseFlag);
void arm_rfft_q31(
const arm_rfft_instance_q31 * S,
q31_t * pSrc,
q31_t * pDst);
/** /**
* @brief Instance structure for the floating-point RFFT/RIFFT function. * @brief Instance structure for the floating-point RFFT/RIFFT function.
*/ */
...@@ -2469,76 +2205,6 @@ extern "C" ...@@ -2469,76 +2205,6 @@ extern "C"
arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */
} arm_rfft_instance_f32; } arm_rfft_instance_f32;
/**
* @brief Processing function for the Q15 RFFT/RIFFT.
* @param[in] *S points to an instance of the Q15 RFFT/RIFFT structure.
* @param[in] *pSrc points to the input buffer.
* @param[out] *pDst points to the output buffer.
* @return none.
*/
void arm_rfft_q15(
const arm_rfft_instance_q15 * S,
q15_t * pSrc,
q15_t * pDst);
/**
* @brief Initialization function for the Q15 RFFT/RIFFT.
* @param[in, out] *S points to an instance of the Q15 RFFT/RIFFT structure.
* @param[in] *S_CFFT points to an instance of the Q15 CFFT/CIFFT structure.
* @param[in] fftLenReal length of the FFT.
* @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform.
* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output.
* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLenReal</code> is not a supported value.
*/
arm_status arm_rfft_init_q15(
arm_rfft_instance_q15 * S,
arm_cfft_radix4_instance_q15 * S_CFFT,
uint32_t fftLenReal,
uint32_t ifftFlagR,
uint32_t bitReverseFlag);
/**
* @brief Processing function for the Q31 RFFT/RIFFT.
* @param[in] *S points to an instance of the Q31 RFFT/RIFFT structure.
* @param[in] *pSrc points to the input buffer.
* @param[out] *pDst points to the output buffer.
* @return none.
*/
void arm_rfft_q31(
const arm_rfft_instance_q31 * S,
q31_t * pSrc,
q31_t * pDst);
/**
* @brief Initialization function for the Q31 RFFT/RIFFT.
* @param[in, out] *S points to an instance of the Q31 RFFT/RIFFT structure.
* @param[in, out] *S_CFFT points to an instance of the Q31 CFFT/CIFFT structure.
* @param[in] fftLenReal length of the FFT.
* @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform.
* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output.
* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLenReal</code> is not a supported value.
*/
arm_status arm_rfft_init_q31(
arm_rfft_instance_q31 * S,
arm_cfft_radix4_instance_q31 * S_CFFT,
uint32_t fftLenReal,
uint32_t ifftFlagR,
uint32_t bitReverseFlag);
/**
* @brief Initialization function for the floating-point RFFT/RIFFT.
* @param[in,out] *S points to an instance of the floating-point RFFT/RIFFT structure.
* @param[in,out] *S_CFFT points to an instance of the floating-point CFFT/CIFFT structure.
* @param[in] fftLenReal length of the FFT.
* @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform.
* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output.
* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLenReal</code> is not a supported value.
*/
arm_status arm_rfft_init_f32( arm_status arm_rfft_init_f32(
arm_rfft_instance_f32 * S, arm_rfft_instance_f32 * S,
arm_cfft_radix4_instance_f32 * S_CFFT, arm_cfft_radix4_instance_f32 * S_CFFT,
...@@ -2546,19 +2212,31 @@ extern "C" ...@@ -2546,19 +2212,31 @@ extern "C"
uint32_t ifftFlagR, uint32_t ifftFlagR,
uint32_t bitReverseFlag); uint32_t bitReverseFlag);
/**
* @brief Processing function for the floating-point RFFT/RIFFT.
* @param[in] *S points to an instance of the floating-point RFFT/RIFFT structure.
* @param[in] *pSrc points to the input buffer.
* @param[out] *pDst points to the output buffer.
* @return none.
*/
void arm_rfft_f32( void arm_rfft_f32(
const arm_rfft_instance_f32 * S, const arm_rfft_instance_f32 * S,
float32_t * pSrc, float32_t * pSrc,
float32_t * pDst); float32_t * pDst);
/**
* @brief Instance structure for the floating-point RFFT/RIFFT function.
*/
typedef struct
{
arm_cfft_instance_f32 Sint; /**< Internal CFFT structure. */
uint16_t fftLenRFFT; /**< length of the real sequence */
float32_t * pTwiddleRFFT; /**< Twiddle factors real stage */
} arm_rfft_fast_instance_f32 ;
arm_status arm_rfft_fast_init_f32 (
arm_rfft_fast_instance_f32 * S,
uint16_t fftLen);
void arm_rfft_fast_f32(
arm_rfft_fast_instance_f32 * S,
float32_t * p, float32_t * pOut,
uint8_t ifftFlag);
/** /**
* @brief Instance structure for the floating-point DCT4/IDCT4 function. * @brief Instance structure for the floating-point DCT4/IDCT4 function.
*/ */
...@@ -3155,7 +2833,7 @@ extern "C" ...@@ -3155,7 +2833,7 @@ extern "C"
q31_t * pDst, q31_t * pDst,
uint32_t blockSize); uint32_t blockSize);
/** /**
* @brief Copies the elements of a floating-point vector. * @brief Copies the elements of a floating-point vector.
* @param[in] *pSrc input pointer * @param[in] *pSrc input pointer
* @param[out] *pDst output pointer * @param[out] *pDst output pointer
* @param[in] blockSize number of samples to process * @param[in] blockSize number of samples to process
...@@ -3167,7 +2845,7 @@ extern "C" ...@@ -3167,7 +2845,7 @@ extern "C"
uint32_t blockSize); uint32_t blockSize);
/** /**
* @brief Copies the elements of a Q7 vector. * @brief Copies the elements of a Q7 vector.
* @param[in] *pSrc input pointer * @param[in] *pSrc input pointer
* @param[out] *pDst output pointer * @param[out] *pDst output pointer
* @param[in] blockSize number of samples to process * @param[in] blockSize number of samples to process
...@@ -3179,7 +2857,7 @@ extern "C" ...@@ -3179,7 +2857,7 @@ extern "C"
uint32_t blockSize); uint32_t blockSize);
/** /**
* @brief Copies the elements of a Q15 vector. * @brief Copies the elements of a Q15 vector.
* @param[in] *pSrc input pointer * @param[in] *pSrc input pointer
* @param[out] *pDst output pointer * @param[out] *pDst output pointer
* @param[in] blockSize number of samples to process * @param[in] blockSize number of samples to process
...@@ -3191,7 +2869,7 @@ extern "C" ...@@ -3191,7 +2869,7 @@ extern "C"
uint32_t blockSize); uint32_t blockSize);
/** /**
* @brief Copies the elements of a Q31 vector. * @brief Copies the elements of a Q31 vector.
* @param[in] *pSrc input pointer * @param[in] *pSrc input pointer
* @param[out] *pDst output pointer * @param[out] *pDst output pointer
* @param[in] blockSize number of samples to process * @param[in] blockSize number of samples to process
...@@ -3202,7 +2880,7 @@ extern "C" ...@@ -3202,7 +2880,7 @@ extern "C"
q31_t * pDst, q31_t * pDst,
uint32_t blockSize); uint32_t blockSize);
/** /**
* @brief Fills a constant value into a floating-point vector. * @brief Fills a constant value into a floating-point vector.
* @param[in] value input value to be filled * @param[in] value input value to be filled
* @param[out] *pDst output pointer * @param[out] *pDst output pointer
* @param[in] blockSize number of samples to process * @param[in] blockSize number of samples to process
...@@ -3214,7 +2892,7 @@ extern "C" ...@@ -3214,7 +2892,7 @@ extern "C"
uint32_t blockSize); uint32_t blockSize);
/** /**
* @brief Fills a constant value into a Q7 vector. * @brief Fills a constant value into a Q7 vector.
* @param[in] value input value to be filled * @param[in] value input value to be filled
* @param[out] *pDst output pointer * @param[out] *pDst output pointer
* @param[in] blockSize number of samples to process * @param[in] blockSize number of samples to process
...@@ -3226,7 +2904,7 @@ extern "C" ...@@ -3226,7 +2904,7 @@ extern "C"
uint32_t blockSize); uint32_t blockSize);
/** /**
* @brief Fills a constant value into a Q15 vector. * @brief Fills a constant value into a Q15 vector.
* @param[in] value input value to be filled * @param[in] value input value to be filled
* @param[out] *pDst output pointer * @param[out] *pDst output pointer
* @param[in] blockSize number of samples to process * @param[in] blockSize number of samples to process
...@@ -3238,7 +2916,7 @@ extern "C" ...@@ -3238,7 +2916,7 @@ extern "C"
uint32_t blockSize); uint32_t blockSize);
/** /**
* @brief Fills a constant value into a Q31 vector. * @brief Fills a constant value into a Q31 vector.
* @param[in] value input value to be filled * @param[in] value input value to be filled
* @param[out] *pDst output pointer * @param[out] *pDst output pointer
* @param[in] blockSize number of samples to process * @param[in] blockSize number of samples to process
...@@ -3249,14 +2927,14 @@ extern "C" ...@@ -3249,14 +2927,14 @@ extern "C"
q31_t * pDst, q31_t * pDst,
uint32_t blockSize); uint32_t blockSize);
/** /**
* @brief Convolution of floating-point sequences. * @brief Convolution of floating-point sequences.
* @param[in] *pSrcA points to the first input sequence. * @param[in] *pSrcA points to the first input sequence.
* @param[in] srcALen length of the first input sequence. * @param[in] srcALen length of the first input sequence.
* @param[in] *pSrcB points to the second input sequence. * @param[in] *pSrcB points to the second input sequence.
* @param[in] srcBLen length of the second input sequence. * @param[in] srcBLen length of the second input sequence.
* @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1.
* @return none. * @return none.
*/ */
void arm_conv_f32( void arm_conv_f32(
...@@ -3266,17 +2944,17 @@ extern "C" ...@@ -3266,17 +2944,17 @@ extern "C"
uint32_t srcBLen, uint32_t srcBLen,
float32_t * pDst); float32_t * pDst);
/** /**
* @brief Convolution of Q15 sequences. * @brief Convolution of Q15 sequences.
* @param[in] *pSrcA points to the first input sequence. * @param[in] *pSrcA points to the first input sequence.
* @param[in] srcALen length of the first input sequence. * @param[in] srcALen length of the first input sequence.
* @param[in] *pSrcB points to the second input sequence. * @param[in] *pSrcB points to the second input sequence.
* @param[in] srcBLen length of the second input sequence. * @param[in] srcBLen length of the second input sequence.
* @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1.
* @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. * @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen). * @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen).
* @return none. * @return none.
*/ */
...@@ -3290,14 +2968,14 @@ extern "C" ...@@ -3290,14 +2968,14 @@ extern "C"
q15_t * pScratch2); q15_t * pScratch2);
/** /**
* @brief Convolution of Q15 sequences. * @brief Convolution of Q15 sequences.
* @param[in] *pSrcA points to the first input sequence. * @param[in] *pSrcA points to the first input sequence.
* @param[in] srcALen length of the first input sequence. * @param[in] srcALen length of the first input sequence.
* @param[in] *pSrcB points to the second input sequence. * @param[in] *pSrcB points to the second input sequence.
* @param[in] srcBLen length of the second input sequence. * @param[in] srcBLen length of the second input sequence.
* @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1.
* @return none. * @return none.
*/ */
void arm_conv_q15( void arm_conv_q15(
...@@ -3331,9 +3009,9 @@ extern "C" ...@@ -3331,9 +3009,9 @@ extern "C"
* @param[in] *pSrcB points to the second input sequence. * @param[in] *pSrcB points to the second input sequence.
* @param[in] srcBLen length of the second input sequence. * @param[in] srcBLen length of the second input sequence.
* @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1.
* @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. * @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen). * @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen).
* @return none. * @return none.
*/ */
void arm_conv_fast_opt_q15( void arm_conv_fast_opt_q15(
...@@ -3382,16 +3060,16 @@ extern "C" ...@@ -3382,16 +3060,16 @@ extern "C"
q31_t * pDst); q31_t * pDst);
/** /**
* @brief Convolution of Q7 sequences. * @brief Convolution of Q7 sequences.
* @param[in] *pSrcA points to the first input sequence. * @param[in] *pSrcA points to the first input sequence.
* @param[in] srcALen length of the first input sequence. * @param[in] srcALen length of the first input sequence.
* @param[in] *pSrcB points to the second input sequence. * @param[in] *pSrcB points to the second input sequence.
* @param[in] srcBLen length of the second input sequence. * @param[in] srcBLen length of the second input sequence.
* @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1.
* @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. * @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). * @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen).
* @return none. * @return none.
*/ */
void arm_conv_opt_q7( void arm_conv_opt_q7(
...@@ -3444,18 +3122,18 @@ extern "C" ...@@ -3444,18 +3122,18 @@ extern "C"
uint32_t firstIndex, uint32_t firstIndex,
uint32_t numPoints); uint32_t numPoints);
/** /**
* @brief Partial convolution of Q15 sequences. * @brief Partial convolution of Q15 sequences.
* @param[in] *pSrcA points to the first input sequence. * @param[in] *pSrcA points to the first input sequence.
* @param[in] srcALen length of the first input sequence. * @param[in] srcALen length of the first input sequence.
* @param[in] *pSrcB points to the second input sequence. * @param[in] *pSrcB points to the second input sequence.
* @param[in] srcBLen length of the second input sequence. * @param[in] srcBLen length of the second input sequence.
* @param[out] *pDst points to the block of output data * @param[out] *pDst points to the block of output data
* @param[in] firstIndex is the first output sample to start with. * @param[in] firstIndex is the first output sample to start with.
* @param[in] numPoints is the number of output points to be computed. * @param[in] numPoints is the number of output points to be computed.
* @param[in] * pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. * @param[in] * pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] * pScratch2 points to scratch buffer of size min(srcALen, srcBLen). * @param[in] * pScratch2 points to scratch buffer of size min(srcALen, srcBLen).
* @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
*/ */
arm_status arm_conv_partial_opt_q15( arm_status arm_conv_partial_opt_q15(
...@@ -3522,9 +3200,9 @@ extern "C" ...@@ -3522,9 +3200,9 @@ extern "C"
* @param[out] *pDst points to the block of output data * @param[out] *pDst points to the block of output data
* @param[in] firstIndex is the first output sample to start with. * @param[in] firstIndex is the first output sample to start with.
* @param[in] numPoints is the number of output points to be computed. * @param[in] numPoints is the number of output points to be computed.
* @param[in] * pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. * @param[in] * pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] * pScratch2 points to scratch buffer of size min(srcALen, srcBLen). * @param[in] * pScratch2 points to scratch buffer of size min(srcALen, srcBLen).
* @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
*/ */
arm_status arm_conv_partial_fast_opt_q15( arm_status arm_conv_partial_fast_opt_q15(
...@@ -3583,18 +3261,18 @@ extern "C" ...@@ -3583,18 +3261,18 @@ extern "C"
uint32_t numPoints); uint32_t numPoints);
/** /**
* @brief Partial convolution of Q7 sequences * @brief Partial convolution of Q7 sequences
* @param[in] *pSrcA points to the first input sequence. * @param[in] *pSrcA points to the first input sequence.
* @param[in] srcALen length of the first input sequence. * @param[in] srcALen length of the first input sequence.
* @param[in] *pSrcB points to the second input sequence. * @param[in] *pSrcB points to the second input sequence.
* @param[in] srcBLen length of the second input sequence. * @param[in] srcBLen length of the second input sequence.
* @param[out] *pDst points to the block of output data * @param[out] *pDst points to the block of output data
* @param[in] firstIndex is the first output sample to start with. * @param[in] firstIndex is the first output sample to start with.
* @param[in] numPoints is the number of output points to be computed. * @param[in] numPoints is the number of output points to be computed.
* @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. * @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). * @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen).
* @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
*/ */
arm_status arm_conv_partial_opt_q7( arm_status arm_conv_partial_opt_q7(
...@@ -4086,8 +3764,8 @@ extern "C" ...@@ -4086,8 +3764,8 @@ extern "C"
* @brief Initialization function for the Q15 FIR lattice filter. * @brief Initialization function for the Q15 FIR lattice filter.
* @param[in] *S points to an instance of the Q15 FIR lattice structure. * @param[in] *S points to an instance of the Q15 FIR lattice structure.
* @param[in] numStages number of filter stages. * @param[in] numStages number of filter stages.
* @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages.
* @param[in] *pState points to the state buffer. The array is of length numStages. * @param[in] *pState points to the state buffer. The array is of length numStages.
* @return none. * @return none.
*/ */
...@@ -4654,15 +4332,15 @@ extern "C" ...@@ -4654,15 +4332,15 @@ extern "C"
float32_t * pDst); float32_t * pDst);
/** /**
* @brief Correlation of Q15 sequences * @brief Correlation of Q15 sequences
* @param[in] *pSrcA points to the first input sequence. * @param[in] *pSrcA points to the first input sequence.
* @param[in] srcALen length of the first input sequence. * @param[in] srcALen length of the first input sequence.
* @param[in] *pSrcB points to the second input sequence. * @param[in] *pSrcB points to the second input sequence.
* @param[in] srcBLen length of the second input sequence. * @param[in] srcBLen length of the second input sequence.
* @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1.
* @param[in] *pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. * @param[in] *pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @return none. * @return none.
*/ */
void arm_correlate_opt_q15( void arm_correlate_opt_q15(
q15_t * pSrcA, q15_t * pSrcA,
...@@ -4716,7 +4394,7 @@ extern "C" ...@@ -4716,7 +4394,7 @@ extern "C"
* @param[in] *pSrcB points to the second input sequence. * @param[in] *pSrcB points to the second input sequence.
* @param[in] srcBLen length of the second input sequence. * @param[in] srcBLen length of the second input sequence.
* @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1.
* @param[in] *pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. * @param[in] *pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @return none. * @return none.
*/ */
...@@ -4764,16 +4442,16 @@ extern "C" ...@@ -4764,16 +4442,16 @@ extern "C"
/** /**
* @brief Correlation of Q7 sequences. * @brief Correlation of Q7 sequences.
* @param[in] *pSrcA points to the first input sequence. * @param[in] *pSrcA points to the first input sequence.
* @param[in] srcALen length of the first input sequence. * @param[in] srcALen length of the first input sequence.
* @param[in] *pSrcB points to the second input sequence. * @param[in] *pSrcB points to the second input sequence.
* @param[in] srcBLen length of the second input sequence. * @param[in] srcBLen length of the second input sequence.
* @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1.
* @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. * @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). * @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen).
* @return none. * @return none.
*/ */
void arm_correlate_opt_q7( void arm_correlate_opt_q7(
...@@ -5019,9 +4697,9 @@ extern "C" ...@@ -5019,9 +4697,9 @@ extern "C"
/* /*
* @brief Floating-point sin_cos function. * @brief Floating-point sin_cos function.
* @param[in] theta input value in degrees * @param[in] theta input value in degrees
* @param[out] *pSinVal points to the processed sine output. * @param[out] *pSinVal points to the processed sine output.
* @param[out] *pCosVal points to the processed cos output. * @param[out] *pCosVal points to the processed cos output.
* @return none. * @return none.
*/ */
...@@ -5032,9 +4710,9 @@ extern "C" ...@@ -5032,9 +4710,9 @@ extern "C"
/* /*
* @brief Q31 sin_cos function. * @brief Q31 sin_cos function.
* @param[in] theta scaled input value in degrees * @param[in] theta scaled input value in degrees
* @param[out] *pSinVal points to the processed sine output. * @param[out] *pSinVal points to the processed sine output.
* @param[out] *pCosVal points to the processed cosine output. * @param[out] *pCosVal points to the processed cosine output.
* @return none. * @return none.
*/ */
...@@ -5132,7 +4810,7 @@ extern "C" ...@@ -5132,7 +4810,7 @@ extern "C"
/** /**
* @defgroup PID PID Motor Control * @defgroup PID PID Motor Control
* *
* A Proportional Integral Derivative (PID) controller is a generic feedback control * A Proportional Integral Derivative (PID) controller is a generic feedback control
* loop mechanism widely used in industrial control systems. * loop mechanism widely used in industrial control systems.
* A PID controller is the most commonly used type of feedback controller. * A PID controller is the most commonly used type of feedback controller.
* *
...@@ -5151,39 +4829,39 @@ extern "C" ...@@ -5151,39 +4829,39 @@ extern "C"
* *
* \par * \par
* where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant * where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant
* *
* \par * \par
* \image html PID.gif "Proportional Integral Derivative Controller" * \image html PID.gif "Proportional Integral Derivative Controller"
* *
* \par * \par
* The PID controller calculates an "error" value as the difference between * The PID controller calculates an "error" value as the difference between
* the measured output and the reference input. * the measured output and the reference input.
* The controller attempts to minimize the error by adjusting the process control inputs. * The controller attempts to minimize the error by adjusting the process control inputs.
* The proportional value determines the reaction to the current error, * The proportional value determines the reaction to the current error,
* the integral value determines the reaction based on the sum of recent errors, * the integral value determines the reaction based on the sum of recent errors,
* and the derivative value determines the reaction based on the rate at which the error has been changing. * and the derivative value determines the reaction based on the rate at which the error has been changing.
* *
* \par Instance Structure * \par Instance Structure
* The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure. * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure.
* A separate instance structure must be defined for each PID Controller. * A separate instance structure must be defined for each PID Controller.
* There are separate instance structure declarations for each of the 3 supported data types. * There are separate instance structure declarations for each of the 3 supported data types.
*
* \par Reset Functions
* There is also an associated reset function for each data type which clears the state array.
* *
* \par Initialization Functions * \par Reset Functions
* There is also an associated initialization function for each data type. * There is also an associated reset function for each data type which clears the state array.
* The initialization function performs the following operations: *
* \par Initialization Functions
* There is also an associated initialization function for each data type.
* The initialization function performs the following operations:
* - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains. * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains.
* - Zeros out the values in the state buffer. * - Zeros out the values in the state buffer.
*
* \par
* Instance structure cannot be placed into a const data section and it is recommended to use the initialization function.
* *
* \par Fixed-Point Behavior * \par
* Care must be taken when using the fixed-point versions of the PID Controller functions. * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function.
* In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. *
* Refer to the function specific documentation below for usage guidelines. * \par Fixed-Point Behavior
* Care must be taken when using the fixed-point versions of the PID Controller functions.
* In particular, the overflow and saturation behavior of the accumulator used in each function must be considered.
* Refer to the function specific documentation below for usage guidelines.
*/ */
/** /**
...@@ -5199,7 +4877,7 @@ extern "C" ...@@ -5199,7 +4877,7 @@ extern "C"
*/ */
__STATIC_INLINE float32_t arm_pid_f32( static __INLINE float32_t arm_pid_f32(
arm_pid_instance_f32 * S, arm_pid_instance_f32 * S,
float32_t in) float32_t in)
{ {
...@@ -5225,16 +4903,16 @@ extern "C" ...@@ -5225,16 +4903,16 @@ extern "C"
* @param[in] in input sample to process * @param[in] in input sample to process
* @return out processed output sample. * @return out processed output sample.
* *
* <b>Scaling and Overflow Behavior:</b> * <b>Scaling and Overflow Behavior:</b>
* \par * \par
* The function is implemented using an internal 64-bit accumulator. * The function is implemented using an internal 64-bit accumulator.
* The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit.
* Thus, if the accumulator result overflows it wraps around rather than clip. * Thus, if the accumulator result overflows it wraps around rather than clip.
* In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions. * In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions.
* After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. * After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format.
*/ */
__STATIC_INLINE q31_t arm_pid_q31( static __INLINE q31_t arm_pid_q31(
arm_pid_instance_q31 * S, arm_pid_instance_q31 * S,
q31_t in) q31_t in)
{ {
...@@ -5272,47 +4950,42 @@ extern "C" ...@@ -5272,47 +4950,42 @@ extern "C"
* @param[in] in input sample to process * @param[in] in input sample to process
* @return out processed output sample. * @return out processed output sample.
* *
* <b>Scaling and Overflow Behavior:</b> * <b>Scaling and Overflow Behavior:</b>
* \par * \par
* The function is implemented using a 64-bit internal accumulator. * The function is implemented using a 64-bit internal accumulator.
* Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result. * Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result.
* The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format.
* There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved.
* After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. * After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits.
* Lastly, the accumulator is saturated to yield a result in 1.15 format. * Lastly, the accumulator is saturated to yield a result in 1.15 format.
*/ */
__STATIC_INLINE q15_t arm_pid_q15( static __INLINE q15_t arm_pid_q15(
arm_pid_instance_q15 * S, arm_pid_instance_q15 * S,
q15_t in) q15_t in)
{ {
q63_t acc; q63_t acc;
q15_t out; q15_t out;
/* Implementation of PID controller */ #ifndef ARM_MATH_CM0_FAMILY
__SIMD32_TYPE *vstate;
#ifdef ARM_MATH_CM0
/* acc = A0 * x[n] */
acc = ((q31_t) S->A0) * in;
#else /* Implementation of PID controller */
/* acc = A0 * x[n] */ /* acc = A0 * x[n] */
acc = (q31_t) __SMUAD(S->A0, in); acc = (q31_t) __SMUAD(S->A0, in);
#endif
#ifdef ARM_MATH_CM0
/* acc += A1 * x[n-1] + A2 * x[n-2] */ /* acc += A1 * x[n-1] + A2 * x[n-2] */
acc += (q31_t) S->A1 * S->state[0]; vstate = __SIMD32_CONST(S->state);
acc += (q31_t) S->A2 * S->state[1]; acc = __SMLALD(S->A1, (q31_t) *vstate, acc);
#else #else
/* acc = A0 * x[n] */
acc = ((q31_t) S->A0) * in;
/* acc += A1 * x[n-1] + A2 * x[n-2] */ /* acc += A1 * x[n-1] + A2 * x[n-2] */
acc = __SMLALD(S->A1, (q31_t) __SIMD32(S->state), acc); acc += (q31_t) S->A1 * S->state[0];
acc += (q31_t) S->A2 * S->state[1];
#endif #endif
...@@ -5366,7 +5039,7 @@ extern "C" ...@@ -5366,7 +5039,7 @@ extern "C"
* and <code>Ia + Ib + Ic = 0</code>, in this condition <code>Ialpha</code> and <code>Ibeta</code> * and <code>Ia + Ib + Ic = 0</code>, in this condition <code>Ialpha</code> and <code>Ibeta</code>
* can be calculated using only <code>Ia</code> and <code>Ib</code>. * can be calculated using only <code>Ia</code> and <code>Ib</code>.
* *
* The function operates on a single sample of data and each call to the function returns the processed output. * The function operates on a single sample of data and each call to the function returns the processed output.
* The library provides separate functions for Q31 and floating-point data types. * The library provides separate functions for Q31 and floating-point data types.
* \par Algorithm * \par Algorithm
* \image html clarkeFormula.gif * \image html clarkeFormula.gif
...@@ -5393,7 +5066,7 @@ extern "C" ...@@ -5393,7 +5066,7 @@ extern "C"
* @return none. * @return none.
*/ */
__STATIC_INLINE void arm_clarke_f32( static __INLINE void arm_clarke_f32(
float32_t Ia, float32_t Ia,
float32_t Ib, float32_t Ib,
float32_t * pIalpha, float32_t * pIalpha,
...@@ -5423,7 +5096,7 @@ extern "C" ...@@ -5423,7 +5096,7 @@ extern "C"
* There is saturation on the addition, hence there is no risk of overflow. * There is saturation on the addition, hence there is no risk of overflow.
*/ */
__STATIC_INLINE void arm_clarke_q31( static __INLINE void arm_clarke_q31(
q31_t Ia, q31_t Ia,
q31_t Ib, q31_t Ib,
q31_t * pIalpha, q31_t * pIalpha,
...@@ -5470,8 +5143,8 @@ extern "C" ...@@ -5470,8 +5143,8 @@ extern "C"
/** /**
* @defgroup inv_clarke Vector Inverse Clarke Transform * @defgroup inv_clarke Vector Inverse Clarke Transform
* Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases. * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases.
* *
* The function operates on a single sample of data and each call to the function returns the processed output. * The function operates on a single sample of data and each call to the function returns the processed output.
* The library provides separate functions for Q31 and floating-point data types. * The library provides separate functions for Q31 and floating-point data types.
* \par Algorithm * \par Algorithm
* \image html clarkeInvFormula.gif * \image html clarkeInvFormula.gif
...@@ -5498,7 +5171,7 @@ extern "C" ...@@ -5498,7 +5171,7 @@ extern "C"
*/ */
__STATIC_INLINE void arm_inv_clarke_f32( static __INLINE void arm_inv_clarke_f32(
float32_t Ialpha, float32_t Ialpha,
float32_t Ibeta, float32_t Ibeta,
float32_t * pIa, float32_t * pIa,
...@@ -5513,7 +5186,7 @@ extern "C" ...@@ -5513,7 +5186,7 @@ extern "C"
} }
/** /**
* @brief Inverse Clarke transform for Q31 version * @brief Inverse Clarke transform for Q31 version
* @param[in] Ialpha input two-phase orthogonal vector axis alpha * @param[in] Ialpha input two-phase orthogonal vector axis alpha
* @param[in] Ibeta input two-phase orthogonal vector axis beta * @param[in] Ibeta input two-phase orthogonal vector axis beta
* @param[out] *pIa points to output three-phase coordinate <code>a</code> * @param[out] *pIa points to output three-phase coordinate <code>a</code>
...@@ -5527,7 +5200,7 @@ extern "C" ...@@ -5527,7 +5200,7 @@ extern "C"
* There is saturation on the subtraction, hence there is no risk of overflow. * There is saturation on the subtraction, hence there is no risk of overflow.
*/ */
__STATIC_INLINE void arm_inv_clarke_q31( static __INLINE void arm_inv_clarke_q31(
q31_t Ialpha, q31_t Ialpha,
q31_t Ibeta, q31_t Ibeta,
q31_t * pIa, q31_t * pIa,
...@@ -5575,19 +5248,19 @@ extern "C" ...@@ -5575,19 +5248,19 @@ extern "C"
* @defgroup park Vector Park Transform * @defgroup park Vector Park Transform
* *
* Forward Park transform converts the input two-coordinate vector to flux and torque components. * Forward Park transform converts the input two-coordinate vector to flux and torque components.
* The Park transform can be used to realize the transformation of the <code>Ialpha</code> and the <code>Ibeta</code> currents * The Park transform can be used to realize the transformation of the <code>Ialpha</code> and the <code>Ibeta</code> currents
* from the stationary to the moving reference frame and control the spatial relationship between * from the stationary to the moving reference frame and control the spatial relationship between
* the stator vector current and rotor flux vector. * the stator vector current and rotor flux vector.
* If we consider the d axis aligned with the rotor flux, the diagram below shows the * If we consider the d axis aligned with the rotor flux, the diagram below shows the
* current vector and the relationship from the two reference frames: * current vector and the relationship from the two reference frames:
* \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame" * \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame"
* *
* The function operates on a single sample of data and each call to the function returns the processed output. * The function operates on a single sample of data and each call to the function returns the processed output.
* The library provides separate functions for Q31 and floating-point data types. * The library provides separate functions for Q31 and floating-point data types.
* \par Algorithm * \par Algorithm
* \image html parkFormula.gif * \image html parkFormula.gif
* where <code>Ialpha</code> and <code>Ibeta</code> are the stator vector components, * where <code>Ialpha</code> and <code>Ibeta</code> are the stator vector components,
* <code>pId</code> and <code>pIq</code> are rotor vector components and <code>cosVal</code> and <code>sinVal</code> are the * <code>pId</code> and <code>pIq</code> are rotor vector components and <code>cosVal</code> and <code>sinVal</code> are the
* cosine and sine values of theta (rotor flux position). * cosine and sine values of theta (rotor flux position).
* \par Fixed-Point Behavior * \par Fixed-Point Behavior
* Care must be taken when using the Q31 version of the Park transform. * Care must be taken when using the Q31 version of the Park transform.
...@@ -5614,7 +5287,7 @@ extern "C" ...@@ -5614,7 +5287,7 @@ extern "C"
* *
*/ */
__STATIC_INLINE void arm_park_f32( static __INLINE void arm_park_f32(
float32_t Ialpha, float32_t Ialpha,
float32_t Ibeta, float32_t Ibeta,
float32_t * pId, float32_t * pId,
...@@ -5631,7 +5304,7 @@ extern "C" ...@@ -5631,7 +5304,7 @@ extern "C"
} }
/** /**
* @brief Park transform for Q31 version * @brief Park transform for Q31 version
* @param[in] Ialpha input two-phase vector coordinate alpha * @param[in] Ialpha input two-phase vector coordinate alpha
* @param[in] Ibeta input two-phase vector coordinate beta * @param[in] Ibeta input two-phase vector coordinate beta
* @param[out] *pId points to output rotor reference frame d * @param[out] *pId points to output rotor reference frame d
...@@ -5648,7 +5321,7 @@ extern "C" ...@@ -5648,7 +5321,7 @@ extern "C"
*/ */
__STATIC_INLINE void arm_park_q31( static __INLINE void arm_park_q31(
q31_t Ialpha, q31_t Ialpha,
q31_t Ibeta, q31_t Ibeta,
q31_t * pId, q31_t * pId,
...@@ -5704,12 +5377,12 @@ extern "C" ...@@ -5704,12 +5377,12 @@ extern "C"
* @defgroup inv_park Vector Inverse Park transform * @defgroup inv_park Vector Inverse Park transform
* Inverse Park transform converts the input flux and torque components to two-coordinate vector. * Inverse Park transform converts the input flux and torque components to two-coordinate vector.
* *
* The function operates on a single sample of data and each call to the function returns the processed output. * The function operates on a single sample of data and each call to the function returns the processed output.
* The library provides separate functions for Q31 and floating-point data types. * The library provides separate functions for Q31 and floating-point data types.
* \par Algorithm * \par Algorithm
* \image html parkInvFormula.gif * \image html parkInvFormula.gif
* where <code>pIalpha</code> and <code>pIbeta</code> are the stator vector components, * where <code>pIalpha</code> and <code>pIbeta</code> are the stator vector components,
* <code>Id</code> and <code>Iq</code> are rotor vector components and <code>cosVal</code> and <code>sinVal</code> are the * <code>Id</code> and <code>Iq</code> are rotor vector components and <code>cosVal</code> and <code>sinVal</code> are the
* cosine and sine values of theta (rotor flux position). * cosine and sine values of theta (rotor flux position).
* \par Fixed-Point Behavior * \par Fixed-Point Behavior
* Care must be taken when using the Q31 version of the Park transform. * Care must be taken when using the Q31 version of the Park transform.
...@@ -5733,7 +5406,7 @@ extern "C" ...@@ -5733,7 +5406,7 @@ extern "C"
* @return none. * @return none.
*/ */
__STATIC_INLINE void arm_inv_park_f32( static __INLINE void arm_inv_park_f32(
float32_t Id, float32_t Id,
float32_t Iq, float32_t Iq,
float32_t * pIalpha, float32_t * pIalpha,
...@@ -5751,7 +5424,7 @@ extern "C" ...@@ -5751,7 +5424,7 @@ extern "C"
/** /**
* @brief Inverse Park transform for Q31 version * @brief Inverse Park transform for Q31 version
* @param[in] Id input coordinate of rotor reference frame d * @param[in] Id input coordinate of rotor reference frame d
* @param[in] Iq input coordinate of rotor reference frame q * @param[in] Iq input coordinate of rotor reference frame q
* @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha
...@@ -5768,7 +5441,7 @@ extern "C" ...@@ -5768,7 +5441,7 @@ extern "C"
*/ */
__STATIC_INLINE void arm_inv_park_q31( static __INLINE void arm_inv_park_q31(
q31_t Id, q31_t Id,
q31_t Iq, q31_t Iq,
q31_t * pIalpha, q31_t * pIalpha,
...@@ -5827,7 +5500,7 @@ extern "C" ...@@ -5827,7 +5500,7 @@ extern "C"
* Linear interpolation is a method of curve fitting using linear polynomials. * Linear interpolation is a method of curve fitting using linear polynomials.
* Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line * Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line
* *
* \par * \par
* \image html LinearInterp.gif "Linear interpolation" * \image html LinearInterp.gif "Linear interpolation"
* *
* \par * \par
...@@ -5847,10 +5520,10 @@ extern "C" ...@@ -5847,10 +5520,10 @@ extern "C"
* sample of data and each call to the function returns a single processed value. * sample of data and each call to the function returns a single processed value.
* <code>S</code> points to an instance of the Linear Interpolate function data structure. * <code>S</code> points to an instance of the Linear Interpolate function data structure.
* <code>x</code> is the input sample value. The functions returns the output value. * <code>x</code> is the input sample value. The functions returns the output value.
* *
* \par * \par
* if x is outside of the table boundary, Linear interpolation returns first value of the table * if x is outside of the table boundary, Linear interpolation returns first value of the table
* if x is below input range and returns last value of table if x is above range. * if x is below input range and returns last value of table if x is above range.
*/ */
/** /**
...@@ -5866,7 +5539,7 @@ extern "C" ...@@ -5866,7 +5539,7 @@ extern "C"
* *
*/ */
__STATIC_INLINE float32_t arm_linear_interp_f32( static __INLINE float32_t arm_linear_interp_f32(
arm_linear_interp_instance_f32 * S, arm_linear_interp_instance_f32 * S,
float32_t x) float32_t x)
{ {
...@@ -5879,14 +5552,14 @@ extern "C" ...@@ -5879,14 +5552,14 @@ extern "C"
float32_t *pYData = S->pYData; /* pointer to output table */ float32_t *pYData = S->pYData; /* pointer to output table */
/* Calculation of index */ /* Calculation of index */
i = (x - S->x1) / xSpacing; i = (int32_t) ((x - S->x1) / xSpacing);
if(i < 0) if(i < 0)
{ {
/* Iniatilize output for below specified range as least output value of table */ /* Iniatilize output for below specified range as least output value of table */
y = pYData[0]; y = pYData[0];
} }
else if(i >= S->nValues) else if((uint32_t)i >= S->nValues)
{ {
/* Iniatilize output for above specified range as last output value of table */ /* Iniatilize output for above specified range as last output value of table */
y = pYData[S->nValues - 1]; y = pYData[S->nValues - 1];
...@@ -5925,7 +5598,7 @@ extern "C" ...@@ -5925,7 +5598,7 @@ extern "C"
*/ */
__STATIC_INLINE q31_t arm_linear_interp_q31( static __INLINE q31_t arm_linear_interp_q31(
q31_t * pYData, q31_t * pYData,
q31_t x, q31_t x,
uint32_t nValues) uint32_t nValues)
...@@ -5940,7 +5613,7 @@ extern "C" ...@@ -5940,7 +5613,7 @@ extern "C"
/* Index value calculation */ /* Index value calculation */
index = ((x & 0xFFF00000) >> 20); index = ((x & 0xFFF00000) >> 20);
if(index >= (nValues - 1)) if(index >= (int32_t)(nValues - 1))
{ {
return (pYData[nValues - 1]); return (pYData[nValues - 1]);
} }
...@@ -5982,12 +5655,12 @@ extern "C" ...@@ -5982,12 +5655,12 @@ extern "C"
* *
* \par * \par
* Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part.
* This function can support maximum of table size 2^12. * This function can support maximum of table size 2^12.
* *
*/ */
__STATIC_INLINE q15_t arm_linear_interp_q15( static __INLINE q15_t arm_linear_interp_q15(
q15_t * pYData, q15_t * pYData,
q31_t x, q31_t x,
uint32_t nValues) uint32_t nValues)
...@@ -6002,7 +5675,7 @@ extern "C" ...@@ -6002,7 +5675,7 @@ extern "C"
/* Index value calculation */ /* Index value calculation */
index = ((x & 0xFFF00000) >> 20u); index = ((x & 0xFFF00000) >> 20u);
if(index >= (nValues - 1)) if(index >= (int32_t)(nValues - 1))
{ {
return (pYData[nValues - 1]); return (pYData[nValues - 1]);
} }
...@@ -6047,7 +5720,7 @@ extern "C" ...@@ -6047,7 +5720,7 @@ extern "C"
*/ */
__STATIC_INLINE q7_t arm_linear_interp_q7( static __INLINE q7_t arm_linear_interp_q7(
q7_t * pYData, q7_t * pYData,
q31_t x, q31_t x,
uint32_t nValues) uint32_t nValues)
...@@ -6055,22 +5728,22 @@ extern "C" ...@@ -6055,22 +5728,22 @@ extern "C"
q31_t y; /* output */ q31_t y; /* output */
q7_t y0, y1; /* Nearest output values */ q7_t y0, y1; /* Nearest output values */
q31_t fract; /* fractional part */ q31_t fract; /* fractional part */
int32_t index; /* Index to read nearest output values */ uint32_t index; /* Index to read nearest output values */
/* Input is in 12.20 format */ /* Input is in 12.20 format */
/* 12 bits for the table index */ /* 12 bits for the table index */
/* Index value calculation */ /* Index value calculation */
index = ((x & 0xFFF00000) >> 20u); if (x < 0)
{
return (pYData[0]);
}
index = (x >> 20) & 0xfff;
if(index >= (nValues - 1)) if(index >= (nValues - 1))
{ {
return (pYData[nValues - 1]); return (pYData[nValues - 1]);
} }
else if(index < 0)
{
return (pYData[0]);
}
else else
{ {
...@@ -6162,14 +5835,14 @@ extern "C" ...@@ -6162,14 +5835,14 @@ extern "C"
* @defgroup SQRT Square Root * @defgroup SQRT Square Root
* *
* Computes the square root of a number. * Computes the square root of a number.
* There are separate functions for Q15, Q31, and floating-point data types. * There are separate functions for Q15, Q31, and floating-point data types.
* The square root function is computed using the Newton-Raphson algorithm. * The square root function is computed using the Newton-Raphson algorithm.
* This is an iterative algorithm of the form: * This is an iterative algorithm of the form:
* <pre> * <pre>
* x1 = x0 - f(x0)/f'(x0) * x1 = x0 - f(x0)/f'(x0)
* </pre> * </pre>
* where <code>x1</code> is the current estimate, * where <code>x1</code> is the current estimate,
* <code>x0</code> is the previous estimate and * <code>x0</code> is the previous estimate, and
* <code>f'(x0)</code> is the derivative of <code>f()</code> evaluated at <code>x0</code>. * <code>f'(x0)</code> is the derivative of <code>f()</code> evaluated at <code>x0</code>.
* For the square root function, the algorithm reduces to: * For the square root function, the algorithm reduces to:
* <pre> * <pre>
...@@ -6192,21 +5865,19 @@ extern "C" ...@@ -6192,21 +5865,19 @@ extern "C"
* <code>in</code> is negative value and returns zero output for negative values. * <code>in</code> is negative value and returns zero output for negative values.
*/ */
__STATIC_INLINE arm_status arm_sqrt_f32( static __INLINE arm_status arm_sqrt_f32(
float32_t in, float32_t in,
float32_t * pOut) float32_t * pOut)
{ {
if(in > 0) if(in > 0)
{ {
// #if __FPU_USED // #if __FPU_USED
#if (__FPU_USED == 1) && defined ( __CC_ARM ) #if (__FPU_USED == 1) && defined ( __CC_ARM )
*pOut = __sqrtf(in); *pOut = __sqrtf(in);
#elif (__FPU_USED == 1) && defined ( __TMS_740 ) #else
*pOut = __builtin_sqrtf(in); *pOut = sqrtf(in);
#else #endif
*pOut = sqrtf(in);
#endif
return (ARM_MATH_SUCCESS); return (ARM_MATH_SUCCESS);
} }
...@@ -6254,7 +5925,7 @@ extern "C" ...@@ -6254,7 +5925,7 @@ extern "C"
* @brief floating-point Circular write function. * @brief floating-point Circular write function.
*/ */
__STATIC_INLINE void arm_circularWrite_f32( static __INLINE void arm_circularWrite_f32(
int32_t * circBuffer, int32_t * circBuffer,
int32_t L, int32_t L,
uint16_t * writeOffset, uint16_t * writeOffset,
...@@ -6299,7 +5970,7 @@ extern "C" ...@@ -6299,7 +5970,7 @@ extern "C"
/** /**
* @brief floating-point Circular Read function. * @brief floating-point Circular Read function.
*/ */
__STATIC_INLINE void arm_circularRead_f32( static __INLINE void arm_circularRead_f32(
int32_t * circBuffer, int32_t * circBuffer,
int32_t L, int32_t L,
int32_t * readOffset, int32_t * readOffset,
...@@ -6354,7 +6025,7 @@ extern "C" ...@@ -6354,7 +6025,7 @@ extern "C"
* @brief Q15 Circular write function. * @brief Q15 Circular write function.
*/ */
__STATIC_INLINE void arm_circularWrite_q15( static __INLINE void arm_circularWrite_q15(
q15_t * circBuffer, q15_t * circBuffer,
int32_t L, int32_t L,
uint16_t * writeOffset, uint16_t * writeOffset,
...@@ -6399,7 +6070,7 @@ extern "C" ...@@ -6399,7 +6070,7 @@ extern "C"
/** /**
* @brief Q15 Circular Read function. * @brief Q15 Circular Read function.
*/ */
__STATIC_INLINE void arm_circularRead_q15( static __INLINE void arm_circularRead_q15(
q15_t * circBuffer, q15_t * circBuffer,
int32_t L, int32_t L,
int32_t * readOffset, int32_t * readOffset,
...@@ -6456,7 +6127,7 @@ extern "C" ...@@ -6456,7 +6127,7 @@ extern "C"
* @brief Q7 Circular write function. * @brief Q7 Circular write function.
*/ */
__STATIC_INLINE void arm_circularWrite_q7( static __INLINE void arm_circularWrite_q7(
q7_t * circBuffer, q7_t * circBuffer,
int32_t L, int32_t L,
uint16_t * writeOffset, uint16_t * writeOffset,
...@@ -6501,7 +6172,7 @@ extern "C" ...@@ -6501,7 +6172,7 @@ extern "C"
/** /**
* @brief Q7 Circular Read function. * @brief Q7 Circular Read function.
*/ */
__STATIC_INLINE void arm_circularRead_q7( static __INLINE void arm_circularRead_q7(
q7_t * circBuffer, q7_t * circBuffer,
int32_t L, int32_t L,
int32_t * readOffset, int32_t * readOffset,
...@@ -7072,11 +6743,11 @@ extern "C" ...@@ -7072,11 +6743,11 @@ extern "C"
uint32_t numSamples); uint32_t numSamples);
/** /**
* @brief Converts the elements of the floating-point vector to Q31 vector. * @brief Converts the elements of the floating-point vector to Q31 vector.
* @param[in] *pSrc points to the floating-point input vector * @param[in] *pSrc points to the floating-point input vector
* @param[out] *pDst points to the Q31 output vector * @param[out] *pDst points to the Q31 output vector
* @param[in] blockSize length of the input vector * @param[in] blockSize length of the input vector
* @return none. * @return none.
*/ */
void arm_float_to_q31( void arm_float_to_q31(
float32_t * pSrc, float32_t * pSrc,
...@@ -7084,10 +6755,10 @@ extern "C" ...@@ -7084,10 +6755,10 @@ extern "C"
uint32_t blockSize); uint32_t blockSize);
/** /**
* @brief Converts the elements of the floating-point vector to Q15 vector. * @brief Converts the elements of the floating-point vector to Q15 vector.
* @param[in] *pSrc points to the floating-point input vector * @param[in] *pSrc points to the floating-point input vector
* @param[out] *pDst points to the Q15 output vector * @param[out] *pDst points to the Q15 output vector
* @param[in] blockSize length of the input vector * @param[in] blockSize length of the input vector
* @return none * @return none
*/ */
void arm_float_to_q15( void arm_float_to_q15(
...@@ -7096,10 +6767,10 @@ extern "C" ...@@ -7096,10 +6767,10 @@ extern "C"
uint32_t blockSize); uint32_t blockSize);
/** /**
* @brief Converts the elements of the floating-point vector to Q7 vector. * @brief Converts the elements of the floating-point vector to Q7 vector.
* @param[in] *pSrc points to the floating-point input vector * @param[in] *pSrc points to the floating-point input vector
* @param[out] *pDst points to the Q7 output vector * @param[out] *pDst points to the Q7 output vector
* @param[in] blockSize length of the input vector * @param[in] blockSize length of the input vector
* @return none * @return none
*/ */
void arm_float_to_q7( void arm_float_to_q7(
...@@ -7219,12 +6890,12 @@ extern "C" ...@@ -7219,12 +6890,12 @@ extern "C"
* + f(XF, YF+1) * (1-(x-XF))*(y-YF) * + f(XF, YF+1) * (1-(x-XF))*(y-YF)
* + f(XF+1, YF+1) * (x-XF)*(y-YF) * + f(XF+1, YF+1) * (x-XF)*(y-YF)
* </pre> * </pre>
* Note that the coordinates (x, y) contain integer and fractional components. * Note that the coordinates (x, y) contain integer and fractional components.
* The integer components specify which portion of the table to use while the * The integer components specify which portion of the table to use while the
* fractional components control the interpolation processor. * fractional components control the interpolation processor.
* *
* \par * \par
* if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output. * if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output.
*/ */
/** /**
...@@ -7242,7 +6913,7 @@ extern "C" ...@@ -7242,7 +6913,7 @@ extern "C"
*/ */
__STATIC_INLINE float32_t arm_bilinear_interp_f32( static __INLINE float32_t arm_bilinear_interp_f32(
const arm_bilinear_interp_instance_f32 * S, const arm_bilinear_interp_instance_f32 * S,
float32_t X, float32_t X,
float32_t Y) float32_t Y)
...@@ -7310,7 +6981,7 @@ extern "C" ...@@ -7310,7 +6981,7 @@ extern "C"
* @return out interpolated value. * @return out interpolated value.
*/ */
__STATIC_INLINE q31_t arm_bilinear_interp_q31( static __INLINE q31_t arm_bilinear_interp_q31(
arm_bilinear_interp_instance_q31 * S, arm_bilinear_interp_instance_q31 * S,
q31_t X, q31_t X,
q31_t Y) q31_t Y)
...@@ -7386,7 +7057,7 @@ extern "C" ...@@ -7386,7 +7057,7 @@ extern "C"
* @return out interpolated value. * @return out interpolated value.
*/ */
__STATIC_INLINE q15_t arm_bilinear_interp_q15( static __INLINE q15_t arm_bilinear_interp_q15(
arm_bilinear_interp_instance_q15 * S, arm_bilinear_interp_instance_q15 * S,
q31_t X, q31_t X,
q31_t Y) q31_t Y)
...@@ -7466,7 +7137,7 @@ extern "C" ...@@ -7466,7 +7137,7 @@ extern "C"
* @return out interpolated value. * @return out interpolated value.
*/ */
__STATIC_INLINE q7_t arm_bilinear_interp_q7( static __INLINE q7_t arm_bilinear_interp_q7(
arm_bilinear_interp_instance_q7 * S, arm_bilinear_interp_instance_q7 * S,
q31_t X, q31_t X,
q31_t Y) q31_t Y)
...@@ -7539,6 +7210,84 @@ extern "C" ...@@ -7539,6 +7210,84 @@ extern "C"
*/ */
#if defined ( __CC_ARM ) //Keil
//SMMLAR
#define multAcc_32x32_keep32_R(a, x, y) \
a = (q31_t) (((((q63_t) a) << 32) + ((q63_t) x * y) + 0x80000000LL ) >> 32)
//SMMLSR
#define multSub_32x32_keep32_R(a, x, y) \
a = (q31_t) (((((q63_t) a) << 32) - ((q63_t) x * y) + 0x80000000LL ) >> 32)
//SMMULR
#define mult_32x32_keep32_R(a, x, y) \
a = (q31_t) (((q63_t) x * y + 0x80000000LL ) >> 32)
//Enter low optimization region - place directly above function definition
#define LOW_OPTIMIZATION_ENTER \
_Pragma ("push") \
_Pragma ("O1")
//Exit low optimization region - place directly after end of function definition
#define LOW_OPTIMIZATION_EXIT \
_Pragma ("pop")
//Enter low optimization region - place directly above function definition
#define IAR_ONLY_LOW_OPTIMIZATION_ENTER
//Exit low optimization region - place directly after end of function definition
#define IAR_ONLY_LOW_OPTIMIZATION_EXIT
#elif defined(__ICCARM__) //IAR
//SMMLA
#define multAcc_32x32_keep32_R(a, x, y) \
a += (q31_t) (((q63_t) x * y) >> 32)
//SMMLS
#define multSub_32x32_keep32_R(a, x, y) \
a -= (q31_t) (((q63_t) x * y) >> 32)
//SMMUL
#define mult_32x32_keep32_R(a, x, y) \
a = (q31_t) (((q63_t) x * y ) >> 32)
//Enter low optimization region - place directly above function definition
#define LOW_OPTIMIZATION_ENTER \
_Pragma ("optimize=low")
//Exit low optimization region - place directly after end of function definition
#define LOW_OPTIMIZATION_EXIT
//Enter low optimization region - place directly above function definition
#define IAR_ONLY_LOW_OPTIMIZATION_ENTER \
_Pragma ("optimize=low")
//Exit low optimization region - place directly after end of function definition
#define IAR_ONLY_LOW_OPTIMIZATION_EXIT
#elif defined(__GNUC__)
//SMMLA
#define multAcc_32x32_keep32_R(a, x, y) \
a += (q31_t) (((q63_t) x * y) >> 32)
//SMMLS
#define multSub_32x32_keep32_R(a, x, y) \
a -= (q31_t) (((q63_t) x * y) >> 32)
//SMMUL
#define mult_32x32_keep32_R(a, x, y) \
a = (q31_t) (((q63_t) x * y ) >> 32)
#define LOW_OPTIMIZATION_ENTER __attribute__(( optimize("-O1") ))
#define LOW_OPTIMIZATION_EXIT
#define IAR_ONLY_LOW_OPTIMIZATION_ENTER
#define IAR_ONLY_LOW_OPTIMIZATION_EXIT
#endif
......
/**************************************************************************//** /**************************************************************************//**
* @file core_cm0.h * @file core_cm0.h
* @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File
* @version V3.01 * @version V3.20
* @date 13. March 2012 * @date 25. February 2013
* *
* @note * @note
* Copyright (C) 2009-2012 ARM Limited. All rights reserved.
*
* @par
* ARM Limited (ARM) is supplying this software for use with Cortex-M
* processor based microcontrollers. This file can be freely distributed
* within development tools that are supporting such ARM based processors.
*
* @par
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
* *
******************************************************************************/ ******************************************************************************/
/* Copyright (c) 2009 - 2013 ARM LIMITED
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
- Neither the name of ARM nor the names of its contributors may be used
to endorse or promote products derived from this software without
specific prior written permission.
*
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
#if defined ( __ICCARM__ ) #if defined ( __ICCARM__ )
#pragma system_include /* treat file as system include file for MISRA check */ #pragma system_include /* treat file as system include file for MISRA check */
#endif #endif
...@@ -54,7 +69,7 @@ ...@@ -54,7 +69,7 @@
/* CMSIS CM0 definitions */ /* CMSIS CM0 definitions */
#define __CM0_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ #define __CM0_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */
#define __CM0_CMSIS_VERSION_SUB (0x01) /*!< [15:0] CMSIS HAL sub version */ #define __CM0_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL sub version */
#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16) | \ #define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16) | \
__CM0_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ __CM0_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */
...@@ -590,9 +605,9 @@ __STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) ...@@ -590,9 +605,9 @@ __STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)
{ {
if(IRQn < 0) { if(IRQn < 0) {
return((uint32_t)((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M0 system interrupts */ return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M0 system interrupts */
else { else {
return((uint32_t)((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */
} }
...@@ -640,9 +655,9 @@ __STATIC_INLINE void NVIC_SystemReset(void) ...@@ -640,9 +655,9 @@ __STATIC_INLINE void NVIC_SystemReset(void)
*/ */
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{ {
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ SysTick->LOAD = ticks - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
SysTick->VAL = 0; /* Load the SysTick Counter Value */ SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
......
/**************************************************************************//** /**************************************************************************//**
* @file core_cm0plus.h * @file core_cm0plus.h
* @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File
* @version V3.01 * @version V3.20
* @date 22. March 2012 * @date 25. February 2013
* *
* @note * @note
* Copyright (C) 2009-2012 ARM Limited. All rights reserved.
*
* @par
* ARM Limited (ARM) is supplying this software for use with Cortex-M
* processor based microcontrollers. This file can be freely distributed
* within development tools that are supporting such ARM based processors.
*
* @par
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
* *
******************************************************************************/ ******************************************************************************/
/* Copyright (c) 2009 - 2013 ARM LIMITED
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
- Neither the name of ARM nor the names of its contributors may be used
to endorse or promote products derived from this software without
specific prior written permission.
*
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
#if defined ( __ICCARM__ ) #if defined ( __ICCARM__ )
#pragma system_include /* treat file as system include file for MISRA check */ #pragma system_include /* treat file as system include file for MISRA check */
#endif #endif
...@@ -54,7 +69,7 @@ ...@@ -54,7 +69,7 @@
/* CMSIS CM0P definitions */ /* CMSIS CM0P definitions */
#define __CM0PLUS_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ #define __CM0PLUS_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */
#define __CM0PLUS_CMSIS_VERSION_SUB (0x01) /*!< [15:0] CMSIS HAL sub version */ #define __CM0PLUS_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL sub version */
#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16) | \ #define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16) | \
__CM0PLUS_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */ __CM0PLUS_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */
...@@ -361,8 +376,8 @@ typedef struct ...@@ -361,8 +376,8 @@ typedef struct
#if (__VTOR_PRESENT == 1) #if (__VTOR_PRESENT == 1)
/* SCB Interrupt Control State Register Definitions */ /* SCB Interrupt Control State Register Definitions */
#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ #define SCB_VTOR_TBLOFF_Pos 8 /*!< SCB VTOR: TBLOFF Position */
#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ #define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */
#endif #endif
/* SCB Application Interrupt and Reset Control Register Definitions */ /* SCB Application Interrupt and Reset Control Register Definitions */
...@@ -701,9 +716,9 @@ __STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) ...@@ -701,9 +716,9 @@ __STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)
{ {
if(IRQn < 0) { if(IRQn < 0) {
return((uint32_t)((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M0+ system interrupts */ return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M0 system interrupts */
else { else {
return((uint32_t)((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */
} }
...@@ -751,9 +766,9 @@ __STATIC_INLINE void NVIC_SystemReset(void) ...@@ -751,9 +766,9 @@ __STATIC_INLINE void NVIC_SystemReset(void)
*/ */
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{ {
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ SysTick->LOAD = ticks - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
SysTick->VAL = 0; /* Load the SysTick Counter Value */ SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
......
/**************************************************************************//** /**************************************************************************//**
* @file core_cm3.h * @file core_cm3.h
* @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File
* @version V3.01 * @version V3.20
* @date 22. March 2012 * @date 25. February 2013
* *
* @note * @note
* Copyright (C) 2009-2012 ARM Limited. All rights reserved.
*
* @par
* ARM Limited (ARM) is supplying this software for use with Cortex-M
* processor based microcontrollers. This file can be freely distributed
* within development tools that are supporting such ARM based processors.
*
* @par
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
* *
******************************************************************************/ ******************************************************************************/
/* Copyright (c) 2009 - 2013 ARM LIMITED
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
- Neither the name of ARM nor the names of its contributors may be used
to endorse or promote products derived from this software without
specific prior written permission.
*
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
#if defined ( __ICCARM__ ) #if defined ( __ICCARM__ )
#pragma system_include /* treat file as system include file for MISRA check */ #pragma system_include /* treat file as system include file for MISRA check */
#endif #endif
...@@ -54,7 +69,7 @@ ...@@ -54,7 +69,7 @@
/* CMSIS CM3 definitions */ /* CMSIS CM3 definitions */
#define __CM3_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ #define __CM3_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */
#define __CM3_CMSIS_VERSION_SUB (0x01) /*!< [15:0] CMSIS HAL sub version */ #define __CM3_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL sub version */
#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16) | \ #define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16) | \
__CM3_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ __CM3_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */
...@@ -636,14 +651,14 @@ typedef struct ...@@ -636,14 +651,14 @@ typedef struct
__IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */
uint32_t RESERVED2[15]; uint32_t RESERVED2[15];
__IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */
uint32_t RESERVED3[29]; uint32_t RESERVED3[29];
__O uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ __O uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */
__I uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ __I uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */
__IO uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ __IO uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */
uint32_t RESERVED4[43]; uint32_t RESERVED4[43];
__O uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ __O uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */
__I uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ __I uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */
uint32_t RESERVED5[6]; uint32_t RESERVED5[6];
__I uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ __I uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */
__I uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ __I uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */
__I uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ __I uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */
...@@ -1516,9 +1531,9 @@ __STATIC_INLINE void NVIC_SystemReset(void) ...@@ -1516,9 +1531,9 @@ __STATIC_INLINE void NVIC_SystemReset(void)
*/ */
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{ {
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ SysTick->LOAD = ticks - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
SysTick->VAL = 0; /* Load the SysTick Counter Value */ SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
......
/**************************************************************************//** /**************************************************************************//**
* @file core_cm4.h * @file core_cm4.h
* @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File
* @version V3.01 * @version V3.20
* @date 22. March 2012 * @date 25. February 2013
* *
* @note * @note
* Copyright (C) 2009-2012 ARM Limited. All rights reserved.
*
* @par
* ARM Limited (ARM) is supplying this software for use with Cortex-M
* processor based microcontrollers. This file can be freely distributed
* within development tools that are supporting such ARM based processors.
*
* @par
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
* *
******************************************************************************/ ******************************************************************************/
/* Copyright (c) 2009 - 2013 ARM LIMITED
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
- Neither the name of ARM nor the names of its contributors may be used
to endorse or promote products derived from this software without
specific prior written permission.
*
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
#if defined ( __ICCARM__ ) #if defined ( __ICCARM__ )
#pragma system_include /* treat file as system include file for MISRA check */ #pragma system_include /* treat file as system include file for MISRA check */
#endif #endif
...@@ -54,7 +69,7 @@ ...@@ -54,7 +69,7 @@
/* CMSIS CM4 definitions */ /* CMSIS CM4 definitions */
#define __CM4_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ #define __CM4_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */
#define __CM4_CMSIS_VERSION_SUB (0x01) /*!< [15:0] CMSIS HAL sub version */ #define __CM4_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL sub version */
#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16) | \ #define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16) | \
__CM4_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ __CM4_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */
...@@ -669,14 +684,14 @@ typedef struct ...@@ -669,14 +684,14 @@ typedef struct
__IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */
uint32_t RESERVED2[15]; uint32_t RESERVED2[15];
__IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */
uint32_t RESERVED3[29]; uint32_t RESERVED3[29];
__O uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ __O uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */
__I uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ __I uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */
__IO uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ __IO uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */
uint32_t RESERVED4[43]; uint32_t RESERVED4[43];
__O uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ __O uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */
__I uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ __I uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */
uint32_t RESERVED5[6]; uint32_t RESERVED5[6];
__I uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ __I uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */
__I uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ __I uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */
__I uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ __I uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */
...@@ -1661,9 +1676,9 @@ __STATIC_INLINE void NVIC_SystemReset(void) ...@@ -1661,9 +1676,9 @@ __STATIC_INLINE void NVIC_SystemReset(void)
*/ */
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{ {
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ SysTick->LOAD = ticks - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
SysTick->VAL = 0; /* Load the SysTick Counter Value */ SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
......
/**************************************************************************//** /**************************************************************************//**
* @file core_cm4_simd.h * @file core_cm4_simd.h
* @brief CMSIS Cortex-M4 SIMD Header File * @brief CMSIS Cortex-M4 SIMD Header File
* @version V3.01 * @version V3.20
* @date 06. March 2012 * @date 25. February 2013
* *
* @note * @note
* Copyright (C) 2010-2012 ARM Limited. All rights reserved.
*
* @par
* ARM Limited (ARM) is supplying this software for use with Cortex-M
* processor based microcontrollers. This file can be freely distributed
* within development tools that are supporting such ARM based processors.
*
* @par
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
* *
******************************************************************************/ ******************************************************************************/
/* Copyright (c) 2009 - 2013 ARM LIMITED
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
- Neither the name of ARM nor the names of its contributors may be used
to endorse or promote products derived from this software without
specific prior written permission.
*
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
...@@ -110,6 +124,8 @@ ...@@ -110,6 +124,8 @@
#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ #define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \
((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) )
#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \
((int64_t)(ARG3) << 32) ) >> 32))
/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
...@@ -624,6 +640,14 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB(uint32_t op1, ...@@ -624,6 +640,14 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB(uint32_t op1,
__RES; \ __RES; \
}) })
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3)
{
int32_t result;
__ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) );
return(result);
}
/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
......
/**************************************************************************//** /**************************************************************************//**
* @file core_cmFunc.h * @file core_cmFunc.h
* @brief CMSIS Cortex-M Core Function Access Header File * @brief CMSIS Cortex-M Core Function Access Header File
* @version V3.01 * @version V3.20
* @date 06. March 2012 * @date 25. February 2013
* *
* @note * @note
* Copyright (C) 2009-2012 ARM Limited. All rights reserved.
*
* @par
* ARM Limited (ARM) is supplying this software for use with Cortex-M
* processor based microcontrollers. This file can be freely distributed
* within development tools that are supporting such ARM based processors.
*
* @par
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
* *
******************************************************************************/ ******************************************************************************/
/* Copyright (c) 2009 - 2013 ARM LIMITED
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
- Neither the name of ARM nor the names of its contributors may be used
to endorse or promote products derived from this software without
specific prior written permission.
*
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
#ifndef __CORE_CMFUNC_H #ifndef __CORE_CMFUNC_H
#define __CORE_CMFUNC_H #define __CORE_CMFUNC_H
...@@ -314,7 +328,7 @@ __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) ...@@ -314,7 +328,7 @@ __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
*/ */
__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void) __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void)
{ {
__ASM volatile ("cpsie i"); __ASM volatile ("cpsie i" : : : "memory");
} }
...@@ -325,7 +339,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void) ...@@ -325,7 +339,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void)
*/ */
__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void) __attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void)
{ {
__ASM volatile ("cpsid i"); __ASM volatile ("cpsid i" : : : "memory");
} }
...@@ -352,7 +366,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void) ...@@ -352,7 +366,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void)
*/ */
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control) __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control)
{ {
__ASM volatile ("MSR control, %0" : : "r" (control) ); __ASM volatile ("MSR control, %0" : : "r" (control) : "memory");
} }
...@@ -424,7 +438,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void) ...@@ -424,7 +438,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void)
*/ */
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
{ {
__ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) ); __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) : "sp");
} }
...@@ -451,7 +465,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void) ...@@ -451,7 +465,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void)
*/ */
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
{ {
__ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) ); __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) : "sp");
} }
...@@ -478,7 +492,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void) ...@@ -478,7 +492,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void)
*/ */
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
{ {
__ASM volatile ("MSR primask, %0" : : "r" (priMask) ); __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory");
} }
...@@ -491,7 +505,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t p ...@@ -491,7 +505,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t p
*/ */
__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void) __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void)
{ {
__ASM volatile ("cpsie f"); __ASM volatile ("cpsie f" : : : "memory");
} }
...@@ -502,7 +516,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void) ...@@ -502,7 +516,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void)
*/ */
__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void) __attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void)
{ {
__ASM volatile ("cpsid f"); __ASM volatile ("cpsid f" : : : "memory");
} }
...@@ -529,7 +543,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void) ...@@ -529,7 +543,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void)
*/ */
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value) __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value)
{ {
__ASM volatile ("MSR basepri, %0" : : "r" (value) ); __ASM volatile ("MSR basepri, %0" : : "r" (value) : "memory");
} }
...@@ -556,7 +570,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void ...@@ -556,7 +570,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void
*/ */
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
{ {
__ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) ); __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory");
} }
#endif /* (__CORTEX_M >= 0x03) */ #endif /* (__CORTEX_M >= 0x03) */
...@@ -575,7 +589,10 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void) ...@@ -575,7 +589,10 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void)
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
uint32_t result; uint32_t result;
/* Empty asm statement works as a scheduling barrier */
__ASM volatile ("");
__ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); __ASM volatile ("VMRS %0, fpscr" : "=r" (result) );
__ASM volatile ("");
return(result); return(result);
#else #else
return(0); return(0);
...@@ -592,7 +609,10 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void) ...@@ -592,7 +609,10 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void)
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
{ {
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
__ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) ); /* Empty asm statement works as a scheduling barrier */
__ASM volatile ("");
__ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc");
__ASM volatile ("");
#endif #endif
} }
......
/**************************************************************************//** /**************************************************************************//**
* @file core_cmInstr.h * @file core_cmInstr.h
* @brief CMSIS Cortex-M Core Instruction Access Header File * @brief CMSIS Cortex-M Core Instruction Access Header File
* @version V3.01 * @version V3.20
* @date 06. March 2012 * @date 05. March 2013
* *
* @note * @note
* Copyright (C) 2009-2012 ARM Limited. All rights reserved.
*
* @par
* ARM Limited (ARM) is supplying this software for use with Cortex-M
* processor based microcontrollers. This file can be freely distributed
* within development tools that are supporting such ARM based processors.
*
* @par
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
* *
******************************************************************************/ ******************************************************************************/
/* Copyright (c) 2009 - 2013 ARM LIMITED
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
- Neither the name of ARM nor the names of its contributors may be used
to endorse or promote products derived from this software without
specific prior written permission.
*
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
#ifndef __CORE_CMINSTR_H #ifndef __CORE_CMINSTR_H
#define __CORE_CMINSTR_H #define __CORE_CMINSTR_H
...@@ -111,12 +125,13 @@ ...@@ -111,12 +125,13 @@
\param [in] value Value to reverse \param [in] value Value to reverse
\return Reversed value \return Reversed value
*/ */
#ifndef __NO_EMBEDDED_ASM
__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) __attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)
{ {
rev16 r0, r0 rev16 r0, r0
bx lr bx lr
} }
#endif
/** \brief Reverse byte order in signed short value /** \brief Reverse byte order in signed short value
...@@ -125,11 +140,13 @@ __attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(u ...@@ -125,11 +140,13 @@ __attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(u
\param [in] value Value to reverse \param [in] value Value to reverse
\return Reversed value \return Reversed value
*/ */
#ifndef __NO_EMBEDDED_ASM
__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value) __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value)
{ {
revsh r0, r0 revsh r0, r0
bx lr bx lr
} }
#endif
/** \brief Rotate Right in unsigned value (32 bit) /** \brief Rotate Right in unsigned value (32 bit)
...@@ -143,6 +160,17 @@ __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(in ...@@ -143,6 +160,17 @@ __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(in
#define __ROR __ror #define __ROR __ror
/** \brief Breakpoint
This function causes the processor to enter Debug state.
Debug tools can use this to investigate system state when the instruction at a particular address is reached.
\param [in] value is ignored by the processor.
If required, a debugger can use it to store additional information about the breakpoint.
*/
#define __BKPT(value) __breakpoint(value)
#if (__CORTEX_M >= 0x03) #if (__CORTEX_M >= 0x03)
/** \brief Reverse bit order of value /** \brief Reverse bit order of value
...@@ -279,6 +307,17 @@ __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(in ...@@ -279,6 +307,17 @@ __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(in
#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ #elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
/* GNU gcc specific functions */ /* GNU gcc specific functions */
/* Define macros for porting to both thumb1 and thumb2.
* For thumb1, use low register (r0-r7), specified by constrant "l"
* Otherwise, use general registers, specified by constrant "r" */
#if defined (__thumb__) && !defined (__thumb2__)
#define __CMSIS_GCC_OUT_REG(r) "=l" (r)
#define __CMSIS_GCC_USE_REG(r) "l" (r)
#else
#define __CMSIS_GCC_OUT_REG(r) "=r" (r)
#define __CMSIS_GCC_USE_REG(r) "r" (r)
#endif
/** \brief No Operation /** \brief No Operation
No Operation does nothing. This instruction can be used for code alignment purposes. No Operation does nothing. This instruction can be used for code alignment purposes.
...@@ -364,10 +403,14 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE void __DMB(void) ...@@ -364,10 +403,14 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE void __DMB(void)
*/ */
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV(uint32_t value) __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV(uint32_t value)
{ {
#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
return __builtin_bswap32(value);
#else
uint32_t result; uint32_t result;
__ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) ); __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
return(result); return(result);
#endif
} }
...@@ -382,7 +425,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t val ...@@ -382,7 +425,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t val
{ {
uint32_t result; uint32_t result;
__ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) ); __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
return(result); return(result);
} }
...@@ -396,10 +439,14 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t val ...@@ -396,10 +439,14 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t val
*/ */
__attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value) __attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value)
{ {
#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
return (short)__builtin_bswap16(value);
#else
uint32_t result; uint32_t result;
__ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) ); __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
return(result); return(result);
#endif
} }
...@@ -413,12 +460,21 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value ...@@ -413,12 +460,21 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value
*/ */
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2) __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2)
{ {
return (op1 >> op2) | (op1 << (32 - op2));
__ASM volatile ("ror %0, %0, %1" : "+r" (op1) : "r" (op2) );
return(op1);
} }
/** \brief Breakpoint
This function causes the processor to enter Debug state.
Debug tools can use this to investigate system state when the instruction at a particular address is reached.
\param [in] value is ignored by the processor.
If required, a debugger can use it to store additional information about the breakpoint.
*/
#define __BKPT(value) __ASM volatile ("bkpt "#value)
#if (__CORTEX_M >= 0x03) #if (__CORTEX_M >= 0x03)
/** \brief Reverse bit order of value /** \brief Reverse bit order of value
...@@ -446,9 +502,16 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RBIT(uint32_t valu ...@@ -446,9 +502,16 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RBIT(uint32_t valu
*/ */
__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr) __attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr)
{ {
uint8_t result; uint32_t result;
__ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) ); #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
__ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) );
#else
/* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
accepted by assembler. So has to use following less efficient pattern.
*/
__ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
#endif
return(result); return(result);
} }
...@@ -462,9 +525,16 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(volatile uin ...@@ -462,9 +525,16 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(volatile uin
*/ */
__attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr) __attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr)
{ {
uint16_t result; uint32_t result;
__ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) ); #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
__ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) );
#else
/* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
accepted by assembler. So has to use following less efficient pattern.
*/
__ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
#endif
return(result); return(result);
} }
...@@ -480,7 +550,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDREXW(volatile ui ...@@ -480,7 +550,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDREXW(volatile ui
{ {
uint32_t result; uint32_t result;
__ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) ); __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
return(result); return(result);
} }
...@@ -498,7 +568,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXB(uint8_t val ...@@ -498,7 +568,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXB(uint8_t val
{ {
uint32_t result; uint32_t result;
__ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) ); __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
return(result); return(result);
} }
...@@ -516,7 +586,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXH(uint16_t va ...@@ -516,7 +586,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXH(uint16_t va
{ {
uint32_t result; uint32_t result;
__ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) ); __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
return(result); return(result);
} }
...@@ -534,7 +604,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t va ...@@ -534,7 +604,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t va
{ {
uint32_t result; uint32_t result;
__ASM volatile ("strex %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) ); __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
return(result); return(result);
} }
...@@ -546,7 +616,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t va ...@@ -546,7 +616,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t va
*/ */
__attribute__( ( always_inline ) ) __STATIC_INLINE void __CLREX(void) __attribute__( ( always_inline ) ) __STATIC_INLINE void __CLREX(void)
{ {
__ASM volatile ("clrex"); __ASM volatile ("clrex" ::: "memory");
} }
...@@ -591,7 +661,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE void __CLREX(void) ...@@ -591,7 +661,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE void __CLREX(void)
*/ */
__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __CLZ(uint32_t value) __attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __CLZ(uint32_t value)
{ {
uint8_t result; uint32_t result;
__ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) ); __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) );
return(result); return(result);
......
/**************************************************************************//** /**************************************************************************//**
* @file core_sc000.h * @file core_sc000.h
* @brief CMSIS SC000 Core Peripheral Access Layer Header File * @brief CMSIS SC000 Core Peripheral Access Layer Header File
* @version V3.01 * @version V3.20
* @date 22. March 2012 * @date 25. February 2013
* *
* @note * @note
* Copyright (C) 2009-2012 ARM Limited. All rights reserved.
*
* @par
* ARM Limited (ARM) is supplying this software for use with Cortex-M
* processor based microcontrollers. This file can be freely distributed
* within development tools that are supporting such ARM based processors.
*
* @par
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
* *
******************************************************************************/ ******************************************************************************/
/* Copyright (c) 2009 - 2013 ARM LIMITED
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
- Neither the name of ARM nor the names of its contributors may be used
to endorse or promote products derived from this software without
specific prior written permission.
*
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
#if defined ( __ICCARM__ ) #if defined ( __ICCARM__ )
#pragma system_include /* treat file as system include file for MISRA check */ #pragma system_include /* treat file as system include file for MISRA check */
#endif #endif
...@@ -54,7 +69,7 @@ ...@@ -54,7 +69,7 @@
/* CMSIS SC000 definitions */ /* CMSIS SC000 definitions */
#define __SC000_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ #define __SC000_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */
#define __SC000_CMSIS_VERSION_SUB (0x01) /*!< [15:0] CMSIS HAL sub version */ #define __SC000_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL sub version */
#define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16) | \ #define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16) | \
__SC000_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ __SC000_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */
...@@ -721,9 +736,9 @@ __STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) ...@@ -721,9 +736,9 @@ __STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)
{ {
if(IRQn < 0) { if(IRQn < 0) {
return((uint32_t)((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for SC000 system interrupts */ return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M0 system interrupts */
else { else {
return((uint32_t)((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */
} }
...@@ -771,9 +786,9 @@ __STATIC_INLINE void NVIC_SystemReset(void) ...@@ -771,9 +786,9 @@ __STATIC_INLINE void NVIC_SystemReset(void)
*/ */
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{ {
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ SysTick->LOAD = ticks - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
SysTick->VAL = 0; /* Load the SysTick Counter Value */ SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
......
/**************************************************************************//** /**************************************************************************//**
* @file core_sc300.h * @file core_sc300.h
* @brief CMSIS SC300 Core Peripheral Access Layer Header File * @brief CMSIS SC300 Core Peripheral Access Layer Header File
* @version V3.01 * @version V3.20
* @date 22. March 2012 * @date 25. February 2013
* *
* @note * @note
* Copyright (C) 2009-2012 ARM Limited. All rights reserved.
*
* @par
* ARM Limited (ARM) is supplying this software for use with Cortex-M
* processor based microcontrollers. This file can be freely distributed
* within development tools that are supporting such ARM based processors.
*
* @par
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
* *
******************************************************************************/ ******************************************************************************/
/* Copyright (c) 2009 - 2013 ARM LIMITED
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
- Neither the name of ARM nor the names of its contributors may be used
to endorse or promote products derived from this software without
specific prior written permission.
*
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
#if defined ( __ICCARM__ ) #if defined ( __ICCARM__ )
#pragma system_include /* treat file as system include file for MISRA check */ #pragma system_include /* treat file as system include file for MISRA check */
#endif #endif
...@@ -54,7 +69,7 @@ ...@@ -54,7 +69,7 @@
/* CMSIS SC300 definitions */ /* CMSIS SC300 definitions */
#define __SC300_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ #define __SC300_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */
#define __SC300_CMSIS_VERSION_SUB (0x01) /*!< [15:0] CMSIS HAL sub version */ #define __SC300_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL sub version */
#define __SC300_CMSIS_VERSION ((__SC300_CMSIS_VERSION_MAIN << 16) | \ #define __SC300_CMSIS_VERSION ((__SC300_CMSIS_VERSION_MAIN << 16) | \
__SC300_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ __SC300_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */
...@@ -607,14 +622,14 @@ typedef struct ...@@ -607,14 +622,14 @@ typedef struct
__IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */
uint32_t RESERVED2[15]; uint32_t RESERVED2[15];
__IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */
uint32_t RESERVED3[29]; uint32_t RESERVED3[29];
__O uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ __O uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */
__I uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ __I uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */
__IO uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ __IO uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */
uint32_t RESERVED4[43]; uint32_t RESERVED4[43];
__O uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ __O uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */
__I uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ __I uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */
uint32_t RESERVED5[6]; uint32_t RESERVED5[6];
__I uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ __I uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */
__I uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ __I uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */
__I uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ __I uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */
...@@ -1487,9 +1502,9 @@ __STATIC_INLINE void NVIC_SystemReset(void) ...@@ -1487,9 +1502,9 @@ __STATIC_INLINE void NVIC_SystemReset(void)
*/ */
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{ {
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ SysTick->LOAD = ticks - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
SysTick->VAL = 0; /* Load the SysTick Counter Value */ SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册