161 lines
4.6 KiB
C
161 lines
4.6 KiB
C
/**************************************************************************//**
|
|
* @file cmsis_clang_r.h
|
|
* @brief CMSIS compiler armclang (Arm Compiler 6) header file
|
|
* @version V6.0.0
|
|
* @date 04. December 2024
|
|
******************************************************************************/
|
|
/*
|
|
* Copyright (c) 2009-2023 Arm Limited. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
|
* not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef __CMSIS_CLANG_CORER_H
|
|
#define __CMSIS_CLANG_CORER_H
|
|
|
|
#pragma clang system_header /* treat file as system include file */
|
|
|
|
#ifndef __CMSIS_CLANG_H
|
|
#error "This file must not be included directly"
|
|
#endif
|
|
|
|
|
|
/* ########################### Core Function Access ########################### */
|
|
/** \ingroup CMSIS_Core_FunctionInterface
|
|
\defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions
|
|
@{
|
|
*/
|
|
|
|
/** \brief Get CPSR Register
|
|
\return CPSR Register value
|
|
*/
|
|
__STATIC_FORCEINLINE uint32_t __get_CPSR(void)
|
|
{
|
|
uint32_t result;
|
|
__ASM volatile("MRS %0, cpsr" : "=r" (result) );
|
|
return(result);
|
|
}
|
|
|
|
/** \brief Set CPSR Register
|
|
\param [in] cpsr CPSR value to set
|
|
*/
|
|
__STATIC_FORCEINLINE void __set_CPSR(uint32_t cpsr)
|
|
{
|
|
__ASM volatile ("MSR cpsr, %0" : : "r" (cpsr) : "cc", "memory");
|
|
}
|
|
|
|
/** \brief Get Mode
|
|
\return Processor Mode
|
|
*/
|
|
__STATIC_FORCEINLINE uint32_t __get_mode(void)
|
|
{
|
|
return (__get_CPSR() & 0x1FU);
|
|
}
|
|
|
|
/** \brief Set Mode
|
|
\param [in] mode Mode value to set
|
|
*/
|
|
__STATIC_FORCEINLINE void __set_mode(uint32_t mode)
|
|
{
|
|
__ASM volatile("MSR cpsr_c, %0" : : "r" (mode) : "memory");
|
|
}
|
|
|
|
/** \brief Get Stack Pointer
|
|
\return Stack Pointer value
|
|
*/
|
|
__STATIC_FORCEINLINE uint32_t __get_SP(void)
|
|
{
|
|
uint32_t result;
|
|
__ASM volatile("MOV %0, sp" : "=r" (result) : : "memory");
|
|
return result;
|
|
}
|
|
|
|
/** \brief Set Stack Pointer
|
|
\param [in] stack Stack Pointer value to set
|
|
*/
|
|
__STATIC_FORCEINLINE void __set_SP(uint32_t stack)
|
|
{
|
|
__ASM volatile("MOV sp, %0" : : "r" (stack) : "memory");
|
|
}
|
|
|
|
/** \brief Get USR/SYS Stack Pointer
|
|
\return USR/SYS Stack Pointer value
|
|
*/
|
|
__STATIC_FORCEINLINE uint32_t __get_SP_usr(void)
|
|
{
|
|
uint32_t cpsr;
|
|
uint32_t result;
|
|
__ASM volatile(
|
|
"MRS %0, cpsr \n"
|
|
"CPS #0x1F \n" // no effect in USR mode
|
|
"MOV %1, sp \n"
|
|
"MSR cpsr_c, %0 \n" // no effect in USR mode
|
|
"ISB" : "=r"(cpsr), "=r"(result) : : "memory"
|
|
);
|
|
return result;
|
|
}
|
|
|
|
/** \brief Set USR/SYS Stack Pointer
|
|
\param [in] topOfProcStack USR/SYS Stack Pointer value to set
|
|
*/
|
|
__STATIC_FORCEINLINE void __set_SP_usr(uint32_t topOfProcStack)
|
|
{
|
|
uint32_t cpsr;
|
|
__ASM volatile(
|
|
"MRS %0, cpsr \n"
|
|
"CPS #0x1F \n" // no effect in USR mode
|
|
"MOV sp, %1 \n"
|
|
"MSR cpsr_c, %0 \n" // no effect in USR mode
|
|
"ISB" : "=r"(cpsr) : "r" (topOfProcStack) : "memory"
|
|
);
|
|
}
|
|
|
|
/** \brief Get FPEXC
|
|
\return Floating Point Exception Control register value
|
|
*/
|
|
__STATIC_FORCEINLINE uint32_t __get_FPEXC(void)
|
|
{
|
|
#if (__FPU_PRESENT == 1)
|
|
uint32_t result;
|
|
__ASM volatile("VMRS %0, fpexc" : "=r" (result) : : "memory");
|
|
return(result);
|
|
#else
|
|
return(0);
|
|
#endif
|
|
}
|
|
|
|
/** \brief Set FPEXC
|
|
\param [in] fpexc Floating Point Exception Control value to set
|
|
*/
|
|
__STATIC_FORCEINLINE void __set_FPEXC(uint32_t fpexc)
|
|
{
|
|
#if (__FPU_PRESENT == 1)
|
|
__ASM volatile ("VMSR fpexc, %0" : : "r" (fpexc) : "memory");
|
|
#endif
|
|
}
|
|
|
|
/** @} end of CMSIS_Core_RegAccFunctions */
|
|
|
|
|
|
/*
|
|
* Include common core functions to access Coprocessor 15 registers
|
|
*/
|
|
|
|
#define __get_CP(cp, op1, Rt, CRn, CRm, op2) __ASM volatile("MRC p" # cp ", " # op1 ", %0, c" # CRn ", c" # CRm ", " # op2 : "=r" (Rt) : : "memory" )
|
|
#define __set_CP(cp, op1, Rt, CRn, CRm, op2) __ASM volatile("MCR p" # cp ", " # op1 ", %0, c" # CRn ", c" # CRm ", " # op2 : : "r" (Rt) : "memory" )
|
|
#define __get_CP64(cp, op1, Rt, CRm) __ASM volatile("MRRC p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : "=r" (Rt) : : "memory" )
|
|
#define __set_CP64(cp, op1, Rt, CRm) __ASM volatile("MCRR p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : : "r" (Rt) : "memory" )
|
|
|
|
#endif /* __CMSIS_CLANG_COREA_H */
|