打印
[国产单片机]

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

[复制链接]
1587|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
真随机数发生器(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

使用特权

评论回复

相关帖子

沙发
一路向北lm|  楼主 | 2019-12-21 21:09 | 只看该作者
新建bsp_trng.c bsp_trng.h 具体代码如下:
#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.........\r\n");       
  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.........\r\n");       
        }  
}
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 \r\n",num);       
        }  
}


使用特权

评论回复
板凳
一路向北lm|  楼主 | 2019-12-21 21:09 | 只看该作者
最后可以看到LED间隔闪烁,串口助手打印出随机数

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

277

主题

3805

帖子

76

粉丝