1477|0

377

帖子

10

TA的资源

一粒金砂(高级)

楼主
 

【GD32L233C-START评测】+猜猜下次哪个灯会亮 [复制链接]

GD32L233C 含有真随机数发生器模块(TRNG)能够通过连续模拟噪声生成一个32 位的随机数值。

操作步骤在手册里有详细说明,如下图


主函数 

uint32_t random_data = 0, random_lastdata = 0;
    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){
        }
    }
    /* initilize the LEDs, USART and key */
    gd_eval_led_init(LED1);
    gd_eval_led_init(LED2);
		gd_eval_led_init(LED3);
    gd_eval_led_init(LED4);
    gd_eval_com_init(EVAL_COM);
    gd_eval_key_init(KEY_WAKEUP, KEY_MODE_GPIO);
	
    /* print out the clock frequency of system, AHB, APB1 and APB2 */
    printf("\r\nCK_SYS is %d", rcu_clock_freq_get(CK_SYS));
    printf("\r\nCK_AHB is %d", rcu_clock_freq_get(CK_AHB));
    printf("\r\nCK_APB1 is %d", rcu_clock_freq_get(CK_APB1));
    printf("\r\nCK_APB2 is %d", rcu_clock_freq_get(CK_APB2));
		
    /* show example introduce */
    printf("============ Gigadevice TRNG poll mode demo ============ \r\n");
		
		/* configure TRNG module */
    while((ERROR == trng_configuration()) && retry < 3) {
        printf("TRNG init fail \r\n");
        printf("TRNG init retry \r\n");
        retry++;
    }
		printf("TRNG init ok \r\n");
    /* get the first random data */
    random_lastdata = trng_get_true_random_data();
		
    while(1) {        

        if(SET == gd_eval_key_state_get(KEY_WAKEUP)) {
            delay_1ms(50);
            if(SET == gd_eval_key_state_get(KEY_WAKEUP)) {
                /* check wherther the random data is valid and get it */
							if(SUCCESS == trng_ready_check()) {
									random_data = trng_get_true_random_data();
									if(random_data != random_lastdata) {
											random_lastdata = random_data;
											printf("Get random data: 0x%08x \r\n", random_data);
									} else {
											/* the random data is invalid */
											printf("Error: Get the random data is same \r\n");
									}
									gd_eval_led_off(LED1);
									gd_eval_led_off(LED2);
									gd_eval_led_off(LED3);
									gd_eval_led_off(LED4);
									switch(random_data%4)
									{
										case 0:gd_eval_led_on(LED1);break;
										case 1:gd_eval_led_on(LED2);break;
										case 2:gd_eval_led_on(LED3);break;
										case 3:gd_eval_led_on(LED4);break;
										default:break;
									}
							}
            }
            while(RESET == gd_eval_key_state_get(KEY_WAKEUP)) {
            }
        }
    }

随机数模块检查

    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;

 

随机数模块配置

    ErrStatus reval = SUCCESS;

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

    /* TRNG registers reset */
    trng_disable();
    trng_enable();
    /* check TRNG work status */
    reval = trng_ready_check();

    return reval;

 

 

按下开发板上的按键K2(Wakeup),LED1-LED4将会随机电量一盏灯

 

此帖出自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
快速回复 返回顶部 返回列表