【东软载波ESF0654 PDS开发板活动】RT-Thread +真随机数发生器
真随机数发生器(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。
新建bsp_trng.c 和 bsp_trng.h 具体代码如下:#include "bsp_trng.h"
//产生一个随机数
unsigned inttrng_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 inttrng_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;
rt_uint8_t rt_task2_thread_stack;
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,
sizeof(rt_task1_thread_stack),3,20);
rt_thread_init(&Task2_thread,"task2",
task2,RT_NULL,&rt_task2_thread_stack,
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);
}
}
最后可以看到LED间隔闪烁,串口助手打印出随机数
页:
[1]