The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Dependents:   hello SerialTestv11 SerialTestv12 Sierpinski ... more

mbed 2

This is the mbed 2 library. If you'd like to learn about Mbed OS please see the mbed-os docs.

Committer:
AnnaBridge
Date:
Thu Nov 08 11:45:42 2018 +0000
Revision:
171:3a7713b1edbc
Parent:
TARGET_EFM32GG_STK3700/TARGET_Silicon_Labs/TARGET_EFM32/emlib/inc/em_common.h@160:5571c4ff569f
mbed library. Release version 164

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 156:ff21514d8981 1 /***************************************************************************//**
AnnaBridge 156:ff21514d8981 2 * @file em_common.h
AnnaBridge 156:ff21514d8981 3 * @brief General purpose utilities.
Anna Bridge 160:5571c4ff569f 4 * @version 5.3.3
AnnaBridge 156:ff21514d8981 5 *******************************************************************************
Anna Bridge 160:5571c4ff569f 6 * # License
AnnaBridge 156:ff21514d8981 7 * <b>Copyright 2016 Silicon Laboratories, Inc. http://www.silabs.com</b>
AnnaBridge 156:ff21514d8981 8 *******************************************************************************
AnnaBridge 156:ff21514d8981 9 *
AnnaBridge 156:ff21514d8981 10 * Permission is granted to anyone to use this software for any purpose,
AnnaBridge 156:ff21514d8981 11 * including commercial applications, and to alter it and redistribute it
AnnaBridge 156:ff21514d8981 12 * freely, subject to the following restrictions:
AnnaBridge 156:ff21514d8981 13 *
AnnaBridge 156:ff21514d8981 14 * 1. The origin of this software must not be misrepresented; you must not
AnnaBridge 156:ff21514d8981 15 * claim that you wrote the original software.
AnnaBridge 156:ff21514d8981 16 * 2. Altered source versions must be plainly marked as such, and must not be
AnnaBridge 156:ff21514d8981 17 * misrepresented as being the original software.
AnnaBridge 156:ff21514d8981 18 * 3. This notice may not be removed or altered from any source distribution.
AnnaBridge 156:ff21514d8981 19 *
AnnaBridge 156:ff21514d8981 20 * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
AnnaBridge 156:ff21514d8981 21 * obligation to support this Software. Silicon Labs is providing the
AnnaBridge 156:ff21514d8981 22 * Software "AS IS", with no express or implied warranties of any kind,
AnnaBridge 156:ff21514d8981 23 * including, but not limited to, any implied warranties of merchantability
AnnaBridge 156:ff21514d8981 24 * or fitness for any particular purpose or warranties against infringement
AnnaBridge 156:ff21514d8981 25 * of any proprietary rights of a third party.
AnnaBridge 156:ff21514d8981 26 *
AnnaBridge 156:ff21514d8981 27 * Silicon Labs will not be liable for any consequential, incidental, or
AnnaBridge 156:ff21514d8981 28 * special damages, or any other relief, or for any claim by any third party,
AnnaBridge 156:ff21514d8981 29 * arising from your use of this Software.
AnnaBridge 156:ff21514d8981 30 *
AnnaBridge 156:ff21514d8981 31 ******************************************************************************/
AnnaBridge 156:ff21514d8981 32 #ifndef EM_COMMON_H
AnnaBridge 156:ff21514d8981 33 #define EM_COMMON_H
AnnaBridge 156:ff21514d8981 34
AnnaBridge 156:ff21514d8981 35 #include "em_device.h"
AnnaBridge 156:ff21514d8981 36 #include <stdbool.h>
AnnaBridge 156:ff21514d8981 37
AnnaBridge 156:ff21514d8981 38 #ifdef __cplusplus
AnnaBridge 156:ff21514d8981 39 extern "C" {
AnnaBridge 156:ff21514d8981 40 #endif
AnnaBridge 156:ff21514d8981 41
AnnaBridge 156:ff21514d8981 42 /***************************************************************************//**
AnnaBridge 156:ff21514d8981 43 * @defgroup emlib EMLIB
AnnaBridge 156:ff21514d8981 44 * @brief Low-level peripheral library
AnnaBridge 156:ff21514d8981 45 * @details
AnnaBridge 156:ff21514d8981 46 * EMLIB is a low-level peripheral support library that provides a unified API for
AnnaBridge 156:ff21514d8981 47 * all EFM32, EZR32 and EFR32 MCUs and SoCs from Silicon Laboratories.
AnnaBridge 156:ff21514d8981 48 *
AnnaBridge 156:ff21514d8981 49 * EMLIB modules are provided for all peripherals and core features. The library
AnnaBridge 156:ff21514d8981 50 * implements no interrupt handlers. Static data, critical sections and module
AnnaBridge 156:ff21514d8981 51 * interdependencies are kept at a minimum.
AnnaBridge 156:ff21514d8981 52 *
AnnaBridge 156:ff21514d8981 53 * @note
AnnaBridge 156:ff21514d8981 54 * EMLIB functions assert on error if DEBUG_EFM is defined. See @ref ASSERT
AnnaBridge 156:ff21514d8981 55 * for more information on error handling and default assertion and how to
AnnaBridge 156:ff21514d8981 56 * implement a custom handler.
AnnaBridge 156:ff21514d8981 57 *
AnnaBridge 156:ff21514d8981 58 * @n
AnnaBridge 156:ff21514d8981 59 * @note
AnnaBridge 156:ff21514d8981 60 * EMLIB does not implement support for radio features. Please refer to stack
AnnaBridge 156:ff21514d8981 61 * documentation for more information on RF support.
AnnaBridge 156:ff21514d8981 62 * @{
AnnaBridge 156:ff21514d8981 63 ******************************************************************************/
AnnaBridge 156:ff21514d8981 64
AnnaBridge 156:ff21514d8981 65 /***************************************************************************//**
AnnaBridge 156:ff21514d8981 66 * @addtogroup COMMON
AnnaBridge 156:ff21514d8981 67 * @brief General purpose utilities and cross-compiler support.
AnnaBridge 156:ff21514d8981 68 * @details
AnnaBridge 156:ff21514d8981 69 * This SDK supports the following compilers/IDEs:
AnnaBridge 156:ff21514d8981 70 * @li Simplicity Studio
AnnaBridge 156:ff21514d8981 71 * @li IAR Embedded Workbench
AnnaBridge 156:ff21514d8981 72 * @li Atollic TrueSTUDIO IDE
AnnaBridge 156:ff21514d8981 73 * @li Rowley Associates CrossWorks for ARM
AnnaBridge 156:ff21514d8981 74 * @li Keil µVision IDE
AnnaBridge 156:ff21514d8981 75 * @li Plain armgcc
AnnaBridge 156:ff21514d8981 76 *
AnnaBridge 156:ff21514d8981 77 * Certain compiler features such as alignment is implemented differently in the tools.
AnnaBridge 156:ff21514d8981 78 * Therefore, macros such as @ref SL_ALIGN are provided to enable compiler independent
AnnaBridge 156:ff21514d8981 79 * code.
AnnaBridge 156:ff21514d8981 80 *
AnnaBridge 156:ff21514d8981 81 * @note RAM code macros are implemented in a separate module @ref RAMFUNC.
AnnaBridge 156:ff21514d8981 82 * Cross-compiler RAM code support needs extended documentation and it is therefore
AnnaBridge 156:ff21514d8981 83 * implemented as a separate module.
AnnaBridge 156:ff21514d8981 84 *
AnnaBridge 156:ff21514d8981 85 * @{
AnnaBridge 156:ff21514d8981 86 ******************************************************************************/
AnnaBridge 156:ff21514d8981 87
AnnaBridge 156:ff21514d8981 88 #if !defined(__GNUC__)
AnnaBridge 156:ff21514d8981 89 /* Not GCC compilers */
AnnaBridge 156:ff21514d8981 90
AnnaBridge 156:ff21514d8981 91 /** @brief Macro for getting minimum value. */
AnnaBridge 156:ff21514d8981 92 #define SL_MIN(a, b) ((a) < (b) ? (a) : (b))
AnnaBridge 156:ff21514d8981 93
AnnaBridge 156:ff21514d8981 94 /** @brief Macro for getting maximum value. */
AnnaBridge 156:ff21514d8981 95 #define SL_MAX(a, b) ((a) > (b) ? (a) : (b))
AnnaBridge 156:ff21514d8981 96
AnnaBridge 156:ff21514d8981 97 /** @brief Macros for handling packed structs. */
AnnaBridge 156:ff21514d8981 98 #define STRINGIZE(X) #X
AnnaBridge 156:ff21514d8981 99 #define SL_PACK_START(X) _Pragma(STRINGIZE(pack(X)))
AnnaBridge 156:ff21514d8981 100 #define SL_PACK_END() _Pragma("pack()")
AnnaBridge 156:ff21514d8981 101 #define SL_ATTRIBUTE_PACKED
AnnaBridge 156:ff21514d8981 102
AnnaBridge 156:ff21514d8981 103 #if defined(__CC_ARM)
AnnaBridge 156:ff21514d8981 104 /** @brief MDK-ARM compiler: Macros for handling aligned structs. */
AnnaBridge 156:ff21514d8981 105 #define SL_ALIGN(X) __align(X)
AnnaBridge 156:ff21514d8981 106
AnnaBridge 156:ff21514d8981 107 /** MDK-ARM compiler: Macro for handling weak symbols. */
AnnaBridge 156:ff21514d8981 108 #define SL_WEAK __attribute__ ((weak))
AnnaBridge 156:ff21514d8981 109
AnnaBridge 156:ff21514d8981 110 /** MDK-ARM compiler: Macro for handling non-returning functions. */
AnnaBridge 156:ff21514d8981 111 #define SL_NORETURN __attribute__ ((noreturn))
AnnaBridge 156:ff21514d8981 112
AnnaBridge 156:ff21514d8981 113 /** MDK-ARM compiler: Macro for handling section placement */
AnnaBridge 156:ff21514d8981 114 #define SL_ATTRIBUTE_SECTION(X) __attribute__ ((section(X)))
AnnaBridge 156:ff21514d8981 115 #endif
AnnaBridge 156:ff21514d8981 116
AnnaBridge 156:ff21514d8981 117 #if defined(__ICCARM__)
AnnaBridge 156:ff21514d8981 118 /** @brief IAR Embedded Workbench: Macros for handling aligned structs. */
Anna Bridge 160:5571c4ff569f 119 #define SL_ALIGN(X) _Pragma(STRINGIZE(data_alignment = X))
AnnaBridge 156:ff21514d8981 120
AnnaBridge 156:ff21514d8981 121 /** @brief IAR Embedded Workbench: Macros for handling weak symbols. */
AnnaBridge 156:ff21514d8981 122 #define SL_WEAK __weak
AnnaBridge 156:ff21514d8981 123
AnnaBridge 156:ff21514d8981 124 /** @brief IAR Embedded Workbench: Macro for handling non-returning functions. */
AnnaBridge 156:ff21514d8981 125 #define SL_NORETURN __noreturn
AnnaBridge 156:ff21514d8981 126
Anna Bridge 160:5571c4ff569f 127 /* *INDENT-OFF* */
AnnaBridge 156:ff21514d8981 128 /** IAR Embedded Workbench: Macro for handling section placement */
AnnaBridge 156:ff21514d8981 129 #define SL_ATTRIBUTE_SECTION(X) @ X
AnnaBridge 156:ff21514d8981 130 #endif
Anna Bridge 160:5571c4ff569f 131 /* *INDENT-ON* */
AnnaBridge 156:ff21514d8981 132
AnnaBridge 156:ff21514d8981 133 #define SL_ATTRIBUTE_ALIGN(X)
AnnaBridge 156:ff21514d8981 134
AnnaBridge 156:ff21514d8981 135 #else // !defined(__GNUC__)
AnnaBridge 156:ff21514d8981 136 /* GCC compilers */
AnnaBridge 156:ff21514d8981 137
AnnaBridge 156:ff21514d8981 138 /** @brief Macro for getting minimum value. No sideeffects, a and b are evaluated once only. */
Anna Bridge 160:5571c4ff569f 139 #define SL_MIN(a, b) __extension__({ __typeof__(a)_a = (a); __typeof__(b)_b = (b); _a < _b ? _a : _b; })
AnnaBridge 156:ff21514d8981 140
AnnaBridge 156:ff21514d8981 141 /** @brief Macro for getting maximum value. No sideeffects, a and b are evaluated once only. */
Anna Bridge 160:5571c4ff569f 142 #define SL_MAX(a, b) __extension__({ __typeof__(a)_a = (a); __typeof__(b)_b = (b); _a > _b ? _a : _b; })
AnnaBridge 156:ff21514d8981 143
AnnaBridge 156:ff21514d8981 144 /** @brief GCC style macro for handling packed structs. */
AnnaBridge 156:ff21514d8981 145 #define SL_ATTRIBUTE_PACKED __attribute__ ((packed))
AnnaBridge 156:ff21514d8981 146
AnnaBridge 156:ff21514d8981 147 /** @brief Macro for handling packed structs.
AnnaBridge 156:ff21514d8981 148 * @n Use this macro before the struct definition.
AnnaBridge 156:ff21514d8981 149 * @n X denotes the maximum alignment of struct members. X is not supported with
AnnaBridge 156:ff21514d8981 150 * GCC. GCC always use 1 byte maximum alignment.
AnnaBridge 156:ff21514d8981 151 */
AnnaBridge 156:ff21514d8981 152 #define SL_PACK_START(x)
AnnaBridge 156:ff21514d8981 153
AnnaBridge 156:ff21514d8981 154 /** @brief Macro for handling packed structs.
AnnaBridge 156:ff21514d8981 155 * @n Use this macro after the struct definition.
AnnaBridge 156:ff21514d8981 156 * @n With GCC, add SL_ATTRIBUTE_PACKED after the closing } of the struct
AnnaBridge 156:ff21514d8981 157 * definition.
AnnaBridge 156:ff21514d8981 158 */
AnnaBridge 156:ff21514d8981 159 #define SL_PACK_END()
AnnaBridge 156:ff21514d8981 160
AnnaBridge 156:ff21514d8981 161 /** @brief GCC style macro for aligning a variable. */
AnnaBridge 156:ff21514d8981 162 #define SL_ATTRIBUTE_ALIGN(X) __attribute__ ((aligned(X)))
AnnaBridge 156:ff21514d8981 163
AnnaBridge 156:ff21514d8981 164 /** @brief Macro for aligning a variable.
AnnaBridge 156:ff21514d8981 165 * @n Use this macro before the variable definition.
AnnaBridge 156:ff21514d8981 166 * @n X denotes the storage alignment value in bytes.
AnnaBridge 156:ff21514d8981 167 * @n To be gcc compatible use SL_ATTRIBUTE_ALIGN(X) before the ; on normal
AnnaBridge 156:ff21514d8981 168 * variables. Use SL_ATTRIBUTE_ALIGN(X) before the opening { on struct variables.
AnnaBridge 156:ff21514d8981 169 */
AnnaBridge 156:ff21514d8981 170 #define SL_ALIGN(X)
AnnaBridge 156:ff21514d8981 171
AnnaBridge 156:ff21514d8981 172 /** @brief Macro for defining a weak symbol. */
AnnaBridge 156:ff21514d8981 173 #define SL_WEAK __attribute__ ((weak))
AnnaBridge 156:ff21514d8981 174
AnnaBridge 156:ff21514d8981 175 /** @brief Macro for handling non-returning functions. */
AnnaBridge 156:ff21514d8981 176 #define SL_NORETURN __attribute__ ((noreturn))
AnnaBridge 156:ff21514d8981 177
AnnaBridge 156:ff21514d8981 178 /** Macro for placing a variable in a section.
AnnaBridge 156:ff21514d8981 179 * @n Use this macro after the variable definition, before the = or ;.
AnnaBridge 156:ff21514d8981 180 * @n X denotes the section to place the variable in.
AnnaBridge 156:ff21514d8981 181 */
AnnaBridge 156:ff21514d8981 182 #define SL_ATTRIBUTE_SECTION(X) __attribute__ ((section(X)))
AnnaBridge 156:ff21514d8981 183
AnnaBridge 156:ff21514d8981 184 #endif // !defined(__GNUC__)
AnnaBridge 156:ff21514d8981 185
AnnaBridge 156:ff21514d8981 186 /***************************************************************************//**
AnnaBridge 156:ff21514d8981 187 * @brief
AnnaBridge 156:ff21514d8981 188 * Count trailing number of zeros. Use CLZ instruction if available.
AnnaBridge 156:ff21514d8981 189 *
AnnaBridge 156:ff21514d8981 190 * @param[in] value
AnnaBridge 156:ff21514d8981 191 * Data value to check for number of trailing zero bits.
AnnaBridge 156:ff21514d8981 192 *
AnnaBridge 156:ff21514d8981 193 * @return
AnnaBridge 156:ff21514d8981 194 * Number of trailing zeros in value.
AnnaBridge 156:ff21514d8981 195 ******************************************************************************/
AnnaBridge 156:ff21514d8981 196 __STATIC_INLINE uint32_t SL_CTZ(uint32_t value)
AnnaBridge 156:ff21514d8981 197 {
AnnaBridge 156:ff21514d8981 198 #if (__CORTEX_M >= 3)
AnnaBridge 156:ff21514d8981 199 return __CLZ(__RBIT(value));
AnnaBridge 156:ff21514d8981 200
AnnaBridge 156:ff21514d8981 201 #else
AnnaBridge 156:ff21514d8981 202 uint32_t zeros;
Anna Bridge 160:5571c4ff569f 203 for (zeros = 0; (zeros < 32) && ((value & 0x1) == 0); zeros++, value >>= 1) {
Anna Bridge 160:5571c4ff569f 204 ;
Anna Bridge 160:5571c4ff569f 205 }
AnnaBridge 156:ff21514d8981 206 return zeros;
AnnaBridge 156:ff21514d8981 207 #endif
AnnaBridge 156:ff21514d8981 208 }
AnnaBridge 156:ff21514d8981 209
AnnaBridge 156:ff21514d8981 210 /* Deprecated function. New code should use @ref SL_CTZ. */
AnnaBridge 156:ff21514d8981 211 __STATIC_INLINE uint32_t EFM32_CTZ(uint32_t value)
AnnaBridge 156:ff21514d8981 212 {
AnnaBridge 156:ff21514d8981 213 return SL_CTZ(value);
AnnaBridge 156:ff21514d8981 214 }
AnnaBridge 156:ff21514d8981 215
Anna Bridge 160:5571c4ff569f 216 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 217 * @brief
Anna Bridge 160:5571c4ff569f 218 * Reverse the bits. Use the RBIT instruction if available, else process.
Anna Bridge 160:5571c4ff569f 219 *
Anna Bridge 160:5571c4ff569f 220 * @param[in] value
Anna Bridge 160:5571c4ff569f 221 * Data value to reverse.
Anna Bridge 160:5571c4ff569f 222 *
Anna Bridge 160:5571c4ff569f 223 * @return
Anna Bridge 160:5571c4ff569f 224 * Reversed value.
Anna Bridge 160:5571c4ff569f 225 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 226 __STATIC_INLINE uint32_t SL_RBIT(uint32_t value)
Anna Bridge 160:5571c4ff569f 227 {
Anna Bridge 160:5571c4ff569f 228 uint32_t result;
Anna Bridge 160:5571c4ff569f 229
Anna Bridge 160:5571c4ff569f 230 #if (__CORTEX_M >= 0x03U)
Anna Bridge 160:5571c4ff569f 231 result = __RBIT(value);
Anna Bridge 160:5571c4ff569f 232 #else
Anna Bridge 160:5571c4ff569f 233 int32_t s = 4 * 8 - 1;
Anna Bridge 160:5571c4ff569f 234
Anna Bridge 160:5571c4ff569f 235 result = value;
Anna Bridge 160:5571c4ff569f 236 for (value >>= 1U; value; value >>= 1U) {
Anna Bridge 160:5571c4ff569f 237 result <<= 1U;
Anna Bridge 160:5571c4ff569f 238 result |= value & 1U;
Anna Bridge 160:5571c4ff569f 239 s--;
Anna Bridge 160:5571c4ff569f 240 }
Anna Bridge 160:5571c4ff569f 241 result <<= s;
Anna Bridge 160:5571c4ff569f 242 #endif
Anna Bridge 160:5571c4ff569f 243 return result;
Anna Bridge 160:5571c4ff569f 244 }
Anna Bridge 160:5571c4ff569f 245
Anna Bridge 160:5571c4ff569f 246 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 247 * @brief
Anna Bridge 160:5571c4ff569f 248 * Reverse the bits. Use the RBIT instruction if available, else process.
Anna Bridge 160:5571c4ff569f 249 *
Anna Bridge 160:5571c4ff569f 250 * @param[in] value
Anna Bridge 160:5571c4ff569f 251 * 16-bit data value to reverse.
Anna Bridge 160:5571c4ff569f 252 *
Anna Bridge 160:5571c4ff569f 253 * @return
Anna Bridge 160:5571c4ff569f 254 * 16-bit reversed value.
Anna Bridge 160:5571c4ff569f 255 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 256 __STATIC_INLINE uint32_t SL_RBIT16(uint32_t value)
Anna Bridge 160:5571c4ff569f 257 {
Anna Bridge 160:5571c4ff569f 258 return SL_RBIT(value) >> 16;
Anna Bridge 160:5571c4ff569f 259 }
AnnaBridge 156:ff21514d8981 260
AnnaBridge 156:ff21514d8981 261 /** @} (end addtogroup COMMON) */
AnnaBridge 156:ff21514d8981 262 /** @} (end addtogroup emlib) */
AnnaBridge 156:ff21514d8981 263
AnnaBridge 156:ff21514d8981 264 #ifdef __cplusplus
AnnaBridge 156:ff21514d8981 265 }
AnnaBridge 156:ff21514d8981 266 #endif
AnnaBridge 156:ff21514d8981 267
AnnaBridge 156:ff21514d8981 268 #endif /* EM_COMMON_H */