rt-thread/bsp/synwit/swm341/libraries/SWM341_StdPeriph_Driver/SWM341_div.h

130 lines
5.5 KiB
C
Raw Normal View History

#ifndef __SWM341_DIV_H__
#define __SWM341_DIV_H__
void DIV_Init(DIV_TypeDef * DIVx);
/******************************************************************************************************************************************
* : DIV_UDiv()
* : 使
* : uint32_t dividend
* uint32_t divisor
* :
* :
******************************************************************************************************************************************/
static __INLINE void DIV_UDiv(uint32_t dividend, uint32_t divisor)
{
DIV->DIVIDEND = dividend;
DIV->DIVISOR = divisor;
DIV->CR = (1 << DIV_CR_DIVSIGN_Pos) | (1 << DIV_CR_DIVGO_Pos);
}
/******************************************************************************************************************************************
* : DIV_SDiv()
* : 使
* : int32_t dividend
* int32_t divisor
* :
* :
******************************************************************************************************************************************/
static __INLINE void DIV_SDiv(int32_t dividend, int32_t divisor)
{
DIV->DIVIDEND = dividend;
DIV->DIVISOR = divisor;
DIV->CR = (0 << DIV_CR_DIVSIGN_Pos) | (1 << DIV_CR_DIVGO_Pos);
}
/******************************************************************************************************************************************
* : DIV_Div_IsBusy()
* :
* :
* : uint32_t 1 0
* :
******************************************************************************************************************************************/
static __INLINE uint32_t DIV_Div_IsBusy(void)
{
return (DIV->SR & DIV_SR_DIVBUSY_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* : DIV_UDiv_Result()
* :
* :
* : uint32_t *quotient
* uint32_t *remainder
* :
******************************************************************************************************************************************/
static __INLINE void DIV_UDiv_Result(uint32_t *quotient, uint32_t *remainder)
{
*quotient = DIV->QUO;
*remainder = DIV->REMAIN;
}
/******************************************************************************************************************************************
* : DIV_SDiv_Result()
* :
* :
* : int32_t *quotient
* int32_t *remainder
* :
******************************************************************************************************************************************/
static __INLINE void DIV_SDiv_Result(int32_t *quotient, int32_t *remainder)
{
*quotient = DIV->QUO & 0x7FFFFFFF;
if(DIV->QUO & (1u << 31)) *quotient = 0 - *quotient;
*remainder = DIV->REMAIN & 0x7FFFFFFF;
if(DIV->REMAIN & (1u << 31)) *remainder = 0 - *remainder;
}
/******************************************************************************************************************************************
* : DIV_Root()
* : 使
* : uint32_t radicand
* uint32_t calcu_frac 0 16 1 16+16
* :
* :
******************************************************************************************************************************************/
static __INLINE void DIV_Root(uint32_t radicand, uint32_t calcu_fractional)
{
DIV->RADICAND = radicand;
DIV->CR = (1 << DIV_CR_ROOTGO_Pos) | (calcu_fractional << DIV_CR_ROOTMOD_Pos);
}
/******************************************************************************************************************************************
* : DIV_Root_IsBusy()
* :
* :
* : uint32_t 1 0
* :
******************************************************************************************************************************************/
static __INLINE uint32_t DIV_Root_IsBusy(void)
{
return (DIV->SR & DIV_SR_ROOTBUSY_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* : DIV_Root_Result()
* :
* :
* : uint32_t
* :
******************************************************************************************************************************************/
static __INLINE uint32_t DIV_Root_Result(void)
{
if(DIV->CR & DIV_CR_ROOTMOD_Msk)
{
return DIV->ROOT;
}
else
{
return DIV->ROOT >> 16;
}
}
#endif //__SWM341_DIV_H__