【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);
}
}
三、效果展示
串口打印效果如下:
|