Files

275 lines
7.2 KiB
C
Raw Permalink Normal View History

/*
******************************************************************************
* @file apt32f102_ck801.c
* @author APT AE Team
* @version V1.08
* @date 2021/06/21
******************************************************************************
*THIS SOFTWARE WHICH IS FOR ILLUSTRATIVE PURPOSES ONLY WHICH PROVIDES
*CUSTOMER WITH CODING INFORMATION REGARDING THEIR PRODUCTS.
*APT CHIP SHALL NOT BE HELD RESPONSIBILITY ADN LIABILITY FOR ANY DIRECT,
*INDIRECT DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT OF
*SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION
*CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.AND APT CHIP RESERVES
*THE RIGHT TO MAKE CHANGES IN THE SOFTWARE WITHOUT NOTIFICATION
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "apt32f102.h"
#include "apt32f102_ck801.h"
void CK801_Init(void)
{
/* Initial the Interrupt source priority level registers */
CK801->IPR[0] = 0xC0804000;
CK801->IPR[1] = 0xC0004000;
CK801->IPR[2] = 0xC0804000;
CK801->IPR[3] = 0xC0804000;
CK801->IPR[4] = 0xC0804000;
CK801->IPR[5] = 0xC0804000;
CK801->IPR[6] = 0xC0804000;
CK801->IPR[7] = 0xC0804000;
CK801->IPTR = 0x00000000;//disable threshold
}
void force_interrupt(IRQn_Type IRQn)
{
CK801->ISPR = (1 << (uint32_t)(IRQn));
}
void CK_CPU_EnAllNormalIrq(void)
{
asm ("psrset ee,ie");
}
void CK_CPU_DisAllNormalIrq(void)
{
asm ("psrclr ie");
}
/* ########################## NVIC functions #################################### */
/**
* @brief Enable Interrupt in NVIC Interrupt Controller
*
* @param IRQn The positive number of the external interrupt to enable
*
* Enable a device specific interupt in the NVIC interrupt controller.
* The interrupt number cannot be a negative value.
*/
__INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
{
CK801->ISER = 1 << (uint32_t)(IRQn);
}
/**
* @brief Disable the interrupt line for external interrupt specified
*
* @param IRQn The positive number of the external interrupt to disable
*
* Disable a device specific interupt in the NVIC interrupt controller.
* The interrupt number cannot be a negative value.
*/
__INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)
{
CK801->ICER = 1 << (uint32_t)(IRQn);
}
/**
* @brief Read the interrupt pending bit for a device specific interrupt source
*
* @param IRQn The number of the device specifc interrupt
* @return always 0
*/
__INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
{
return (uint32_t)(CK801->ISPR);
}
/**
* @brief Set the pending bit for an external interrupt
*
* @param IRQn The number of the interrupt for set pending
*
* No effect.
*/
__INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)
{
CK801->ISPR = (1 << (uint32_t)(IRQn));
}
/**
* @brief Clear the pending bit for an external interrupt
*
* @param IRQn The number of the interrupt for clear pending
*
* No effect.
*/
__INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
{
CK801->ICPR = (1 << (uint32_t)(IRQn));
}
/**
* @brief Read the active bit for an external interrupt
*
* @return always 0
*
*/
__INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn)
{
return (CK801->IABR & (1 << IRQn));
}
__INLINE uint32_t NVIC_GetActiveVector(void)
{
unsigned int vectactive = 0;
//isr low 8bits gives the active vector
vectactive = (CK801 ->ISR & 0xff);
return vectactive;
}
/**
* @brief Set the priority for an interrupt
*
* @param IRQn The number of the interrupt for set priority
* @param priority The priority to set ,the number rang: [0-3]
*
* Set the priority for the specified interrupt. The interrupt
* number must be positive to specify an external (device specific)
* interrupt.
*/
__INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
{
uint32_t tmp = ((IRQn & 0x03) << 3);
uint8_t index = IRQn>>2;
if(IRQn >= 0) {
CK801->IPR[index] &= ~(0xff << tmp);
CK801->IPR[index] |= priority << (tmp+6);
}
}
/**
* @brief Read the priority for an interrupt
*
* @param IRQn The number of the interrupt for get priority
* @return The priority for the interrupt
*
* Read the priority for the specified interrupt. The interrupt
* number must be positive to specify an external (device specific)
* interrupt.
*/
__INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)
{
uint32_t tmp = ((IRQn & 0x03) << 3);
uint8_t index = IRQn>>2;
return (uint32_t)(CK801->IPR[index])>>(tmp + 6);
}
/*###################################################################*/
/*############# Threshold Enable & Set Threshold ###############*/
/*###################################################################*/
/************************************************************
* @brief enable NVIC threshold
* @name: NVIC_EnableThreshold
* @no param
*
*/
__INLINE void NVIC_EnableThreshold(void)
{
CK801 ->IPTR |= 0x80000000;
}
/************************************************************
* @brief disnable NVIC threshold
* @name: NVIC_DisableThreshold
* @no param
*
*/
__INLINE void NVIC_DisableThreshold(void)
{
CK801 ->IPTR &= ~0x80000000;
}
/************************************************************
* @brief set NVIC Priothreshold
* @name: NVIC_SetPrioThreshold
* @param prioshreshold the priority of threshold[0,3]
*
*/
__INLINE void NVIC_SetPrioThreshold(uint8_t prioshreshold)
{
CK801 -> IPTR &= 0xffffff00;
CK801 -> IPTR |= (prioshreshold << 6);
}
/************************************************************
* @brief set NVIC Vectthreshold
* @name: NVIC_SetVectThreshold
* @param vectthreshold the vector of threshold[0,31]
*
*/
__INLINE void NVIC_SetVectThreshold(uint8_t vectthreshold)
{
CK801 -> IPTR &= 0xffff00ff;
CK801 -> IPTR |= ((vectthreshold + 32) << 8);
}
/*###################################################################*/
/*################ Low Power Wakeup Enable ###################*/
/*###################################################################*/
/*************************************************************
* @name: NVIC_PowerWakeUp_Enable
* @brief: enable the bit for Power wake up
* @param: irqn the irqnumber,eg:CK802_CORETIM_IRQn
*/
__INLINE void NVIC_PowerWakeUp_Enable(IRQn_Type irqn)
{
CK801->IWER |= (1 << irqn);
}
/*************************************************************
* @name: NVIC_PowerWakeUp_Disable
* @func: disable the bit for Power wake up
* @param: irqn the irqnumber,eg:CK802_CORETIM_IRQn
*/
__INLINE void NVIC_PowerWakeUp_Disable(IRQn_Type irqn)
{
CK801->IWDR |= (1 << irqn);
}
/*************************************************************
* @name: NVIC_PowerWakeUp_EnableAll
* @func: enable all bits for Power wake up
* @param: none
*/
__INLINE void NVIC_PowerWakeUp_EnableAll(void)
{
CK801->IWER = 0xffffffff;
}
/*************************************************************
* @name: NVIC_PowerWakeUp_EnableAll
* @func: disable all bits for Power wake up
* @param: none
*/
__INLINE void NVIC_PowerWakeUp_DisableAll(void)
{
CK801->IWDR = 0xffffffff;
}
/******************* (C) COPYRIGHT 2019 APT Chip *****END OF FILE****/