Programme d'utilisation servomotors MX12 V1

Committer:
R66Y
Date:
Fri May 19 14:32:14 2017 +0000
Revision:
0:80df663dd15e
programme pour utiliser les servomoteurs MX12.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
R66Y 0:80df663dd15e 1 /**************************************************************************//**
R66Y 0:80df663dd15e 2 * @file core_cmInstr.h
R66Y 0:80df663dd15e 3 * @brief CMSIS Cortex-M Core Instruction Access Header File
R66Y 0:80df663dd15e 4 * @version V3.00
R66Y 0:80df663dd15e 5 * @date 09. December 2011
R66Y 0:80df663dd15e 6 *
R66Y 0:80df663dd15e 7 * @note
R66Y 0:80df663dd15e 8 * Copyright (C) 2009-2011 ARM Limited. All rights reserved.
R66Y 0:80df663dd15e 9 *
R66Y 0:80df663dd15e 10 * @par
R66Y 0:80df663dd15e 11 * ARM Limited (ARM) is supplying this software for use with Cortex-M
R66Y 0:80df663dd15e 12 * processor based microcontrollers. This file can be freely distributed
R66Y 0:80df663dd15e 13 * within development tools that are supporting such ARM based processors.
R66Y 0:80df663dd15e 14 *
R66Y 0:80df663dd15e 15 * @par
R66Y 0:80df663dd15e 16 * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
R66Y 0:80df663dd15e 17 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
R66Y 0:80df663dd15e 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
R66Y 0:80df663dd15e 19 * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
R66Y 0:80df663dd15e 20 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
R66Y 0:80df663dd15e 21 *
R66Y 0:80df663dd15e 22 ******************************************************************************/
R66Y 0:80df663dd15e 23
R66Y 0:80df663dd15e 24 #ifndef __CORE_CMINSTR_H
R66Y 0:80df663dd15e 25 #define __CORE_CMINSTR_H
R66Y 0:80df663dd15e 26
R66Y 0:80df663dd15e 27
R66Y 0:80df663dd15e 28 /* ########################## Core Instruction Access ######################### */
R66Y 0:80df663dd15e 29 /** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
R66Y 0:80df663dd15e 30 Access to dedicated instructions
R66Y 0:80df663dd15e 31 @{
R66Y 0:80df663dd15e 32 */
R66Y 0:80df663dd15e 33
R66Y 0:80df663dd15e 34 #if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
R66Y 0:80df663dd15e 35 /* ARM armcc specific functions */
R66Y 0:80df663dd15e 36
R66Y 0:80df663dd15e 37 #if (__ARMCC_VERSION < 400677)
R66Y 0:80df663dd15e 38 #error "Please use ARM Compiler Toolchain V4.0.677 or later!"
R66Y 0:80df663dd15e 39 #endif
R66Y 0:80df663dd15e 40
R66Y 0:80df663dd15e 41
R66Y 0:80df663dd15e 42 /** \brief No Operation
R66Y 0:80df663dd15e 43
R66Y 0:80df663dd15e 44 No Operation does nothing. This instruction can be used for code alignment purposes.
R66Y 0:80df663dd15e 45 */
R66Y 0:80df663dd15e 46 #define __NOP __nop
R66Y 0:80df663dd15e 47
R66Y 0:80df663dd15e 48
R66Y 0:80df663dd15e 49 /** \brief Wait For Interrupt
R66Y 0:80df663dd15e 50
R66Y 0:80df663dd15e 51 Wait For Interrupt is a hint instruction that suspends execution
R66Y 0:80df663dd15e 52 until one of a number of events occurs.
R66Y 0:80df663dd15e 53 */
R66Y 0:80df663dd15e 54 #define __WFI __wfi
R66Y 0:80df663dd15e 55
R66Y 0:80df663dd15e 56
R66Y 0:80df663dd15e 57 /** \brief Wait For Event
R66Y 0:80df663dd15e 58
R66Y 0:80df663dd15e 59 Wait For Event is a hint instruction that permits the processor to enter
R66Y 0:80df663dd15e 60 a low-power state until one of a number of events occurs.
R66Y 0:80df663dd15e 61 */
R66Y 0:80df663dd15e 62 #define __WFE __wfe
R66Y 0:80df663dd15e 63
R66Y 0:80df663dd15e 64
R66Y 0:80df663dd15e 65 /** \brief Send Event
R66Y 0:80df663dd15e 66
R66Y 0:80df663dd15e 67 Send Event is a hint instruction. It causes an event to be signaled to the CPU.
R66Y 0:80df663dd15e 68 */
R66Y 0:80df663dd15e 69 #define __SEV __sev
R66Y 0:80df663dd15e 70
R66Y 0:80df663dd15e 71
R66Y 0:80df663dd15e 72 /** \brief Instruction Synchronization Barrier
R66Y 0:80df663dd15e 73
R66Y 0:80df663dd15e 74 Instruction Synchronization Barrier flushes the pipeline in the processor,
R66Y 0:80df663dd15e 75 so that all instructions following the ISB are fetched from cache or
R66Y 0:80df663dd15e 76 memory, after the instruction has been completed.
R66Y 0:80df663dd15e 77 */
R66Y 0:80df663dd15e 78 #define __ISB() __isb(0xF)
R66Y 0:80df663dd15e 79
R66Y 0:80df663dd15e 80
R66Y 0:80df663dd15e 81 /** \brief Data Synchronization Barrier
R66Y 0:80df663dd15e 82
R66Y 0:80df663dd15e 83 This function acts as a special kind of Data Memory Barrier.
R66Y 0:80df663dd15e 84 It completes when all explicit memory accesses before this instruction complete.
R66Y 0:80df663dd15e 85 */
R66Y 0:80df663dd15e 86 #define __DSB() __dsb(0xF)
R66Y 0:80df663dd15e 87
R66Y 0:80df663dd15e 88
R66Y 0:80df663dd15e 89 /** \brief Data Memory Barrier
R66Y 0:80df663dd15e 90
R66Y 0:80df663dd15e 91 This function ensures the apparent order of the explicit memory operations before
R66Y 0:80df663dd15e 92 and after the instruction, without ensuring their completion.
R66Y 0:80df663dd15e 93 */
R66Y 0:80df663dd15e 94 #define __DMB() __dmb(0xF)
R66Y 0:80df663dd15e 95
R66Y 0:80df663dd15e 96
R66Y 0:80df663dd15e 97 /** \brief Reverse byte order (32 bit)
R66Y 0:80df663dd15e 98
R66Y 0:80df663dd15e 99 This function reverses the byte order in integer value.
R66Y 0:80df663dd15e 100
R66Y 0:80df663dd15e 101 \param [in] value Value to reverse
R66Y 0:80df663dd15e 102 \return Reversed value
R66Y 0:80df663dd15e 103 */
R66Y 0:80df663dd15e 104 #define __REV __rev
R66Y 0:80df663dd15e 105
R66Y 0:80df663dd15e 106
R66Y 0:80df663dd15e 107 /** \brief Reverse byte order (16 bit)
R66Y 0:80df663dd15e 108
R66Y 0:80df663dd15e 109 This function reverses the byte order in two unsigned short values.
R66Y 0:80df663dd15e 110
R66Y 0:80df663dd15e 111 \param [in] value Value to reverse
R66Y 0:80df663dd15e 112 \return Reversed value
R66Y 0:80df663dd15e 113 */
R66Y 0:80df663dd15e 114 static __attribute__((section(".rev16_text"))) __INLINE __ASM uint32_t __REV16(uint32_t value)
R66Y 0:80df663dd15e 115 {
R66Y 0:80df663dd15e 116 rev16 r0, r0
R66Y 0:80df663dd15e 117 bx lr
R66Y 0:80df663dd15e 118 }
R66Y 0:80df663dd15e 119
R66Y 0:80df663dd15e 120
R66Y 0:80df663dd15e 121 /** \brief Reverse byte order in signed short value
R66Y 0:80df663dd15e 122
R66Y 0:80df663dd15e 123 This function reverses the byte order in a signed short value with sign extension to integer.
R66Y 0:80df663dd15e 124
R66Y 0:80df663dd15e 125 \param [in] value Value to reverse
R66Y 0:80df663dd15e 126 \return Reversed value
R66Y 0:80df663dd15e 127 */
R66Y 0:80df663dd15e 128 static __attribute__((section(".revsh_text"))) __INLINE __ASM int32_t __REVSH(int32_t value)
R66Y 0:80df663dd15e 129 {
R66Y 0:80df663dd15e 130 revsh r0, r0
R66Y 0:80df663dd15e 131 bx lr
R66Y 0:80df663dd15e 132 }
R66Y 0:80df663dd15e 133
R66Y 0:80df663dd15e 134
R66Y 0:80df663dd15e 135 #if (__CORTEX_M >= 0x03)
R66Y 0:80df663dd15e 136
R66Y 0:80df663dd15e 137 /** \brief Reverse bit order of value
R66Y 0:80df663dd15e 138
R66Y 0:80df663dd15e 139 This function reverses the bit order of the given value.
R66Y 0:80df663dd15e 140
R66Y 0:80df663dd15e 141 \param [in] value Value to reverse
R66Y 0:80df663dd15e 142 \return Reversed value
R66Y 0:80df663dd15e 143 */
R66Y 0:80df663dd15e 144 #define __RBIT __rbit
R66Y 0:80df663dd15e 145
R66Y 0:80df663dd15e 146
R66Y 0:80df663dd15e 147 /** \brief LDR Exclusive (8 bit)
R66Y 0:80df663dd15e 148
R66Y 0:80df663dd15e 149 This function performs a exclusive LDR command for 8 bit value.
R66Y 0:80df663dd15e 150
R66Y 0:80df663dd15e 151 \param [in] ptr Pointer to data
R66Y 0:80df663dd15e 152 \return value of type uint8_t at (*ptr)
R66Y 0:80df663dd15e 153 */
R66Y 0:80df663dd15e 154 #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr))
R66Y 0:80df663dd15e 155
R66Y 0:80df663dd15e 156
R66Y 0:80df663dd15e 157 /** \brief LDR Exclusive (16 bit)
R66Y 0:80df663dd15e 158
R66Y 0:80df663dd15e 159 This function performs a exclusive LDR command for 16 bit values.
R66Y 0:80df663dd15e 160
R66Y 0:80df663dd15e 161 \param [in] ptr Pointer to data
R66Y 0:80df663dd15e 162 \return value of type uint16_t at (*ptr)
R66Y 0:80df663dd15e 163 */
R66Y 0:80df663dd15e 164 #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr))
R66Y 0:80df663dd15e 165
R66Y 0:80df663dd15e 166
R66Y 0:80df663dd15e 167 /** \brief LDR Exclusive (32 bit)
R66Y 0:80df663dd15e 168
R66Y 0:80df663dd15e 169 This function performs a exclusive LDR command for 32 bit values.
R66Y 0:80df663dd15e 170
R66Y 0:80df663dd15e 171 \param [in] ptr Pointer to data
R66Y 0:80df663dd15e 172 \return value of type uint32_t at (*ptr)
R66Y 0:80df663dd15e 173 */
R66Y 0:80df663dd15e 174 #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr))
R66Y 0:80df663dd15e 175
R66Y 0:80df663dd15e 176
R66Y 0:80df663dd15e 177 /** \brief STR Exclusive (8 bit)
R66Y 0:80df663dd15e 178
R66Y 0:80df663dd15e 179 This function performs a exclusive STR command for 8 bit values.
R66Y 0:80df663dd15e 180
R66Y 0:80df663dd15e 181 \param [in] value Value to store
R66Y 0:80df663dd15e 182 \param [in] ptr Pointer to location
R66Y 0:80df663dd15e 183 \return 0 Function succeeded
R66Y 0:80df663dd15e 184 \return 1 Function failed
R66Y 0:80df663dd15e 185 */
R66Y 0:80df663dd15e 186 #define __STREXB(value, ptr) __strex(value, ptr)
R66Y 0:80df663dd15e 187
R66Y 0:80df663dd15e 188
R66Y 0:80df663dd15e 189 /** \brief STR Exclusive (16 bit)
R66Y 0:80df663dd15e 190
R66Y 0:80df663dd15e 191 This function performs a exclusive STR command for 16 bit values.
R66Y 0:80df663dd15e 192
R66Y 0:80df663dd15e 193 \param [in] value Value to store
R66Y 0:80df663dd15e 194 \param [in] ptr Pointer to location
R66Y 0:80df663dd15e 195 \return 0 Function succeeded
R66Y 0:80df663dd15e 196 \return 1 Function failed
R66Y 0:80df663dd15e 197 */
R66Y 0:80df663dd15e 198 #define __STREXH(value, ptr) __strex(value, ptr)
R66Y 0:80df663dd15e 199
R66Y 0:80df663dd15e 200
R66Y 0:80df663dd15e 201 /** \brief STR Exclusive (32 bit)
R66Y 0:80df663dd15e 202
R66Y 0:80df663dd15e 203 This function performs a exclusive STR command for 32 bit values.
R66Y 0:80df663dd15e 204
R66Y 0:80df663dd15e 205 \param [in] value Value to store
R66Y 0:80df663dd15e 206 \param [in] ptr Pointer to location
R66Y 0:80df663dd15e 207 \return 0 Function succeeded
R66Y 0:80df663dd15e 208 \return 1 Function failed
R66Y 0:80df663dd15e 209 */
R66Y 0:80df663dd15e 210 #define __STREXW(value, ptr) __strex(value, ptr)
R66Y 0:80df663dd15e 211
R66Y 0:80df663dd15e 212
R66Y 0:80df663dd15e 213 /** \brief Remove the exclusive lock
R66Y 0:80df663dd15e 214
R66Y 0:80df663dd15e 215 This function removes the exclusive lock which is created by LDREX.
R66Y 0:80df663dd15e 216
R66Y 0:80df663dd15e 217 */
R66Y 0:80df663dd15e 218 #define __CLREX __clrex
R66Y 0:80df663dd15e 219
R66Y 0:80df663dd15e 220
R66Y 0:80df663dd15e 221 /** \brief Signed Saturate
R66Y 0:80df663dd15e 222
R66Y 0:80df663dd15e 223 This function saturates a signed value.
R66Y 0:80df663dd15e 224
R66Y 0:80df663dd15e 225 \param [in] value Value to be saturated
R66Y 0:80df663dd15e 226 \param [in] sat Bit position to saturate to (1..32)
R66Y 0:80df663dd15e 227 \return Saturated value
R66Y 0:80df663dd15e 228 */
R66Y 0:80df663dd15e 229 #define __SSAT __ssat
R66Y 0:80df663dd15e 230
R66Y 0:80df663dd15e 231
R66Y 0:80df663dd15e 232 /** \brief Unsigned Saturate
R66Y 0:80df663dd15e 233
R66Y 0:80df663dd15e 234 This function saturates an unsigned value.
R66Y 0:80df663dd15e 235
R66Y 0:80df663dd15e 236 \param [in] value Value to be saturated
R66Y 0:80df663dd15e 237 \param [in] sat Bit position to saturate to (0..31)
R66Y 0:80df663dd15e 238 \return Saturated value
R66Y 0:80df663dd15e 239 */
R66Y 0:80df663dd15e 240 #define __USAT __usat
R66Y 0:80df663dd15e 241
R66Y 0:80df663dd15e 242
R66Y 0:80df663dd15e 243 /** \brief Count leading zeros
R66Y 0:80df663dd15e 244
R66Y 0:80df663dd15e 245 This function counts the number of leading zeros of a data value.
R66Y 0:80df663dd15e 246
R66Y 0:80df663dd15e 247 \param [in] value Value to count the leading zeros
R66Y 0:80df663dd15e 248 \return number of leading zeros in value
R66Y 0:80df663dd15e 249 */
R66Y 0:80df663dd15e 250 #define __CLZ __clz
R66Y 0:80df663dd15e 251
R66Y 0:80df663dd15e 252 #endif /* (__CORTEX_M >= 0x03) */
R66Y 0:80df663dd15e 253
R66Y 0:80df663dd15e 254
R66Y 0:80df663dd15e 255
R66Y 0:80df663dd15e 256 #elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
R66Y 0:80df663dd15e 257 /* IAR iccarm specific functions */
R66Y 0:80df663dd15e 258
R66Y 0:80df663dd15e 259 #include <cmsis_iar.h>
R66Y 0:80df663dd15e 260
R66Y 0:80df663dd15e 261
R66Y 0:80df663dd15e 262 #elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
R66Y 0:80df663dd15e 263 /* GNU gcc specific functions */
R66Y 0:80df663dd15e 264
R66Y 0:80df663dd15e 265 /** \brief No Operation
R66Y 0:80df663dd15e 266
R66Y 0:80df663dd15e 267 No Operation does nothing. This instruction can be used for code alignment purposes.
R66Y 0:80df663dd15e 268 */
R66Y 0:80df663dd15e 269 __attribute__( ( always_inline ) ) static __INLINE void __NOP(void)
R66Y 0:80df663dd15e 270 {
R66Y 0:80df663dd15e 271 __ASM volatile ("nop");
R66Y 0:80df663dd15e 272 }
R66Y 0:80df663dd15e 273
R66Y 0:80df663dd15e 274
R66Y 0:80df663dd15e 275 /** \brief Wait For Interrupt
R66Y 0:80df663dd15e 276
R66Y 0:80df663dd15e 277 Wait For Interrupt is a hint instruction that suspends execution
R66Y 0:80df663dd15e 278 until one of a number of events occurs.
R66Y 0:80df663dd15e 279 */
R66Y 0:80df663dd15e 280 __attribute__( ( always_inline ) ) static __INLINE void __WFI(void)
R66Y 0:80df663dd15e 281 {
R66Y 0:80df663dd15e 282 __ASM volatile ("wfi");
R66Y 0:80df663dd15e 283 }
R66Y 0:80df663dd15e 284
R66Y 0:80df663dd15e 285
R66Y 0:80df663dd15e 286 /** \brief Wait For Event
R66Y 0:80df663dd15e 287
R66Y 0:80df663dd15e 288 Wait For Event is a hint instruction that permits the processor to enter
R66Y 0:80df663dd15e 289 a low-power state until one of a number of events occurs.
R66Y 0:80df663dd15e 290 */
R66Y 0:80df663dd15e 291 __attribute__( ( always_inline ) ) static __INLINE void __WFE(void)
R66Y 0:80df663dd15e 292 {
R66Y 0:80df663dd15e 293 __ASM volatile ("wfe");
R66Y 0:80df663dd15e 294 }
R66Y 0:80df663dd15e 295
R66Y 0:80df663dd15e 296
R66Y 0:80df663dd15e 297 /** \brief Send Event
R66Y 0:80df663dd15e 298
R66Y 0:80df663dd15e 299 Send Event is a hint instruction. It causes an event to be signaled to the CPU.
R66Y 0:80df663dd15e 300 */
R66Y 0:80df663dd15e 301 __attribute__( ( always_inline ) ) static __INLINE void __SEV(void)
R66Y 0:80df663dd15e 302 {
R66Y 0:80df663dd15e 303 __ASM volatile ("sev");
R66Y 0:80df663dd15e 304 }
R66Y 0:80df663dd15e 305
R66Y 0:80df663dd15e 306
R66Y 0:80df663dd15e 307 /** \brief Instruction Synchronization Barrier
R66Y 0:80df663dd15e 308
R66Y 0:80df663dd15e 309 Instruction Synchronization Barrier flushes the pipeline in the processor,
R66Y 0:80df663dd15e 310 so that all instructions following the ISB are fetched from cache or
R66Y 0:80df663dd15e 311 memory, after the instruction has been completed.
R66Y 0:80df663dd15e 312 */
R66Y 0:80df663dd15e 313 __attribute__( ( always_inline ) ) static __INLINE void __ISB(void)
R66Y 0:80df663dd15e 314 {
R66Y 0:80df663dd15e 315 __ASM volatile ("isb");
R66Y 0:80df663dd15e 316 }
R66Y 0:80df663dd15e 317
R66Y 0:80df663dd15e 318
R66Y 0:80df663dd15e 319 /** \brief Data Synchronization Barrier
R66Y 0:80df663dd15e 320
R66Y 0:80df663dd15e 321 This function acts as a special kind of Data Memory Barrier.
R66Y 0:80df663dd15e 322 It completes when all explicit memory accesses before this instruction complete.
R66Y 0:80df663dd15e 323 */
R66Y 0:80df663dd15e 324 __attribute__( ( always_inline ) ) static __INLINE void __DSB(void)
R66Y 0:80df663dd15e 325 {
R66Y 0:80df663dd15e 326 __ASM volatile ("dsb");
R66Y 0:80df663dd15e 327 }
R66Y 0:80df663dd15e 328
R66Y 0:80df663dd15e 329
R66Y 0:80df663dd15e 330 /** \brief Data Memory Barrier
R66Y 0:80df663dd15e 331
R66Y 0:80df663dd15e 332 This function ensures the apparent order of the explicit memory operations before
R66Y 0:80df663dd15e 333 and after the instruction, without ensuring their completion.
R66Y 0:80df663dd15e 334 */
R66Y 0:80df663dd15e 335 __attribute__( ( always_inline ) ) static __INLINE void __DMB(void)
R66Y 0:80df663dd15e 336 {
R66Y 0:80df663dd15e 337 __ASM volatile ("dmb");
R66Y 0:80df663dd15e 338 }
R66Y 0:80df663dd15e 339
R66Y 0:80df663dd15e 340
R66Y 0:80df663dd15e 341 /** \brief Reverse byte order (32 bit)
R66Y 0:80df663dd15e 342
R66Y 0:80df663dd15e 343 This function reverses the byte order in integer value.
R66Y 0:80df663dd15e 344
R66Y 0:80df663dd15e 345 \param [in] value Value to reverse
R66Y 0:80df663dd15e 346 \return Reversed value
R66Y 0:80df663dd15e 347 */
R66Y 0:80df663dd15e 348 __attribute__( ( always_inline ) ) static __INLINE uint32_t __REV(uint32_t value)
R66Y 0:80df663dd15e 349 {
R66Y 0:80df663dd15e 350 uint32_t result;
R66Y 0:80df663dd15e 351
R66Y 0:80df663dd15e 352 __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) );
R66Y 0:80df663dd15e 353 return(result);
R66Y 0:80df663dd15e 354 }
R66Y 0:80df663dd15e 355
R66Y 0:80df663dd15e 356
R66Y 0:80df663dd15e 357 /** \brief Reverse byte order (16 bit)
R66Y 0:80df663dd15e 358
R66Y 0:80df663dd15e 359 This function reverses the byte order in two unsigned short values.
R66Y 0:80df663dd15e 360
R66Y 0:80df663dd15e 361 \param [in] value Value to reverse
R66Y 0:80df663dd15e 362 \return Reversed value
R66Y 0:80df663dd15e 363 */
R66Y 0:80df663dd15e 364 __attribute__( ( always_inline ) ) static __INLINE uint32_t __REV16(uint32_t value)
R66Y 0:80df663dd15e 365 {
R66Y 0:80df663dd15e 366 uint32_t result;
R66Y 0:80df663dd15e 367
R66Y 0:80df663dd15e 368 __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) );
R66Y 0:80df663dd15e 369 return(result);
R66Y 0:80df663dd15e 370 }
R66Y 0:80df663dd15e 371
R66Y 0:80df663dd15e 372
R66Y 0:80df663dd15e 373 /** \brief Reverse byte order in signed short value
R66Y 0:80df663dd15e 374
R66Y 0:80df663dd15e 375 This function reverses the byte order in a signed short value with sign extension to integer.
R66Y 0:80df663dd15e 376
R66Y 0:80df663dd15e 377 \param [in] value Value to reverse
R66Y 0:80df663dd15e 378 \return Reversed value
R66Y 0:80df663dd15e 379 */
R66Y 0:80df663dd15e 380 __attribute__( ( always_inline ) ) static __INLINE int32_t __REVSH(int32_t value)
R66Y 0:80df663dd15e 381 {
R66Y 0:80df663dd15e 382 uint32_t result;
R66Y 0:80df663dd15e 383
R66Y 0:80df663dd15e 384 __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) );
R66Y 0:80df663dd15e 385 return(result);
R66Y 0:80df663dd15e 386 }
R66Y 0:80df663dd15e 387
R66Y 0:80df663dd15e 388
R66Y 0:80df663dd15e 389 #if (__CORTEX_M >= 0x03)
R66Y 0:80df663dd15e 390
R66Y 0:80df663dd15e 391 /** \brief Reverse bit order of value
R66Y 0:80df663dd15e 392
R66Y 0:80df663dd15e 393 This function reverses the bit order of the given value.
R66Y 0:80df663dd15e 394
R66Y 0:80df663dd15e 395 \param [in] value Value to reverse
R66Y 0:80df663dd15e 396 \return Reversed value
R66Y 0:80df663dd15e 397 */
R66Y 0:80df663dd15e 398 __attribute__( ( always_inline ) ) static __INLINE uint32_t __RBIT(uint32_t value)
R66Y 0:80df663dd15e 399 {
R66Y 0:80df663dd15e 400 uint32_t result;
R66Y 0:80df663dd15e 401
R66Y 0:80df663dd15e 402 __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );
R66Y 0:80df663dd15e 403 return(result);
R66Y 0:80df663dd15e 404 }
R66Y 0:80df663dd15e 405
R66Y 0:80df663dd15e 406
R66Y 0:80df663dd15e 407 /** \brief LDR Exclusive (8 bit)
R66Y 0:80df663dd15e 408
R66Y 0:80df663dd15e 409 This function performs a exclusive LDR command for 8 bit value.
R66Y 0:80df663dd15e 410
R66Y 0:80df663dd15e 411 \param [in] ptr Pointer to data
R66Y 0:80df663dd15e 412 \return value of type uint8_t at (*ptr)
R66Y 0:80df663dd15e 413 */
R66Y 0:80df663dd15e 414 __attribute__( ( always_inline ) ) static __INLINE uint8_t __LDREXB(volatile uint8_t *addr)
R66Y 0:80df663dd15e 415 {
R66Y 0:80df663dd15e 416 uint8_t result;
R66Y 0:80df663dd15e 417
R66Y 0:80df663dd15e 418 __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) );
R66Y 0:80df663dd15e 419 return(result);
R66Y 0:80df663dd15e 420 }
R66Y 0:80df663dd15e 421
R66Y 0:80df663dd15e 422
R66Y 0:80df663dd15e 423 /** \brief LDR Exclusive (16 bit)
R66Y 0:80df663dd15e 424
R66Y 0:80df663dd15e 425 This function performs a exclusive LDR command for 16 bit values.
R66Y 0:80df663dd15e 426
R66Y 0:80df663dd15e 427 \param [in] ptr Pointer to data
R66Y 0:80df663dd15e 428 \return value of type uint16_t at (*ptr)
R66Y 0:80df663dd15e 429 */
R66Y 0:80df663dd15e 430 __attribute__( ( always_inline ) ) static __INLINE uint16_t __LDREXH(volatile uint16_t *addr)
R66Y 0:80df663dd15e 431 {
R66Y 0:80df663dd15e 432 uint16_t result;
R66Y 0:80df663dd15e 433
R66Y 0:80df663dd15e 434 __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) );
R66Y 0:80df663dd15e 435 return(result);
R66Y 0:80df663dd15e 436 }
R66Y 0:80df663dd15e 437
R66Y 0:80df663dd15e 438
R66Y 0:80df663dd15e 439 /** \brief LDR Exclusive (32 bit)
R66Y 0:80df663dd15e 440
R66Y 0:80df663dd15e 441 This function performs a exclusive LDR command for 32 bit values.
R66Y 0:80df663dd15e 442
R66Y 0:80df663dd15e 443 \param [in] ptr Pointer to data
R66Y 0:80df663dd15e 444 \return value of type uint32_t at (*ptr)
R66Y 0:80df663dd15e 445 */
R66Y 0:80df663dd15e 446 __attribute__( ( always_inline ) ) static __INLINE uint32_t __LDREXW(volatile uint32_t *addr)
R66Y 0:80df663dd15e 447 {
R66Y 0:80df663dd15e 448 uint32_t result;
R66Y 0:80df663dd15e 449
R66Y 0:80df663dd15e 450 __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) );
R66Y 0:80df663dd15e 451 return(result);
R66Y 0:80df663dd15e 452 }
R66Y 0:80df663dd15e 453
R66Y 0:80df663dd15e 454
R66Y 0:80df663dd15e 455 /** \brief STR Exclusive (8 bit)
R66Y 0:80df663dd15e 456
R66Y 0:80df663dd15e 457 This function performs a exclusive STR command for 8 bit values.
R66Y 0:80df663dd15e 458
R66Y 0:80df663dd15e 459 \param [in] value Value to store
R66Y 0:80df663dd15e 460 \param [in] ptr Pointer to location
R66Y 0:80df663dd15e 461 \return 0 Function succeeded
R66Y 0:80df663dd15e 462 \return 1 Function failed
R66Y 0:80df663dd15e 463 */
R66Y 0:80df663dd15e 464 __attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)
R66Y 0:80df663dd15e 465 {
R66Y 0:80df663dd15e 466 uint32_t result;
R66Y 0:80df663dd15e 467
R66Y 0:80df663dd15e 468 __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
R66Y 0:80df663dd15e 469 return(result);
R66Y 0:80df663dd15e 470 }
R66Y 0:80df663dd15e 471
R66Y 0:80df663dd15e 472
R66Y 0:80df663dd15e 473 /** \brief STR Exclusive (16 bit)
R66Y 0:80df663dd15e 474
R66Y 0:80df663dd15e 475 This function performs a exclusive STR command for 16 bit values.
R66Y 0:80df663dd15e 476
R66Y 0:80df663dd15e 477 \param [in] value Value to store
R66Y 0:80df663dd15e 478 \param [in] ptr Pointer to location
R66Y 0:80df663dd15e 479 \return 0 Function succeeded
R66Y 0:80df663dd15e 480 \return 1 Function failed
R66Y 0:80df663dd15e 481 */
R66Y 0:80df663dd15e 482 __attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)
R66Y 0:80df663dd15e 483 {
R66Y 0:80df663dd15e 484 uint32_t result;
R66Y 0:80df663dd15e 485
R66Y 0:80df663dd15e 486 __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
R66Y 0:80df663dd15e 487 return(result);
R66Y 0:80df663dd15e 488 }
R66Y 0:80df663dd15e 489
R66Y 0:80df663dd15e 490
R66Y 0:80df663dd15e 491 /** \brief STR Exclusive (32 bit)
R66Y 0:80df663dd15e 492
R66Y 0:80df663dd15e 493 This function performs a exclusive STR command for 32 bit values.
R66Y 0:80df663dd15e 494
R66Y 0:80df663dd15e 495 \param [in] value Value to store
R66Y 0:80df663dd15e 496 \param [in] ptr Pointer to location
R66Y 0:80df663dd15e 497 \return 0 Function succeeded
R66Y 0:80df663dd15e 498 \return 1 Function failed
R66Y 0:80df663dd15e 499 */
R66Y 0:80df663dd15e 500 __attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)
R66Y 0:80df663dd15e 501 {
R66Y 0:80df663dd15e 502 uint32_t result;
R66Y 0:80df663dd15e 503
R66Y 0:80df663dd15e 504 __ASM volatile ("strex %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
R66Y 0:80df663dd15e 505 return(result);
R66Y 0:80df663dd15e 506 }
R66Y 0:80df663dd15e 507
R66Y 0:80df663dd15e 508
R66Y 0:80df663dd15e 509 /** \brief Remove the exclusive lock
R66Y 0:80df663dd15e 510
R66Y 0:80df663dd15e 511 This function removes the exclusive lock which is created by LDREX.
R66Y 0:80df663dd15e 512
R66Y 0:80df663dd15e 513 */
R66Y 0:80df663dd15e 514 __attribute__( ( always_inline ) ) static __INLINE void __CLREX(void)
R66Y 0:80df663dd15e 515 {
R66Y 0:80df663dd15e 516 __ASM volatile ("clrex");
R66Y 0:80df663dd15e 517 }
R66Y 0:80df663dd15e 518
R66Y 0:80df663dd15e 519
R66Y 0:80df663dd15e 520 /** \brief Signed Saturate
R66Y 0:80df663dd15e 521
R66Y 0:80df663dd15e 522 This function saturates a signed value.
R66Y 0:80df663dd15e 523
R66Y 0:80df663dd15e 524 \param [in] value Value to be saturated
R66Y 0:80df663dd15e 525 \param [in] sat Bit position to saturate to (1..32)
R66Y 0:80df663dd15e 526 \return Saturated value
R66Y 0:80df663dd15e 527 */
R66Y 0:80df663dd15e 528 #define __SSAT(ARG1,ARG2) \
R66Y 0:80df663dd15e 529 ({ \
R66Y 0:80df663dd15e 530 uint32_t __RES, __ARG1 = (ARG1); \
R66Y 0:80df663dd15e 531 __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
R66Y 0:80df663dd15e 532 __RES; \
R66Y 0:80df663dd15e 533 })
R66Y 0:80df663dd15e 534
R66Y 0:80df663dd15e 535
R66Y 0:80df663dd15e 536 /** \brief Unsigned Saturate
R66Y 0:80df663dd15e 537
R66Y 0:80df663dd15e 538 This function saturates an unsigned value.
R66Y 0:80df663dd15e 539
R66Y 0:80df663dd15e 540 \param [in] value Value to be saturated
R66Y 0:80df663dd15e 541 \param [in] sat Bit position to saturate to (0..31)
R66Y 0:80df663dd15e 542 \return Saturated value
R66Y 0:80df663dd15e 543 */
R66Y 0:80df663dd15e 544 #define __USAT(ARG1,ARG2) \
R66Y 0:80df663dd15e 545 ({ \
R66Y 0:80df663dd15e 546 uint32_t __RES, __ARG1 = (ARG1); \
R66Y 0:80df663dd15e 547 __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
R66Y 0:80df663dd15e 548 __RES; \
R66Y 0:80df663dd15e 549 })
R66Y 0:80df663dd15e 550
R66Y 0:80df663dd15e 551
R66Y 0:80df663dd15e 552 /** \brief Count leading zeros
R66Y 0:80df663dd15e 553
R66Y 0:80df663dd15e 554 This function counts the number of leading zeros of a data value.
R66Y 0:80df663dd15e 555
R66Y 0:80df663dd15e 556 \param [in] value Value to count the leading zeros
R66Y 0:80df663dd15e 557 \return number of leading zeros in value
R66Y 0:80df663dd15e 558 */
R66Y 0:80df663dd15e 559 __attribute__( ( always_inline ) ) static __INLINE uint8_t __CLZ(uint32_t value)
R66Y 0:80df663dd15e 560 {
R66Y 0:80df663dd15e 561 uint8_t result;
R66Y 0:80df663dd15e 562
R66Y 0:80df663dd15e 563 __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) );
R66Y 0:80df663dd15e 564 return(result);
R66Y 0:80df663dd15e 565 }
R66Y 0:80df663dd15e 566
R66Y 0:80df663dd15e 567 #endif /* (__CORTEX_M >= 0x03) */
R66Y 0:80df663dd15e 568
R66Y 0:80df663dd15e 569
R66Y 0:80df663dd15e 570
R66Y 0:80df663dd15e 571
R66Y 0:80df663dd15e 572 #elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
R66Y 0:80df663dd15e 573 /* TASKING carm specific functions */
R66Y 0:80df663dd15e 574
R66Y 0:80df663dd15e 575 /*
R66Y 0:80df663dd15e 576 * The CMSIS functions have been implemented as intrinsics in the compiler.
R66Y 0:80df663dd15e 577 * Please use "carm -?i" to get an up to date list of all intrinsics,
R66Y 0:80df663dd15e 578 * Including the CMSIS ones.
R66Y 0:80df663dd15e 579 */
R66Y 0:80df663dd15e 580
R66Y 0:80df663dd15e 581 #endif
R66Y 0:80df663dd15e 582
R66Y 0:80df663dd15e 583 /*@}*/ /* end of group CMSIS_Core_InstructionInterface */
R66Y 0:80df663dd15e 584
R66Y 0:80df663dd15e 585 #endif /* __CORE_CMINSTR_H */