⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 core_cm0.h

📁 LPC1114_例程和教程
💻 H
📖 第 1 页 / 共 2 页
字号:
#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 + -