请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【NUCLEO-U083RC评测】④RNG随机数发生器

[复制链接]
小萝卜啦啦啦 发布时间:2024-5-14 00:30
U0具备硬件RNG随机数发生器,相比软件算法得到的随机数,这个硬件RNG是真随机数。在加密时用它生成IV或者随机数,可以使得加密更加的安全。+ O5 K# @+ \% c" M

( i+ ]5 {; b' e( Z6 d一、CUBE配置及函数讲解7 E2 E9 V' \9 p+ J
工程我们还是用之前生成的基础模板! y& Y; }+ Y% \5 N+ A6 j3 Z
首先在cube中开启RNG
- ?0 r/ q& A- F# X' a
1.png
2 _* X, V" c1 R9 B
( E! q% Z. j7 W8 E
然后配置一下时钟,RNG的始终要求必须为48Mhz,我选择使用MSI(我一开始尝试了HSI48。但是初始化通不过,没跑通,那就只有换一个)
6 ?8 W. c( x' v: B
3.png ) G; p& _4 J) [9 H, t, M$ \
& M7 D! r2 }( `- I8 G; [
然后把MSI的频率改成48000(也就是48M
2.png
6 z" U0 H9 M5 F& m+ A
然后生成代码
- i' t" s9 B* K5 i. w
4.png
' Z$ a6 R8 g& ~' _' G9 I& @

; J) V6 t( v5 ~: [2 y3 }
接下来开始写代码,库函数我没有在cube中修改,使用的是默认的HAL
首先看一下自动生成的代码
CUBE帮我生成了RNG的初始化函数
5.png ) ^* F; Z! M* S1 K7 Q  ?

4 A6 y: \4 m' Y
6.png 9 S$ ~6 P; {" w7 Y8 F4 b8 v
7 z/ `- H- O& f8 t
HAL_RNG_Init我就不进去看了,里面主要是做一些参数配置和RNG时钟enable。如果有想仔细研究的可以自行查看。当然想要研究的跟底层,我推荐更换LL库,回头配合寄存器手册,可以学习到最底层的寄存器9 w- c) P* t) C9 R1 C
/ A1 H" y; N6 m
- m& e3 q+ F) F5 y, C% j4 ]2 b
现在简单讲一下HAL库我们会调用的函数
/ {+ `/ O- A. k- ]/ g  E
10.png " \! h  ?2 y4 Q5 @0 C- p
* W" y$ |( X: b4 F" R
阻塞式获取到随机数的函数:HAL_RNG_GenerateRandomNumber

9 [+ V, i5 h' w! T$ |
通过中断得到随机数:HAL_RNG_GenerateRandomNumber_IT
4 t( O$ O6 u# j2 o5 V
获取上一次得到过的随机数:HAL_RNG_ReadLastRandomNumber

& D& x+ ^! P. O) V' R$ I  p" x+ A4 t3 l' K( e5 }9 x
从参数可以看到,我们每次获取的随机数类型是uint32_t
' G. I2 K2 n& t1 X6 @+ |! }

9 L* Y' H4 h3 ~# Q+ I  y$ P$ U
二、阻塞式获取到随机数及获取上一次得到过的随机数
, e3 c  j+ e" y2 x# ?& S
首先设置一个uint32_t类型的全局变量,用于保存得到的随机数

, b. \) u* K- T' O6 L0 ^, @0 u
  1. uint32_t randomData;
      Q9 M4 G  @9 Q& F8 c
复制代码
11.png
) P. c- z4 p$ F8 v9 ~7 ~

4 V" i/ m; C" O4 f/ l( b- W% ]# {  {5 p, c  c
初始化后就可以直接调用获取随机数函数,我做了一个测试函数,会连续调用2次获取随机数函数,并且生成后再次调用获取上一次得到过的随机数函数,看看他会不会得到两个不同的随机数。
* M6 \  v  H1 l3 ?
  1. void GenerateRandomNumber_test()8 A, B, e7 y% @
  2. {6 t0 q% _+ G/ H( W
  3.   uint32_t lastRandomData;
    ; x4 z6 t+ H% B4 G, I' b2 t
  4.   printf("GenerateRandomNumber test\r\n");
    # t9 ~; e& R2 |% l* d

  5. ; p- }- n. V8 P# {% h
  6.   HAL_RNG_GenerateRandomNumber(&hrng, &randomData);/ _5 w3 K6 l+ ~6 I; [2 w
  7.   printf("GenerateRandomNumber = %04X\r\n", randomData);  _" r) [+ v/ n" O; Y# A

  8. 5 f% G3 b2 A1 w* w
  9.   lastRandomData = HAL_RNG_ReadLastRandomNumber(&hrng);+ p7 x# R# l2 U) m1 g$ }2 o
  10.   printf("lastRandomData = %04X\r\n", lastRandomData);- K5 k# Q  Q8 e0 y4 L

  11. % x  z5 B' H: ]7 k% W
  12.   HAL_RNG_GenerateRandomNumber(&hrng, &randomData);" m7 O# V0 N. L8 d6 Z
  13.   printf("GenerateRandomNumber = %04X\r\n", randomData);
    & r  e% d5 C8 ~4 Z8 J2 G2 y# Y
  14. }
    : \+ E5 @# @3 a% X  Q8 w
复制代码
% c/ X4 {2 {# ?
& C3 m* [3 I6 x' ?" p2 j, B
7.png
' n! e2 ]% ^' t$ G

' Q( U% ^5 ?; z2 P2 \
然后在main中调用

8 f/ u! f0 C* H* N- y7 G9 h, L9 X
8.png
" ^" ?- @; ?! i4 `) Z! H3 k
: V& N# ~$ ~4 v$ G
编译下载,日志如下

7 z+ v% E- E. N+ _& \' R2 V
9.png
: Z7 s. ~$ B4 C& L& j8 k2 [
  G( U' q) ~- N! Y
两个随机数已经生成,不重复。并且获取上一次得到的随机数也成功
3 h; \& L( ?% [* N, Q" V: u$ s

, v5 }+ F6 V" u) }6 @4 N
三、通过中断得到随机数

! m, h9 y2 M& L3 w# @
如果不想阻塞式获取随机数,那我们可以选择使用异步的通过中断获取随机数
+ v8 x4 q% d: r4 h: d
首先需要修改一下CUBE,设置RNG的NVIC

- B& Z2 g2 l  D: ^' X$ v
12.png
8 E. G8 I3 j! r. h) p. D3 n  |) q

5 u; S# Y4 U. t8 k
然后点击右上角的生成代码按钮(图片略)

" M, z. i% E1 u* g0 X/ ]  G8 P
刚才我们说了通过中断得到随机数为HAL_RNG_GenerateRandomNumber_IT。和之前的BSP的按键一样,中断相关的函数CUBE都帮我配置好了,用户层只要关注回调函数的实现即可。现在我们来看看成功生成随机数的回调函数、生成随机数失败的回调函数

3 {/ g# s  O* _$ Q4 G  u' `
9 Y) v/ H; ~+ [1 {! P( u
这两个函数在init时就注册好了
/ d& J; O6 n2 S: z" V3 N
13.png
3 W  C% _3 p: f+ i

8 V* D# l/ b! C
这两个函数是HAL库中定义好的两个虚函数,回头我们就要来实现这两个函数。现在看看定义的虚函数

1 {) r8 Q% `9 Z% L
14.png & ~1 f6 ?, `+ S: O# L0 Q- Z0 _

& a: s, [" n( N
接下来看看这两个函数是如何被调用的,首先来到stm32u0xx_it.c,看看RNG和CRYP的中断函数(他俩公用一个中断源)
3 V6 M& ~# O4 B/ D" B% u( N
15.png
+ H* a+ r8 x7 R' c+ @

; u- a- d; y0 z8 u
在HAL_RNG_IRQHandler中判断各种寄存器和清除对应寄存器的值等,然后还会调用ReadyDataCallback或者ErrorCallback。

- O# {8 \5 n! d1 o
16.png + n; o& h' m3 D3 ]/ {* e
# J% d/ D5 ~+ D8 f4 t! V
$ t1 N; h" s8 Z. R
简单的了解完后,我们开始写代码

+ G% z/ q9 ?& a" Z' v6 U: D7 l6 p1 M& _1 s0 w2 H- w
先把按键测试给打开,这样当按键按下后,我们调用一次HAL_RNG_GenerateRandomNumber_IT

5 @# ?3 S- y4 `
17.png : B0 T3 \6 _+ B0 T/ z. n9 T0 Q
$ W1 F' Y: q1 u1 v* {( R! S
while1中的按键测试函数中注释掉LED的翻转,添加HAL_RNG_GenerateRandomNumber_IT和打印

, l9 q. A4 D7 M. ~- M0 x5 c
  1. #if BUTTON_TEST. U. }! ?; @  ?/ H0 y# L5 F! f9 c
  2.     /* BUTTON BSP测试 */+ T# Q' \" g1 Z4 h6 C
  3.     if (UserButtonState == BUTTON_PRESSED)% x: R8 M  R: o  l9 w' B
  4.     {
    / ~' l0 d2 d' _  W9 F  ^
  5.       UserButtonState = BUTTON_RELEASED;* m; J7 M2 x) _5 _9 q
  6.       // BSP_LED_Toggle(LED_GREEN);* {! c6 @/ y: c* a: {
  7.       printf("start GenerateRandomNumber_IT\r\n");
    ) E7 k, O. E9 {- Z# G
  8.       HAL_RNG_GenerateRandomNumber_IT(&hrng);
    4 Z3 l' _% k# P2 ^% R+ e
  9.     }
    - ?5 L% x, b: @+ q2 U5 i
  10. #endif
复制代码
18.png
% U% a* l7 U8 `+ y
接下来实现一下之前说的两个虚函数

2 [' E; Z5 r8 \3 p; N* Q) m' f
  1. void HAL_RNG_ReadyDataCallback(RNG_HandleTypeDef *hrng, uint32_t random32bit), l7 |" C& w. v$ U
  2. {" @9 p+ y7 [' |; e9 S/ s+ w
  3.   randomData = random32bit;
    - c9 b- L9 b9 ?) ]: I6 z1 b* ^+ F
  4.   printf("Generate RNG IT = %04X\r\n", randomData);
    " _; {" ?0 g' I0 r6 n
  5. }. e. `$ \+ w7 Y- i- j; N

  6. . m& H  u" e# x6 Q$ I3 k0 J
  7. void HAL_RNG_ErrorCallback(RNG_HandleTypeDef *hrng)
    3 j9 [2 b+ g, k" X8 S$ L1 n: ]
  8. {
    2 X) \; v" P- C' w
  9.   printf("Generate RNG IT ERROR\r\n");
    ' a) ?5 `+ g, s) K) k+ V
  10.   Error_Handler();
    ! r5 q7 @$ y& F/ q) \
  11. }6 S0 S1 [. s3 n0 D" y# z
复制代码
19.png

- H4 h3 t( a5 ]# o/ H7 g! Z
2 w9 P6 c. q2 v; e
编译下载,日志如下

  S5 A! @3 L2 G$ M% m2 l. Z
20.png
$ {1 `. {  w6 _
8 M7 P+ {( ]) x$ w: M4 z; \5 [

) x' I: H2 }7 _* i8 g, S8 _* x& P9 w8 s( k# c9 I
今日关于RNG的测试都顺利完成,ST的HAL库还是做得不错的,让用户就关注业务相关的函数,不需要去具体了解每个芯片的各个寄存器,对于开发很友好
& g0 M5 D5 D( I6 B& l+ B
$ h; m4 f* M% P' ?; n9 v2 v
今日工程: STM32U0_RNG_test.rar (5.16 MB, 下载次数: 0) & j; w1 ~/ k' C% ?% i5 X1 S: R5 C
1 收藏 评论1 发布时间:2024-5-14 00:30

举报

1个回答
STM1024 回答时间:2024-5-19 22:27:49

大佬分析测试的很不错👍,看来我得写点别的了😄

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版