真随机数发生器(TRNG)可生产 1位串行真随机数或 8/16/32位并行真随机数,结构框图
TRNG 使 能 后 需 要 经 过 一 段 时 间 初 始 化才 可 产 生 新 的 随 机 数 , 初 始 化 时 间 在TRNG_START 寄存器配置。根据当前 HCLK时钟频率,计算出 TRNG_START的值,使初始化时间不低于 1ms。计算公式为:
随机数生成时间
随机数生成时间由以下位共同决定: TRNG_CR 寄存器中的DSEL 位、ADJM 位、POSTEN位和ADJC 位。随机数生成时间公式为:
TRNG ≈ 5×D×P×CM(单位us)(误差范围+66.66%/-33.33%)
随机数种子
因为随机序列发生器来自模拟信号,电源和地上的干扰或环境温度的变化等都会导致随机性变差、输出序列的相邻位的自相关系数升高。通过设置一种随机的种子值,可能使随机序列的随机性能更加优化,降低自相关性。种子的类型可选择为使用上一次产生的随机数或使用TRNG_SEED 寄存器值。若使用TRNG_SEED 寄存器值,则在每次读取新的随机数时同时更新TRNG_SEED 寄存器。 种子的类型也可选择固定为 0 或1。
- #include "bsp_trng.h"
- //产生一个随机数
- unsigned int trng_module_get_data()
- {
- unsigned int ret;
- trng_init_t init;
- md_trng_struct_init(&init);
- /* Initialize trng */
- md_trng_init(&init);
- /* Start calculating random */
- md_trng_enable_trngen(TRNG);
- /* Waiting flag */
- while (!(md_trng_is_active_flag_davld(TRNG)));
- /* Get the result */
- ret = md_trng_get_data(TRNG);
- UNUSED(ret);
- return ret;
- }
- #ifndef _BSP_TRNG_H
- #define _BSP_TRNG_H
- #include "md_trng.h"
- unsigned int trng_module_get_data(void);
- #endif
复制代码主函数中新建一个线程任务用来产生随机数,具体代码如下:- #include "board.h"
- #include "rtthread.h"
- struct rt_thread Task1_thread;
- struct rt_thread Task2_thread;
- rt_uint8_t rt_task1_thread_stack[1024];
- rt_uint8_t rt_task2_thread_stack[1024];
- void task1(void *parameter);
- void task2(void *parameter);
- int main()
- {
- rt_kprintf("The Project is ES32F0654 RT-Thread Demo.........
");
- rt_thread_init(&Task1_thread,"task1",
- task1,RT_NULL,&rt_task1_thread_stack[0],
- sizeof(rt_task1_thread_stack),3,20);
- rt_thread_init(&Task2_thread,"task2",
- task2,RT_NULL,&rt_task2_thread_stack[0],
- sizeof(rt_task2_thread_stack),3,20);
- rt_thread_startup(&Task1_thread);
- rt_thread_startup(&Task2_thread);
- }
- //任务1:状态指示
- void task1(void *parameter)
- {
- while(1)
- {
- LED1_TOGGLE;
- rt_thread_delay(500);
- rt_kprintf("Thread1 is running.........
");
- }
- }
- unsigned int num;
- //任务2:产生一个随机数
- void task2(void *parameter)
- {
- while(1)
- {
- num = trng_module_get_data();
- rt_thread_delay(500);
- rt_kprintf("Thread2 is running Generate random number:%d
",num);
- }
- }
复制代码一周热门 更多>