/******************** (C) COPYRIGHT 2010 Embest Info&Tech Co.,LTD. ************
* 文件名: core_cm0.h
* 作者 : Wuhan R&D Center, Embest
* 日期 : 01/18/2010
* 描述 : CMSIS Cortex-M0核外围访问层头文件
*******************************************************************************
*******************************************************************************
* 历史:
* 01/18/2010 : V1.0 初始版本
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#ifndef __CM0_CORE_H__
#define __CM0_CORE_H__
#ifdef __cplusplus
extern "C" {
#endif
#define __CM0_CMSIS_VERSION_MAIN (0x01) /*!< [31:16] CMSIS HAL 主版本号 */
#define __CM0_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL 子版本号 */
#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16) | __CM0_CMSIS_VERSION_SUB) /*!< CMSIS HAL 版本号 */
#define __CORTEX_M (0x00) /*!< Cortex 核 */
#include
#if defined (__ICCARM__)
#include /* IAR 内联 */
#endif
#ifndef __NVIC_PRIO_BITS
#define __NVIC_PRIO_BITS 2 /*!< NVIC优先级位数定义*/
#endif
/**
* IO 定义
*
* 定义外围寄存器访问权限
*/
#ifdef __cplusplus
#define __I volatile /*!< 'read only'允许 */
#else
#define __I volatile const /*!< 'read only'允许 */
#endif
#define __O volatile /*!< 'write only'允许 */
#define __IO volatile /*!< 'read / write'可读写 */
/* Private typedef ------------------------------------------------------------*/
/* System Reset */
#define NVIC_VECTRESET 0 /*!< 向量表复位 */
#define NVIC_SYSRESETREQ 2 /*!< 系统复位请求 */
#define NVIC_AIRCR_VECTKEY (0x5FA << 16) /*!< AIRCR Key用于写允许 */
#define NVIC_AIRCR_ENDIANESS 15 /*!< 端对齐 */
/* 嵌套向量中断控制器(NVIC)寄存器映射 */
typedef struct
{
__IO uint32_t ISER[1]; /*!< 中断设置使能寄存器 */
uint32_t RESERVED0[31];
__IO uint32_t ICER[1]; /*!< 中断清除使能寄存器 */
uint32_t RSERVED1[31];
__IO uint32_t ISPR[1]; /*!< 中断设置悬起寄存器 */
uint32_t RESERVED2[31];
__IO uint32_t ICPR[1]; /*!< 中断清除悬起寄存器 */
uint32_t RESERVED3[31];
uint32_t RESERVED4[64];
__IO uint32_t IPR[8]; /*!< 中断优先级寄存器 */
} NVIC_Type;
/* 系统控制块寄存器映射 */
typedef struct
{
__I uint32_t CPUID; /*!< CPU ID基址寄存器 */
__IO uint32_t ICSR; /*!< 中断控制状态寄存器 */
uint32_t RESERVED0;
__IO uint32_t AIRCR; /*!< 应用程序中断/复位控制寄存器 */
__IO uint32_t SCR; /*!< 系统控制寄存器 */
__IO uint32_t CCR; /*!< 配置控制寄存器 */
uint32_t RESERVED1;
__IO uint32_t SHP[2]; /*!< 系统处理优先级寄存器,0位保留 */
__IO uint32_t SHCSR; /*!< 系统处理控制和状态寄存器 */
uint32_t RESERVED2[2];
__IO uint32_t DFSR; /*!< 调试故障状态寄存器 */
} SCB_Type;
/* 系统滴答存储器映射 */
typedef struct
{
__IO uint32_t CTRL; /*!< SysTick控制和状态寄存器 */
__IO uint32_t LOAD; /*!< SysTick重装载值寄存器 */
__IO uint32_t VAL; /*!< SysTick当前值寄存器 */
__I uint32_t CALIB; /*!< SysTick校验寄存器 */
} SysTick_Type;
/* 内核调试寄存器 */
typedef struct
{
__IO uint32_t DHCSR; /*!< 调试停机控制和状态寄存器 */
__O uint32_t DCRSR; /*!< 调试内核寄存器选择寄存器 */
__IO uint32_t DCRDR; /*!< 调试内核寄存器数据寄存器 */
__IO uint32_t DEMCR; /*!< 调试异常和监控控制寄存器 */
} CoreDebug_Type;
/* Cortex-M0硬件存储器映射 */
#define SCS_BASE (0xE000E000) /*!< 系统控制空间基地址 */
#define CoreDebug_BASE (0xE000EDF0) /*!< 内核调试基地址 */
#define SysTick_BASE (SCS_BASE + 0x0010) /*!< SysTick基地址 */
#define NVIC_BASE (SCS_BASE + 0x0100) /*!< NVIC基地址 */
#define SCB_BASE (SCS_BASE + 0x0D00) /*!< 系统控制块基地址 */
#define SCB ((SCB_Type *) SCB_BASE) /*!< SCB配置结构 */
#define SysTick ((SysTick_Type *) SysTick_BASE) /*!< SysTick配置结构 */
#define NVIC ((NVIC_Type *) NVIC_BASE) /*!< NVIC配置结构 */
#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug配置结构 */
/*******************************************************************************
* 硬件抽象层
******************************************************************************/
#if defined ( __CC_ARM )
#define __ASM __asm
#define __INLINE __inline
#elif defined ( __ICCARM__ )
#define __ASM __asm
#define __INLINE inline
#elif defined ( __GNUC__ )
#define __ASM __asm
#define __INLINE inline
#elif defined ( __TASKING__ )
#define __ASM __asm
#define __INLINE inline
#endif
/* ################### 编译器特性相关 ########################### */
#if defined ( __CC_ARM ) /*------------------RealView编译器 -----------------*/
#define __enable_fault_irq __enable_fiq
#define __disable_fault_irq __disable_fiq
#define __NOP __nop
#define __WFI __wfi
#define __WFE __wfe
#define __SEV __sev
#define __ISB() __isb(0)
#define __DSB() __dsb(0)
#define __DMB() __dmb(0)
#define __REV __rev
/* intrinsic void __enable_irq(); */
/* intrinsic void __disable_irq(); */
extern uint32_t __get_PSP(void);
extern void __set_PSP(uint32_t topOfProcStack);
extern uint32_t __get_MSP(void);
extern void __set_MSP(uint32_t topOfMainStack);
extern uint32_t __REV16(uint16_t value);
extern int32_t __REVSH(int16_t value);
#if (__ARMCC_VERSION < 400000)
extern uint32_t __get_PRIMASK(void);
extern void __set_PRIMASK(uint32_t priMask);
extern uint32_t __get_CONTROL(void);
extern void __set_CONTROL(uint32_t control);
#else /* (__ARMCC_VERSION >= 400000) */
/**
* @函数名:__get_PRIMASK
* @描述:获取优先级屏蔽状态
* @参数: 无
* @返回值:uint32_t PriMask
*/
static __INLINE uint32_t __get_PRIMASK(void)
{
register uint32_t __regPriMask __ASM("primask");
return(__regPriMask);
}
/**
* @函数名:__set_PRIMASK
* @描述:配置优先级屏蔽寄存器
* @参数: uint32_t PriMask
* @返回值:无
*/
static __INLINE void __set_PRIMASK(uint32_t priMask)
{
register uint32_t __regPriMask __ASM("primask");
__regPriMask = (priMask);
}
/**
* @函数名:__get_CONTROL
* @描述:返回控制寄存器值
* @参数: 无
* @返回值:uint32_t 控制寄存器值
*/
static __INLINE uint32_t __get_CONTROL(void)
{
register uint32_t __regControl __ASM("control");
return(__regControl);
}
/**
* @函数名:__set_CONTROL
* @描述:设置控制寄存器
* @参数: uint32_t 控制寄存器值
* @返回值:无
*/
static __INLINE void __set_CONTROL(uint32_t control)
{
register uint32_t __regControl __ASM("control");
__regControl = control;
}
#endif /* __ARMCC_VERSION */
#elif (defined (__ICCARM__)) /*------------------ ICC编译器 -------------------*/
#define __enable_irq __enable_interrupt /*!< 全局中断使能 */
#define __disable_irq __disable_interrupt /*!< 全局中断除能 */
static __INLINE void __enable_fault_irq() { __ASM ("cpsie f"); }
static __INLINE void __disable_fault_irq() { __ASM ("cpsid f"); }
#define __NOP __no_operation()
static __INLINE void __WFI() { __ASM ("wfi"); }
static __INLINE void __WFE() { __ASM ("wfe"); }
static __INLINE void __SEV() { __ASM ("sev"); }
/* intrinsic void __ISB(void) */
/* intrinsic void __DSB(void) */
/* intrinsic void __DMB(void) */
/* intrinsic void __set_PRIMASK(); */
/* intrinsic void __get_PRIMASK(); */
/* intrinsic uint32_t __REV(uint32_t value); */
/* intrinsic uint32_t __REVSH(uint32_t value); */
extern uint32_t __get_PSP(void);
extern void __set_PSP(uint32_t topOfProcStack);
extern uint32_t __get_MSP(void);
extern void __set_MSP(uint32_t topOfMainStack);
extern uint32_t __REV16(uint16_t value);
#elif (defined (__GNUC__)) /*------------------ GNU编译器 ---------------------*/
static __INLINE void __enable_irq() { __ASM volatile ("cpsie i"); }
static __INLINE void __disable_irq() { __ASM volatile ("cpsid i"); }
static __INLINE void __enable_fault_irq() { __ASM volatile ("cpsie f"); }
static __INLINE void __disable_fault_irq() { __ASM volatile ("cpsid f"); }
static __INLINE void __NOP() { __ASM volatile ("nop"); }
static __INLINE void __WFI() { __ASM volatile ("wfi"); }
static __INLINE void __WFE() { __ASM volatile ("wfe"); }
static __INLINE void __SEV() { __ASM volatile ("sev"); }
static __INLINE void __ISB() { __ASM volatile ("isb"); }
static __INLINE void __DSB() { __ASM volatile ("dsb"); }
static __INLINE void __DMB() { __ASM volatile ("dmb"); }
extern uint32_t __get_PSP(void);
extern void __set_PSP(uint32_t topOfProcStack);
extern uint32_t __get_MSP(void);
extern void __set_MSP(uint32_t topOfMainStack);
extern uint32_t __get_PRIMASK(void);
extern void __set_PRIMASK(uint32_t priMask);
extern uint32_t __get_CONTROL(void);
extern void __set_CONTROL(uint32_t control);
extern uint32_t __REV(uint32_t value);
extern uint32_t __REV16(uint16_t value);
extern int32_t __REVSH(int16_t value);
#elif (defined (__TASKING__)) /*------------------ TASKING 编译器 ---------------------*/
#endif
/* ########################## NVIC 函数 #################################### */
#define _BIT_SHIFT(IRQn) ( (((uint32_t)(IRQn) ) & 0x03) * 8 )
#define _SHP_IDX(IRQn) ( ((((uint32_t)(IRQn) & 0x0F)-8) >> 2) )
#define _IP_IDX(IRQn) ( ((uint32_t)(IRQn) >> 2) )
/**
* @函数名:NVIC_EnableIRQ
* @描述:使能NVIC中断控制寄存器中相应位
* @参数: IRQn_Type IRQn指定中断号
* @返回值:无
*/
static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
{
NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* 使能中断 */
}
/**
* @函数名:NVIC_DisableIRQ
* @描述:除能一个具体设备外部中断
* @参数: IRQn_Type IRQn外部中断号,正数
* @返回值:无
*/
static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)
{
NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* 除能中断 */
}
/**
* @函数名:NVIC_GetPendingIRQ
* @描述:获取中断悬起状态
* @参数: IRQn_Type IRQn具体设备中断号
* @返回值:uint32_t 如果中断悬起返回1,否则返回0
*/
static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
{
return((uint32_t) ((NVIC->ISPR[0] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0));
}
/**
* @函数名:NVIC_SetPendingIRQ
* @描述:为外部中断设置悬起位
* @参数: IRQn_Type IRQn中断号
* @返回值:无
*/
static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)
{
NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F));
}
/**
* @函数名:NVIC_ClearPendingIRQ
* @描述:清除外部中断悬起位
* @参数: IRQn_Type IRQn为中断号
* @返回值:无
*/
static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
{
NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F));
}
/**
* @函数名:NVIC_SetPriority
* @描述:设置中断优先级
* @参数: IRQn_Type IRQn中断号
* @返回值:无
*/
static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
{
if(IRQn < 0) {
SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
(((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); }
else {
NVIC->IPR[_IP_IDX(IRQn)] = (NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
(((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); }
}
/**
* @函数名:NVIC_GetPriority
* @描述:获取中断优先级
* @参数: IRQn_Type IRQn中断号
* @返回值:priority中断优先级
*/
static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)
{
if(IRQn < 0) {
return((uint32_t)((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); }
else {
return((uint32_t)((NVIC->IPR[_IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); }
}
/* ################################## SysTick函数 ############################################ */
#if (!defined (__Vendor_SysTickConfig)) || (__Vendor_SysTickConfig == 0)
/* SysTick 常量 */
#define SYSTICK_ENABLE 0 /* 配置第0位启动或停止滴答定时器 */
#define SYSTICK_TICKINT 1 /* 使能或除能滴答中断 */
#define SYSTICK_CLKSOURCE 2 /* 滴答时钟源配置 */
#define SYSTICK_MAXCOUNT ((1<<24) -1) /* 滴答最大记数 */
/**
* @函数名: SysTick_Config
* @描述: 初始化并启动滴答定时器,包括中断配置
* @参数: uint32_t ticks滴答中断周期
* @返回值: 无
*/
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SYSTICK_MAXCOUNT) return (1); /* 重装载除能 */
SysTick->LOAD = (ticks & SYSTICK_MAXCOUNT) - 1; /* 设置重装载寄存器 */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* 设置滴答中断优先级 */
SysTick->VAL = (0x00); /* 设置滴答计数器初始值 */
SysTick->CTRL = (1 << SYSTICK_CLKSOURCE) | (1<<SYSTICK_ENABLE) | (1<<SYSTICK_TICKINT); /* 使能滴答定时器 */
return (0); /* 初始化成功 */
}
#endif
/* ################################## Reset 函数 ############################################ */
/**
* @函数名: NVIC_SystemReset
* @描述: 初始化一个系统复位,请求复位MCU
* @参数: 无
* @返回值: 无
*/
static __INLINE void NVIC_SystemReset(void)
{
SCB->AIRCR = (NVIC_AIRCR_VECTKEY | (1<<NVIC_SYSRESETREQ)); /* 保持优先级分组不变 */
__DSB(); /* 保证存储器访问已完成 */
while(1); /* 等待直到复位完成 */
}
#ifdef __cplusplus
}
#endif
#endif /* __CM0_CORE_H__ */
/**
* @}
*/
/**
* @}
*/
/************* (C) COPYRIGHT 2010 Wuhan R&D Center, Embest *****文件结束*******/
共2条
1/1 1 跳转至页
排了下版
/******************** (C) COPYRIGHT 2010 Embest Info&Tech Co.,LTD. ************ * 文件名: core_cm0.h * 作者 : Wuhan R&D Center, Embest * 日期 : 01/18/2010 * 描述 : CMSIS Cortex-M0核外围访问层头文件 ******************************************************************************* ******************************************************************************* * 历史: * 01/18/2010 : V1.0 初始版本 ******************************************************************************* / /* Includes ------------------------------------------------------------------*/ #ifndef __CM0_CORE_H__ #define __CM0_CORE_H__ /* 这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的 话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的代码,那么 加入"extern "C"{" 和 " }"处理其中的代码,其中{ }内部的代码是通过extern"C"进行处理。 要明白为何使用extern"C",还得从cpp中对函数的重载处理开始说起。在c++中,为了支持重载机制, 在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等.而在C中, 只是简单的函数名字而已,不会加入其他的信息.也就是说:C++和C对产生的函数名字的处理是不一样的. C++之父在设计C++之时,考虑到当时已经存在了大量的C代码,为了支持原来的C代码和 已经写好C库,需要在C++中尽可能的支持C,而extern"C"就是其中的一个策略。因此,为了在C++代码 中调用用C写成的库文件,就需要用extern"C"来告诉编译器:这是一个用C写成的库文件,请用C的 方式来链接它们。这个{}里面的#endif对应上面的#ifdef-cplusplus,#ifdef-cplusplus对应 最后的#endif, #ifdef与#endif总是一一对应的,表明条件编译开始和结束。 如果使用C++,该部分用C编译 */ #ifdef __cplusplus extern "C" { #endif /*!< [31:16] CMSIS HAL 主版本号 */ #define __CM0_CMSIS_VERSION_MAIN (0x01) /*!< [15:0] CMSIS HAL 子版本号 */ #define __CM0_CMSIS_VERSION_SUB (0x20) /*!< CMSIS HAL 版本号 */ //常量__CM0_CMSIS_VERSION_MAIN左移结果和MCU的位数有关 #define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16) | __CM0_CMSIS_VERSION_SUB) /*!< Cortex 核 */ #define __CORTEX_M (0x00) #include /* IAR 内联 */ #if defined (__ICCARM__) #include #endif /*!< NVIC优先级位数定义 */ #ifndef __NVIC_PRIO_BITS #define __NVIC_PRIO_BITS 2 #endif /** * IO 定义 ** * 定义外围寄存器访问权限 */ #ifdef __cplusplus /*1 volatile 定义的值含义是:编译器在编译时对变量不进行优化(如:将其读入寄存器中保存)操作。 它的值必须从其原始地址读取,因为它受多个外围因素的影响而变化 2 C++中,const修饰的标识符在编译期间值已知,则并不给const常量分配存储,而是将它放到一个符号表中 /*!< 'read only'允许 */ #define __I volatile #else /* C中的const表示:程序无法改变该值, volatile const表示虽然程序改变不了它, 但外设输入等外围因素会使之改变 /*!< 'read only'允许 */ #define __I volatile const #endif /*!< 'write only'允许 */ #define __O volatile /*!< 'read / write'可读写 */ #define __IO volatile /* Private typedef ------------------------------------------------------------*/ /* System Reset */ #define NVIC_VECTRESET 0 /*!< 向量表复位 */ #define NVIC_SYSRESETREQ 2 /*!< 系统复位请求 */ #define NVIC_AIRCR_VECTKEY (0x5FA << 16) /*!< AIRCR Key用于写允许 */ #define NVIC_AIRCR_ENDIANESS 15 /*!< 端对齐 */ /* 嵌套向量中断控制器(NVIC)寄存器映射 */ typedef struct { __IO uint32_t ISER[1]; /*!< 中断设置使能寄存器 */ uint32_t RESERVED0[31]; __IO uint32_t ICER[1]; /*!< 中断清除使能寄存器 */ uint32_t RSERVED1[31]; __IO uint32_t ISPR[1]; /*!< 中断设置悬起寄存器 */ uint32_t RESERVED2[31]; __IO uint32_t ICPR[1]; /*!< 中断清除悬起寄存器 */ uint32_t RESERVED3[31]; uint32_t RESERVED4[64]; __IO uint32_t IPR[8]; /*!< 中断优先级寄存器 */ } NVIC_Type; /* 系统控制块寄存器映射 */ typedef struct { __I uint32_t CPUID; /*!< CPU ID基址寄存器 */ __IO uint32_t ICSR; /*!< 中断控制状态寄存器 */ uint32_t RESERVED0; __IO uint32_t AIRCR; /*!< 应用程序中断/复位控制寄存器 */ __IO uint32_t SCR; /*!< 系统控制寄存器 */ __IO uint32_t CCR; /*!< 配置控制寄存器 */ uint32_t RESERVED1; __IO uint32_t SHP[2]; /*!< 系统处理优先级寄存器,0位保留 */ __IO uint32_t SHCSR; /*!< 系统处理控制和状态寄存器 */ uint32_t RESERVED2[2]; __IO uint32_t DFSR; /*!< 调试故障状态寄存器 */ } SCB_Type; /* 系统滴答存储器映射 */ typedef struct { __IO uint32_t CTRL; /*!< SysTick控制和状态寄存器 */ __IO uint32_t LOAD; /*!< SysTick重装载值寄存器 */ __IO uint32_t VAL; /*!< SysTick当前值寄存器 */ __I uint32_t CALIB; /*!< SysTick校验寄存器 */ } SysTick_Type; /* 内核调试寄存器 */ typedef struct { __IO uint32_t DHCSR; /*!< 调试停机控制和状态寄存器 */ __O uint32_t DCRSR; /*!< 调试内核寄存器选择寄存器 */ __IO uint32_t DCRDR; /*!< 调试内核寄存器数据寄存器 */ __IO uint32_t DEMCR; /*!< 调试异常和监控控制寄存器 */ } CoreDebug_Type; /* Cortex-M0硬件存储器映射 */ #define SCS_BASE (0xE000E000) /*!< 系统控制空间基地址 */ #define CoreDebug_BASE (0xE000EDF0) /*!< 内核调试基地址 */ #define SysTick_BASE (SCS_BASE + 0x0010) /*!< SysTick基地址 */ #define NVIC_BASE (SCS_BASE + 0x0100) /*!< NVIC基地址 */ #define SCB_BASE (SCS_BASE + 0x0D00) /*!< 系统控制块基地址 */ #define SCB ((SCB_Type *) SCB_BASE) /*!< SCB配置结构 */ #define SysTick ((SysTick_Type *) SysTick_BASE) /*!< SysTick配置结构 */ #define NVIC ((NVIC_Type *) NVIC_BASE) /*!< NVIC配置结构 */ #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug配置结构 */ /******************************************************************************* * 硬件抽象层 ******************************************************************************/ #if defined ( __CC_ARM ) #define __ASM __asm #define __INLINE __inline #elif defined ( __ICCARM__ ) #define __ASM __asm #define __INLINE inline #elif defined ( __GNUC__ ) #define __ASM __asm #define __INLINE inline #elif defined ( __TASKING__ ) #define __ASM __asm #define __INLINE inline #endif /* ################### 编译器特性相关 ########################### */ #if defined ( __CC_ARM ) /*------------------RealView编译器 -----------------*/ #define __enable_fault_irq __enable_fiq #define __disable_fault_irq __disable_fiq #define __NOP __nop #define __WFI __wfi #define __WFE __wfe #define __SEV __sev #define __ISB() __isb(0) #define __DSB() __dsb(0) #define __DMB() __dmb(0) #define __REV __rev /* intrinsic void __enable_irq(); */ /* intrinsic void __disable_irq(); */ extern uint32_t __get_PSP(void); extern void __set_PSP(uint32_t topOfProcStack); extern uint32_t __get_MSP(void); extern void __set_MSP(uint32_t topOfMainStack); extern uint32_t __REV16(uint16_t value); extern int32_t __REVSH(int16_t value); #if (__ARMCC_VERSION < 400000) extern uint32_t __get_PRIMASK(void); extern void __set_PRIMASK(uint32_t priMask); extern uint32_t __get_CONTROL(void); extern void __set_CONTROL(uint32_t control); #else /* (__ARMCC_VERSION >= 400000) */ /** * @函数名:__get_PRIMASK * @描述:获取优先级屏蔽状态 * @参数: 无 * @返回值:uint32_t PriMask */ static __INLINE uint32_t __get_PRIMASK(void) { register uint32_t __regPriMask __ASM("primask"); return(__regPriMask); } /** * @函数名:__set_PRIMASK * @描述:配置优先级屏蔽寄存器 * @参数: uint32_t PriMask * @返回值:无 */ static __INLINE void __set_PRIMASK(uint32_t priMask) { register uint32_t __regPriMask __ASM("primask"); __regPriMask = (priMask); } /** * @函数名:__get_CONTROL * @描述:返回控制寄存器值 * @参数: 无 * @返回值:uint32_t 控制寄存器值 */ static __INLINE uint32_t __get_CONTROL(void) { register uint32_t __regControl __ASM("control"); return(__regControl); } /** * @函数名:__set_CONTROL * @描述:设置控制寄存器 * @参数: uint32_t 控制寄存器值 * @返回值:无 */ static __INLINE void __set_CONTROL(uint32_t control) { register uint32_t __regControl __ASM("control"); __regControl = control; } #endif /* __ARMCC_VERSION */ #elif (defined (__ICCARM__)) /*------------------ ICC编译器 -------------------*/ #define __enable_irq __enable_interrupt /*!< 全局中断使能 */ #define __disable_irq __disable_interrupt /*!< 全局中断除能 */ static __INLINE void __enable_fault_irq() { __ASM ("cpsie f"); } static __INLINE void __disable_fault_irq() { __ASM ("cpsid f"); } #define __NOP __no_operation() static __INLINE void __WFI() { __ASM ("wfi"); } static __INLINE void __WFE() { __ASM ("wfe"); } static __INLINE void __SEV() { __ASM ("sev"); } /* intrinsic void __ISB(void) */ /* intrinsic void __DSB(void) */ /* intrinsic void __DMB(void) */ /* intrinsic void __set_PRIMASK(); */ /* intrinsic void __get_PRIMASK(); */ /* intrinsic uint32_t __REV(uint32_t value); */ /* intrinsic uint32_t __REVSH(uint32_t value); */ extern uint32_t __get_PSP(void); extern void __set_PSP(uint32_t topOfProcStack); extern uint32_t __get_MSP(void); extern void __set_MSP(uint32_t topOfMainStack); extern uint32_t __REV16(uint16_t value); #elif (defined (__GNUC__)) /*------------------ GNU编译器 ---------------------*/ static __INLINE void __enable_irq() { __ASM volatile ("cpsie i"); } static __INLINE void __disable_irq() { __ASM volatile ("cpsid i"); } static __INLINE void __enable_fault_irq() { __ASM volatile ("cpsie f"); } static __INLINE void __disable_fault_irq() { __ASM volatile ("cpsid f"); } static __INLINE void __NOP() { __ASM volatile ("nop"); } static __INLINE void __WFI() { __ASM volatile ("wfi"); } static __INLINE void __WFE() { __ASM volatile ("wfe"); } static __INLINE void __SEV() { __ASM volatile ("sev"); } static __INLINE void __ISB() { __ASM volatile ("isb"); } static __INLINE void __DSB() { __ASM volatile ("dsb"); } static __INLINE void __DMB() { __ASM volatile ("dmb"); } extern uint32_t __get_PSP(void); extern void __set_PSP(uint32_t topOfProcStack); extern uint32_t __get_MSP(void); extern void __set_MSP(uint32_t topOfMainStack); extern uint32_t __get_PRIMASK(void); extern void __set_PRIMASK(uint32_t priMask); extern uint32_t __get_CONTROL(void); extern void __set_CONTROL(uint32_t control); extern uint32_t __REV(uint32_t value); extern uint32_t __REV16(uint16_t value); extern int32_t __REVSH(int16_t value); #elif (defined (__TASKING__)) /*------------------ TASKING 编译器 ---------------------*/ #endif /* ########################## NVIC 函数 #################################### */ #define _BIT_SHIFT(IRQn) ( (((uint32_t)(IRQn) ) & 0x03) * 8 ) #define _SHP_IDX(IRQn) ( ((((uint32_t)(IRQn) & 0x0F)-8) >> 2) ) #define _IP_IDX(IRQn) ( ((uint32_t)(IRQn) >> 2) ) /** * @函数名:NVIC_EnableIRQ * @描述:使能NVIC中断控制寄存器中相应位 * @参数: IRQn_Type IRQn指定中断号 * @返回值:无 */ static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) { NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* 使能中断 */ } /** * @函数名:NVIC_DisableIRQ * @描述:除能一个具体设备外部中断 * @参数: IRQn_Type IRQn外部中断号,正数 * @返回值:无 */ static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) { NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* 除能中断 */ } /** * @函数名:NVIC_GetPendingIRQ * @描述:获取中断悬起状态 * @参数: IRQn_Type IRQn具体设备中断号 * @返回值:uint32_t 如果中断悬起返回1,否则返回0 */ static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) { return((uint32_t) ((NVIC->ISPR[0] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); } /** * @函数名:NVIC_SetPendingIRQ * @描述:为外部中断设置悬起位 * @参数: IRQn_Type IRQn中断号 * @返回值:无 */ static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) { NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); } /** * @函数名:NVIC_ClearPendingIRQ * @描述:清除外部中断悬起位 * @参数: IRQn_Type IRQn为中断号 * @返回值:无 */ static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) { NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); } /** * @函数名:NVIC_SetPriority * @描述:设置中断优先级 * @参数: IRQn_Type IRQn中断号 * @返回值:无 */ static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) { if(IRQn < 0) { SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } else { NVIC->IPR[_IP_IDX(IRQn)] = (NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } } /** * @函数名:NVIC_GetPriority * @描述:获取中断优先级 * @参数: IRQn_Type IRQn中断号 * @返回值:priority中断优先级 */ static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) { if(IRQn < 0) { return((uint32_t)((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } else { return((uint32_t)((NVIC->IPR[_IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } } /* ################################## SysTick函数 ############################################ */ /* SysTick 常量 */ #if (!defined (__Vendor_SysTickConfig)) || (__Vendor_SysTickConfig == 0) /* 配置第0位启动或停止滴答定时器 */ #define SYSTICK_ENABLE 0 /* 使能或除能滴答中断 */ #define SYSTICK_TICKINT 1 /* 滴答时钟源配置 */ #define SYSTICK_CLKSOURCE 2 /* 滴答最大记数 */ #define SYSTICK_MAXCOUNT ((1<<24) -1) /** * @函数名: SysTick_Config * @描述: 初始化并启动滴答定时器,包括中断配置 * @参数: uint32_t ticks滴答中断周期 * @返回值: 0、1 */ static __INLINE uint32_t SysTick_Config(uint32_t ticks) { if (ticks > SYSTICK_MAXCOUNT) return (1); /* 重装载除能 */ SysTick->LOAD = (ticks & SYSTICK_MAXCOUNT) - 1; /* 设置重装载寄存器 */ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* 设置滴答中断优先级 */ SysTick->VAL = (0x00); /* 设置滴答计数器初始值 */ SysTick->CTRL = (1 << SYSTICK_CLKSOURCE) | (1<<SYSTICK_ENABLE) | (1<<SYSTICK_TICKINT); /* 使能滴答定时器 */ return (0); /* 初始化成功 */ } #endif /* ################################## Reset 函数 ############################################ */ /** * @函数名: NVIC_SystemReset * @描述: 初始化一个系统复位,请求复位MCU * @参数: 无 * @返回值: 无 */ static __INLINE void NVIC_SystemReset(void) { SCB->AIRCR = (NVIC_AIRCR_VECTKEY | (1<<NVIC_SYSRESETREQ)); /* 保持优先级分组不变 */ __DSB(); /* 保证存储器访问已完成 */ while(1); /* 等待直到复位完成 */ } #ifdef __cplusplus } #endif #endif /* __CM0_CORE_H__ */ /** * @} */ /** * @} */ /************* (C) COPYRIGHT 2010 Wuhan R&D Center, Embest *****文件结束*******/
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |