HC32L17x的LL驱动库之rng

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值