📄 core_cm0.h
字号:
#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 *****文件结束*******/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -