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