01. RNG概述
, w- b0 s+ A0 T- m4 c" b1 L5 Q( ~2 tRNG 处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个 32 位的随机数。7 ^( g! } Z* t& X/ p3 Z
- y! N. D9 |2 m H+ FRNG 已通过 FIPS PUB 140-2(2001 年 10 月 10 日)测试,成功率达 99%。
/ @/ f& s/ G8 Q9 Q7 ~: V: ?* t5 K- A2 _
随机数发生器支持库函数stm32f4xx_rng.c 和对应的头文件 stm32f4xx_rng.h。
n- V7 @/ ]" B% E3 O" o
( p4 Q3 g7 `) T02. 相关类型& Z6 S& \5 k: `3 p
- /** @defgroup RNG_flags_definition
; |8 e s/ g H3 b) g g - * @{
6 Q# q- B, b% o+ ?9 y5 S, f - */ n) R7 H; w! @; B0 M. z2 c4 `! h+ _
- #define RNG_FLAG_DRDY ((uint8_t)0x0001) /*!< Data ready */ X4 O; L! M3 J
- #define RNG_FLAG_CECS ((uint8_t)0x0002) /*!< Clock error current status */
- U4 ]+ R. V0 j - #define RNG_FLAG_SECS ((uint8_t)0x0004) /*!< Seed error current status */
; n' w# S1 G# H5 X. ^3 A! o - 4 s/ J3 S/ |. e8 J9 B- t. t
- #define IS_RNG_GET_FLAG(RNG_FLAG) (((RNG_FLAG) == RNG_FLAG_DRDY) || \
3 G. \0 @& P0 X, P/ \8 X5 S: a" U - ((RNG_FLAG) == RNG_FLAG_CECS) || \
% W6 ]! @. }5 f1 {1 q2 p3 T; | - ((RNG_FLAG) == RNG_FLAG_SECS))
6 I) ^# @0 {9 O/ H$ M - #define IS_RNG_CLEAR_FLAG(RNG_FLAG) (((RNG_FLAG) == RNG_FLAG_CECS) || \
( g# k j% _# g% Z- G1 X: { - ((RNG_FLAG) == RNG_FLAG_SECS))
. Q/ d- A. G/ O3 L { - /**6 j4 B+ L/ U" n' }# @5 X+ ^
- * @}5 S2 E+ R/ ~# X' P3 p( _" C# B
- */ ) r# g# Z" f" H# ] v( t
- 8 R# z/ ^+ J' x3 @
- /** @defgroup RNG_interrupts_definition
2 C4 n8 ~* Z$ `% o* ]3 L2 s - * @{0 |2 w0 x' _& Z+ D: s
- */ m: z# ?6 R* c8 y1 ^, `7 h
- #define RNG_IT_CEI ((uint8_t)0x20) /*!< Clock error interrupt */+ t1 n& A9 p8 Z; y$ G S) r, x
- #define RNG_IT_SEI ((uint8_t)0x40) /*!< Seed error interrupt */
) k% Z6 ~( G' E6 ^) ]/ G# S - 3 X ?+ [/ {* R3 T5 e) c+ P
- #define IS_RNG_IT(IT) ((((IT) & (uint8_t)0x9F) == 0x00) && ((IT) != 0x00))+ r. E6 j6 G. }3 q1 F
- #define IS_RNG_GET_IT(RNG_IT) (((RNG_IT) == RNG_IT_CEI) || ((RNG_IT) == RNG_IT_SEI))
复制代码
3 k1 d7 @) D/ m* C1 u03. 相关函数
1 R6 j4 ^8 k, S0 C; f- /* Function used to set the RNG configuration to the default reset state *****/
# q2 p- ~* Z5 t! @* _4 g1 R2 U - void RNG_DeInit(void);
D0 f, g" a+ y1 ~) Z, X1 A - . ]. v: s' R1 _/ k1 D3 a
- /* Configuration function *****************************************************/# {3 Z" Q* ~* g, A- [
- void RNG_Cmd(FunctionalState NewState);" ]! x; m, ~* [$ P! L
8 \3 S* p9 s6 x6 ^0 l, A- /* Get 32 bit Random number function ******************************************/
- J1 @8 J9 A# a/ q% N% ^# C/ ? - uint32_t RNG_GetRandomNumber(void);5 k0 a7 m& F5 x9 k7 f' q; C
- ; C1 @4 d+ Y5 Q, X4 @5 I
- /* Interrupts and flags management functions **********************************/
# S5 b3 ~% w0 o$ f; i8 E. S - void RNG_ITConfig(FunctionalState NewState);" ~( A1 I4 G2 V, l
- FlagStatus RNG_GetFlagStatus(uint8_t RNG_FLAG);! \+ F3 u, X- y. T/ i8 O
- void RNG_ClearFlag(uint8_t RNG_FLAG);
+ l, G, j, U7 _) S6 O' q0 {. f U - ITStatus RNG_GetITStatus(uint8_t RNG_IT);
% x/ P3 \) I j& D& i- q/ | - void RNG_ClearITPendingBit(uint8_t RNG_IT);
复制代码 7 b6 b6 r; t0 `4 l- \( j6 b
04. 结构体封装
+ _( W, D' ]7 z. S4 R% n- /** & \& p8 j6 B- o5 B& r. V( z
- * @brief RNG, ]2 o1 A8 v5 O5 G# k" _3 t
- */- v9 B/ S# v" v [3 X
- 6 Z6 V" Z) _. [) W$ D- C I2 [
- typedef struct
& \. X' M3 T, Y. w4 ^, K - {
4 z+ Y/ F3 f% k1 M/ Q$ [ - __IO uint32_t CR; /*!< RNG control register, Address offset: 0x00 */
8 F2 I. _' H+ E9 b0 r! U9 c - __IO uint32_t SR; /*!< RNG status register, Address offset: 0x04 */7 Y1 X" j' H* F/ @! |
- __IO uint32_t DR; /*!< RNG data register, Address offset: 0x08 */# @6 L' a: V& ]1 k
- } RNG_TypeDef;
复制代码 ' c/ b, J- A k2 v" b1 F/ d
4 o6 ^+ r) k/ o2 X+ l( @5 U4 i% R% W+ X; G3 M- `. n0 Z" r. g
|