|
一、STM32的随机数发生器, R5 x$ c8 n* K7 H$ h* u. |( H, A 1.1 RGN 简介 STM32的RGN(Random Number Generator,随机数发生器),是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个由模拟量发生器产生的 32 位随机数。 7 q) H& D7 a/ m4 f RGN由实时熵源(模拟)和内部调节组件组成,它将全熵输出作为32位样本提供给应用程序。通常MCU中去读取两个连续随机数的间隔为 40 个 PLL48CLK时钟信号周期。产生随机数的模拟量发生器,由几个环形振荡器组成,振荡器的输出进行异或运算以产生馈入线性反馈移位寄存器(RNG_LFSR)种子,这些种子用于生成 32 位随机数。RGN支持中断功能,通过检测状态位(RNG_SR 寄存器),检测种子异常(RNG_FLAG_SECS)、时钟异常(RNG_SR_CECS)等现象,检测到错误时生成中断。% ]; p2 @' [) [0 o3 }" ?3 a* k 1.2 RNG配置说明 在CubeMX上开启RNG功能非常简单,只需要激活即可,在其参数栏设置无任何参数需要设置,在NVIC栏可以开启中断功能。 ) ~ k& c; A- F) ^, a# ?
RNG依赖时钟源可有在时钟树选择器设置,时钟频率大小可以通过倍频器、分频器设置,例如本文采用STM32L496VGTx芯片时,设置其PLL48CLK时钟依赖源PLLSAl1Q,输出时钟频率是48MHz,如下图所示。$ b5 \, B! U( k+ S6 i! V
STM32的RGN内部通信通常是通过AHB总线实现,例如STM32L496VGTx芯片通过AHB2总线。 1 w& _) E: }2 k6 J; G* s
: D, m" B0 j) r( }( G& j RNG在STM32芯片正常、睡眠的工模式下有效。
在STM32L496VGTx芯片中,RNG的寄存器空间大小为0X3FF(1024),用于存储RNG的数据寄存器、状态寄存器、控制寄存器以及缓存参数、组件信息等。 4 r# B$ H0 o4 l5 D1 T
二、创建RNG测试工程及HLA源码分析 2.1 工程创建3 W, f: c! c* k9 X) e0 u# N 本文为采用的是stm32L496VGTx-ali开发板来建立测试工程,并按本专栏前面的博文移植好了lpuart1串口调试及按键功能,请自行参考。0 d6 h! V5 s: X( D 现双击.ioc文件,打开CubeMX配置界面,开启RNG功能,并开启中断,时钟树上设置最终输出频率48MHz。 7 H5 l( O$ v8 {% d* o% _. m* w9 R
# L h( ~: z& W; } 保成生成输出代码* Y4 U; z, g, p& N 2.3 RNG的HLA库源码分析7 O: g" E8 U9 i! v, L' z- H cubeMX生成代码时,会在Core源码目录下的Inc及Src目录,分别生成rng.h和rng.c驱动文件。 在rng.c文件中,主要定义了MX_RNG_Init函数和HAL_RNG_MspInit函数。MX_RNG_Init主要做两件事情,一是生成RNG句柄Instance(寄存器),二是调用HLA库的HAL_RNG_Init来实现真正的初始化设定。HAL_RNG_MspInit是HLA内的弱函数,根据实际配置CubeMX会生成新的函数,完成真正的MCU底层设置任务(MspInit,MCU Specific Package init,即指和MCU相关的初始化),覆盖原来的弱函数,而在HAL_RNG_Init函数中会调用到HAL_RNG_MspInit函数。1 a( R/ L# [) D$ ~ 8 W; ^$ x2 `( n1 H
; A: e3 _" l% L; |3 y; a 在stm32l4xx_hal_rng.c源文件中定义了HAL_RNG_Init函数,它做以下事情:诊断配置参数是否合规; $ w5 C* g- \! s8 a
. J% v6 k4 w' H8 c 以及调用HAL_RNG_MspInit函数完成CRC时钟开启及中断设置与开启(如果cubeMX配置开启中断功能的话);7 h8 i+ r5 I- j0 Z. N3 N% n' G
. Y, D) G! i4 {6 S 最后开启RNG,检测种子、数据寄存器的有效性。
再回到rng.c内,HAL_RNG_MspInit函数实现了RNG外设时钟设置(如果配置依赖外设的话)与开启,以及中断设置与开启(如果cubeMX配置开启中断功能的话)。9 U. I, n( t& ~" A7 [
* e7 H; E' K5 s6 ] 在stm32l4xx_hal_rng.c源文件除了定义初始化功外,还定义了RNG的MSP初始化及删除函数,各种方式读取随机数函数,状态读取函数,中断请求及中断回调函数等。较常用的是:读取随机数函数如HAL_RNG_GetRandomNumber、HAL_RNG_GetRandomNumber_IT、HAL_RNG_ReadLastRandomNumber,状态读取函数HAL_RNG_GetState,以及回调函数HAL_RNG_ReadyDataCallback和HAL_RNG_ErrorCallback。; H' z( E6 g6 v5 L
, \ i# t3 P9 u$ ]2 E: P 2.3 RNG使用设计 由于本文开启了RNG中断功能,在rng.c源码中,重新编码HAL_RNG_ReadyDataCallback函数如下:' V" a" Z. r. K9 a4 O
在main.c源码文件中,添加各个外设及功能模块的头文件依赖。
在main.c源码文件中,添加RNG句柄声明,用于读取随机数时使用。' E- W- V# e9 \9 f- C ?
在main函数内,启动串口中断功能及初始化其他辅助参数。# X8 [' x3 e6 K
在main函数循环体内,通过按键触发调用不同的随机数获取函数,并打印输出到lpuart1上。
三、编译及测试 3.1 编译及下载& T2 H5 ?# a* T1 s 点击编译按钮确保编译正确输出,并配置运行配置后,点击运行完成下载7 h$ A0 b2 a7 C F % R: _6 W+ [2 N( r' n$ W. r; O t
/ |- F5 o; r9 Q& ]; y5 Z9 Q- t 3.2 测试* q5 O6 @$ B/ w1 b4 M" a 串口助手链接到开发板上,分别按键KEY0、KEY1、KEY2输出log如下图:" l9 I. ^; H. H2 P+ I2 q( H! A
; ^8 D$ X1 x& Y; J& S8 ] 由于KEY1是中断方式读取随机数,因此我们前面重写的回调函数也会生效,但需要注意的是HAL_RNG_GetRandomNumber_IT先于HAL_RNG_ReadyDataCallback,读取了数据寄存器,连个函数是分别读取数据寄存器,因此得到的随机数是不一致的,实际项目中按需选择来应用。 ( ?: q9 ]" ]( A; C0 X
& V4 w& b' x K, T ———————————————— 版权声明:py_free-物联智能 如有侵权请联系删除, m0 x8 }( k( s. J& ]- [& c0 `! d7 u: I: c |
【STM32H5 评测】NUCLEO-H5E5ZJ 使用 TrustZone 安全分区系统实践测试
【STM32H5 评测】基础硬件加密与随机数性能 - STM32H5E5实测硬件AES加解密、HASH运算、TRNG真随机数输出速率与稳定性
【STM32H5 评测】CPU核心性能 - STM32H5E5跑 RTOS,观察任务切换速度、中断响应快慢
【STM32H5 评测】内存读写性能 - STM32H5E5实测Flash,SRAM读写速度,用DMA搬运大块数据
【NUCLEO-C562RE】OLED 显示
保姆级教程:CMake 工程导入 STM32CubeIDE 步骤
STM32CubeCLT 1.22.0新版本发布
【下载问题解决】关于ST官网下载软件问题解决
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
微信公众号
手机版