3508|0

282

帖子

2

TA的资源

一粒金砂(高级)

楼主
 

【GD32L233C-START评测】8. TRNG真随机数生成 [复制链接]

之前的帖子可以参考:

【GD32L233C-START评测】1.开箱

【GD32L233C-START评测】2.手把手创建新工程

【GD32L233C-START评测】3.移植FreeRTOS到GD32L233

【GD32L233C-START评测】4. 移植RT-Thread到GD32L233

【GD32L233C-START评测】5. IIC驱动OLED

【GD32L233C-START评测】6. 获取RTC时间并通过OLED显示

【GD32L233C-START评测】7. PWM驱动LED

 

真随机数的获取在单片机开发中有时候很重要,特别是在密码学,数据校验,安全通信中都十分重要,本文将讲解如何使用单片机内置的随机数生成模块TRNG来生成真随机数。

 

一、查看用户手册

参考用户手册第9章,对真随机数生成原理有详细的描述。

对于真随机数的时候主要是关注操作流程,如下图:

需要使能IRC48M的时钟,同时使能TRNGEN来开启TRNG。

 

二、代码编辑

代码中使用printf串口打印生成的随机数,需要确保串口可用并连接串口线。

 

1. TRNG状态监测

调用trng_flag_get()函数获取TRNG的状态

ErrStatus trng_ready_check(void)
{
    uint32_t timeout = 0;
    FlagStatus trng_flag = RESET;
    ErrStatus reval = SUCCESS;

    /* check wherther the random data is valid */
    do 
	{
        timeout++;
        trng_flag = trng_flag_get(TRNG_FLAG_DRDY);
    } while((RESET == trng_flag) && (0xFFFF > timeout));

    if(RESET == trng_flag) {
        /* ready check timeout */
        printf("Error: TRNG can't ready \r\n");
        trng_flag = trng_flag_get(TRNG_FLAG_CECS);
        printf("Clock error current status: %d \r\n", trng_flag);
        trng_flag = trng_flag_get(TRNG_FLAG_SECS);
        printf("Seed error current status: %d \r\n", trng_flag);
        reval = ERROR;
    }

    /* return check status */
    return reval;
}

 

2. TRNG初始化配置

配置TRNG时钟,使能TRNG,检查TRNG状态是否稳定

ErrStatus trng_configuration(void)
{
    ErrStatus reval = SUCCESS;

    /* enable TRNG module clock */
    rcu_periph_clock_enable(RCU_TRNG);

    /* reset TRNG registers */
    trng_deinit();
    trng_enable();

    /* check TRNG work status */
    reval = trng_ready_check();

    return reval;
}

 

3. 获取随机数

调用trng_get_true_random_data()获取真随机数并返回随机数值

uint8_t trng_random_range_get(uint8_t min, uint8_t max)
{
    if(SUCCESS == trng_ready_check()) 
	{
        return (trng_get_true_random_data() % (max - min + 1) + min);
    } 
	else 
	{
        return 0;
    }
}

 

4. main函数

1)先初始化48M时钟,等待稳定

2)使能串口printf打印功能

3)初始化TRNG

4)获取1到100之间的随机数,每一秒钟获取一次并打印

int main(void)
{
	uint8_t retry = 0;
	
	/* configure systick */
    systick_config();
	
	/* turn on the oscillator */
    rcu_osci_on(RCU_IRC48M);
    if(ERROR == rcu_osci_stab_wait(RCU_IRC48M))
	{
        while(1);
    }
	gd_eval_com_init(EVAL_COM);
	
    /* configure TRNG module */
    while(ERROR == trng_configuration()) 
	{
        printf("TRNG init fail \r\n");
    }

    while(1) 
	{
		printf("Generate random num1 is %d \r\n", trng_random_range_get(1, 100));
		delay_1ms(1000);
    }
}

 

三、效果展示

串口打印效果如下:

此帖出自GD32 MCU论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表