【东软载波ESF0654 PDS开发板活动】RT-Thread +真随机数发生器

2020-03-11 19:34发布

真随机数发生器(TRNG)可生产 1位串行真随机数或 8/16/32位并行真随机数,结构框图


111.jpg


TRNG 使 能 后 需 要 经 过 一 段 时 间 初 始 化才 可 产 生 新 的 随 机 数 , 初 始 化 时 间 在TRNG_START 寄存器配置。根据当前 HCLK时钟频率,计算出 TRNG_START的值,使初始化时间不低于 1ms。计算公式为:                              
随机数生成时间
随机数生成时间由以下位共同决定: TRNG_CR 寄存器中的DSEL 位、ADJM 位、POSTEN位和ADJC 位。随机数生成时间公式为:
TRNG 5×D×P×CM(单位us)(误差范围+66.66%/-33.33%


222.jpg


随机数种子
因为随机序列发生器来自模拟信号,电源和地上的干扰或环境温度的变化等都会导致随机性变差、输出序列的相邻位的自相关系数升高。通过设置一种随机的种子值,可能使随机序列的随机性能更加优化,降低自相关性。种子的类型可选择为使用上一次产生的随机数或使用TRNG_SEED 寄存器值。若使用TRNG_SEED 寄存器值,则在每次读取新的随机数时同时更新TRNG_SEED 寄存器。 种子的类型也可选择固定为 0 1
 

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
一路向北lm
1楼-- · 2020-03-11 20:42
新建bsp_trng.c bsp_trng.h 具体代码如下:
  1. #include "bsp_trng.h"

  2. //产生一个随机数
  3. unsigned int  trng_module_get_data()
  4. {
  5.         unsigned int ret;
  6.   trng_init_t init;
  7.         md_trng_struct_init(&init);
  8.         /* Initialize trng */
  9.         md_trng_init(&init);
  10.         /* Start calculating random */
  11.         md_trng_enable_trngen(TRNG);
  12.         /* Waiting flag */
  13.         while (!(md_trng_is_active_flag_davld(TRNG)));
  14.         /* Get the result */
  15.         ret = md_trng_get_data(TRNG);
  16.         UNUSED(ret);
  17.         return ret;
  18. }

  19. #ifndef _BSP_TRNG_H
  20. #define _BSP_TRNG_H
  21. #include "md_trng.h"

  22. unsigned int  trng_module_get_data(void);
  23. #endif
复制代码主函数中新建一个线程任务用来产生随机数,具体代码如下:
  1. #include "board.h"
  2. #include "rtthread.h"

  3. struct rt_thread Task1_thread;
  4. struct rt_thread Task2_thread;

  5. rt_uint8_t rt_task1_thread_stack[1024];
  6. rt_uint8_t rt_task2_thread_stack[1024];

  7. void task1(void *parameter);
  8. void task2(void *parameter);

  9. int main()
  10. {
  11.   rt_kprintf("The Project is ES32F0654 RT-Thread Demo......... ");       
  12.   rt_thread_init(&Task1_thread,"task1",
  13.                        task1,RT_NULL,&rt_task1_thread_stack[0],
  14.                        sizeof(rt_task1_thread_stack),3,20);
  15.         rt_thread_init(&Task2_thread,"task2",
  16.                        task2,RT_NULL,&rt_task2_thread_stack[0],
  17.                        sizeof(rt_task2_thread_stack),3,20);
  18.   rt_thread_startup(&Task1_thread);       
  19.   rt_thread_startup(&Task2_thread);       
  20. }
  21. //任务1:状态指示
  22. void task1(void *parameter)
  23. {
  24.         while(1)
  25.         {
  26.                 LED1_TOGGLE;
  27.                 rt_thread_delay(500);       
  28.                 rt_kprintf("Thread1 is running......... ");       
  29.         }  
  30. }
  31. unsigned int num;
  32. //任务2:产生一个随机数
  33. void task2(void *parameter)
  34. {
  35.   while(1)
  36.         {
  37.                 num = trng_module_get_data();
  38.                 rt_thread_delay(500);       
  39.                 rt_kprintf("Thread2 is running Generate random number:%d ",num);       
  40.         }  
  41. }
复制代码

一路向北lm
2楼-- · 2020-03-11 22:47
最后可以看到LED间隔闪烁,串口助手打印出随机数 958615dfe19a07804e.png