#ifndef HC32L1XX_LL_RNG_H_
#define HC32L1XX_LL_RNG_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "hc32l1xx.h"
#include "hc32l1xx_ll_bus.h"
///
#define LL_RNG_MODE_LOAD_ENABLE RNG_MODE_LOAD
#define LL_RNG_MODE_LOAD_DISABLE 0
#define LL_RNG_MODE_FDBK_ENABLE RNG_MODE_FDBK
#define LL_RNG_MODE_FDBK_DISABLE 0
#define LL_RNG_MODE_CNT_NONE RNG_MODE_CNT_NONE
#define LL_RNG_MODE_CNT_8 RNG_MODE_CNT_8
#define LL_RNG_MODE_CNT_16 RNG_MODE_CNT_16
#define LL_RNG_MODE_CNT_32 RNG_MODE_CNT_32
#define LL_RNG_MODE_CNT_64 RNG_MODE_CNT_64
#define LL_RNG_MODE_CNT_128 RNG_MODE_CNT_128
#define LL_RNG_MODE_CNT_256 RNG_MODE_CNT_256
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RNG_Enable(RNG_TypeDef *RNGx)
{
SET_BIT(RNGx->CR, RNG_CR_EN);
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RNG_Disable(RNG_TypeDef *RNGx)
{
CLEAR_BIT(RNGx->CR, RNG_CR_EN);
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RNG_IsEnabled(RNG_TypeDef *RNGx)
{
return (uint32_t)(READ_BIT(RNGx->CR, RNG_CR_EN) == (RNG_CR_EN));
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RNG_EnableRun(RNG_TypeDef *RNGx)
{
SET_BIT(RNGx->CR, RNG_CR_RUN);
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RNG_IsActiveFlag_DRDY(RNG_TypeDef *RNGx)
{
return ((READ_BIT(RNGx->CR, RNG_CR_RUN) == (RNG_CR_RUN)) ? 1UL : 0UL);
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RNG_ReadRandData32(RNG_TypeDef *RNGx)
{
return (uint32_t)(READ_REG(RNGx->DR1));
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint64_t LL_RNG_ReadRandData64(RNG_TypeDef *RNGx)
{
uint64_t temp_rng = READ_REG(RNGx->DR2);
temp_rng = (temp_rng << 32) | READ_REG(RNGx->DR1);
return temp_rng;
}
///
//函 数:
//功 能: 装载新的初值,产生真随机数
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RNG_EnableLoad(RNG_TypeDef *RNGx)
{
SET_BIT(RNGx->MODE, RNG_MODE_LOAD);
}
///
//函 数:
//功 能: 不装载新的初值,产生伪随机数
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RNG_DisableLoad(RNG_TypeDef *RNGx)
{
CLEAR_BIT(RNGx->MODE, RNG_MODE_LOAD);
}
///
//函 数:
//功 能: 使能异或操作
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RNG_EnableFDBK(RNG_TypeDef *RNGx)
{
SET_BIT(RNGx->MODE, RNG_MODE_FDBK);
}
///
//函 数:
//功 能: 不使能异或操作
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RNG_DisableFDBK(RNG_TypeDef *RNGx)
{
CLEAR_BIT(RNGx->MODE, RNG_MODE_FDBK);
}
///
//函 数:
//功 能: 获取移位反馈次数
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RNG_SetShift(RNG_TypeDef *RNGx,uint32_t shift)
{
MODIFY_REG(RNGx->MODE, RNG_MODE_CNT, shift);
}
///
//函 数:
//功 能: 获取移位反馈次数
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RNG_GetShift(RNG_TypeDef *RNGx)
{
return (uint32_t)(READ_BIT(RNGx->MODE, RNG_MODE_CNT));
}
//===函数定义
uint8_t LL_RNG_DeInit(RNG_TypeDef *RNGx);
uint8_t LL_RNG_Init(RNG_TypeDef *RNGx);
///
#ifdef __cplusplus
}
#endif
#endif /* HC32L1XX_LL_RNG_H_ */
#include "hc32l1xx_ll_rng.h"
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t LL_RNG_DeInit(RNG_TypeDef *RNGx)
{
LL_PER0_GRP1_ForceReset(LL_PER0_GRP1_PERIPH_RNG);
LL_PER0_GRP1_ReleaseReset(LL_PER0_GRP1_PERIPH_RNG);
return 0;
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t LL_RNG_Init(RNG_TypeDef *RNGx)
{
LL_RNG_Enable(RNGx);
LL_RNG_EnableLoad(RNGx);
LL_RNG_EnableFDBK(RNGx);
LL_RNG_SetShift(RNGx, LL_RNG_MODE_CNT_256);
//---启动随机数产生
LL_RNG_EnableRun(RNGx);
//---等待数据产生结束
#ifndef USE_SIMULATOR
while (LL_RNG_IsActiveFlag_DRDY(RNGx)!=0)
{
};
#endif
LL_RNG_DisableLoad(RNGx);
LL_RNG_DisableFDBK(RNGx);
LL_RNG_SetShift(RNGx, LL_RNG_MODE_CNT_64);
//---启动随机数产生
LL_RNG_EnableRun(RNGx);
//---等待数据产生结束
#ifndef USE_SIMULATOR
while (LL_RNG_IsActiveFlag_DRDY(RNGx) != 0)
{
};
#endif
LL_RNG_Disable(RNGx);
return 0;
}