CKS32F4xx系列RNG功能设置

描述

 

MCU微课堂

CKS32F4xx列RNG功能

随机数发生器简介

    CKS32F4xx系列自带了硬件随机数发生器(RNG),RNG处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个32位的随机数。

    CKS32F4xx系列的随机数发生器框图如图1所示:

函数

图1.RNG框图

    CKS32F4xx系列的随机数发生器(RNG)采用模拟电路实现。此电路产生馈入线性反馈移位寄存器(RNG_LFSR)的种子,用于生成32位随机数。

    该模拟电路由几个环形振荡器组成,振荡器的输出进行异或运算以产生种子。RNG_LFSR由专用时钟(PLL48CLK)按恒定频率提供时钟信息,因此随机数质量与HCLK频率无关。当将大量种子引入RNG_LFSR后,RNG_LFSR的内容会传入数据寄存器(RNG_DR)。

    同时,系统会监视模拟种子和专用时钟PLL48CLK,当种子上出现异常序列,或PLL48CLK时钟频率过低时,可以由RNG_SR寄存器的对应位读取到,如果设置了中断,则在检测到错误时,还可以产生中断。

RNG寄存器

 

    我们介绍下CKS32F4xx系列随机数发生器(RNG)的几个寄存器。

函数

图2.RNG控制寄存器

    图2为RNG的CR寄存器,其只有bit2和bit3有效,用于使能随机数发生器和中断。我们一般不用中断,所以只需要设置bit2为1,使能随机数发生器即可。

函数

图3.RNG状态寄存器

    图3为RNG状态寄存器:RNG_SR。该寄存器我们仅关心最低位(DRDY位),该位用于表示RNG_DR寄存器包含的随机数数据是否有效,如果该位为1,则说明RNG_DR的数据是有效的,可以读取出来了。读RNG_DR后,该位自动清零。

函数

图4.RNG数据寄存器

    图4为RNG数据寄存器:RNG_DR。在RNG_SR的DRDY位置位后,我们就可以读取该寄存器获得32位随机数值。此寄存器在最多40个PLL48CK时钟周期后,又可以提供新的随机数值。

    至此,随机数发生器的寄存器,我们就介绍完了。接下来,我们看看要使用库函数操作随机数发生器,应该如何设置。

 

配置随机数发生器

1.使能随机数发生器时钟

    要使用随机数发生器,必须先使能其时钟。随机数发生器时钟来自PLL48CK,通过AHB2ENR寄存器使能。所以我们调用使能AHB2总线外设时钟的函数使能RNG时钟即可:

 

RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE);

 

2.使能随机数发生器

    这个就是通过RNG_CR寄存器的最低位设置为1,使能随机数发生器。当然,如果需要用到中断,你快还可以使能RNG中断。本章我们不用中断。库函数中使能随机数发生器的方法为:

 

RNG_Cmd(ENABLE);

 

3.判断DRDY位,读取随机数值

    经过前面两个步骤,我们就可以读取随机数值了,不过每次读取之前,必须先判断 RNG_SR寄存器的DRDY位,如果该位为1,则可以读取RNG_DR得到随机数值,如果不为1,则需要等待。

    获取随机数发生器状态的函数为:

 

FlagStatus RNG_GetFlagStatus(uint8_t RNG_FLAG);

 

    判断数据是否有效的入口参数为 RNG_FLAG_DRDY,所以等待就绪的方法为:

 

while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==RESET);

 

    判断数据有效后,然后我们读取随机数发生器产生的随机数即可,调用函数为:

 

uint32_t RNG_GetRandomNumber(void);

 

        审核编辑:彭菁

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分