搜索
bottom↓
回复: 0

《DNESP32S3使用指南-IDF版_V1.6》第三十一章 RNG实验

[复制链接]

出0入234汤圆

发表于 3 天前 | 显示全部楼层 |阅读模式
2.jpg
1)实验平台:正点原子ESP32S3开发板
2)购买链接:https://detail.tmall.com/item.htm?id=768499342659
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-347618-1-1.html
4)正点原子官方B站:https://space.bilibili.com/394620890
5)正点原子手把手教你学ESP32S3快速入门视频教程:https://www.bilibili.com/video/BV1sH4y1W7Tc
6)正点原子FPGA交流群:132780729
1.png
3.png

第三十一章 RNG实验

       本章,我们将介绍ESP32-S3的硬件随机数发生器。我们使用BOOT按键来获取硬件随机数,并且将获取到的随机数值显示在LCD上面。同时,使用LED指示程序运行状态。
本章分为如下几个小节:
       31.1 随机数发生器简介
       31.2 硬件设计
       31.3 程序设计
       31.4 下载验证

       31.1 随机数发生器简介
       ESP32-S3内置一个真随机数发生器(RNG),其生成的32位随机数可作为加密等操作的基础。ESP32-S3 的随机数发生器可通过物理过程而非算法生成真随机数,所有生成的随机数在特定范围内出现的概率完全一致。

       31.1.1 RNG功能描述
       下面先来了解噪声源,通过学习噪声源会有一个很好的整体掌握,同时对之后的编程也会有一个清晰的思路。EDP32- S3的随机数发生器噪声源如图31.1.1.1所示:

第三十一章 RNG实验369.png
图31.1.1.1 ESP32-S3随机数发生器噪声源

       系统可以从随机数发生器的寄存器RNG_DATA_REG中读取随机数,每个读到的32位随机数都是真随机数,噪声源为系统中的热噪声和异步时钟。具体来说,这些热噪声可以来自SARADC或高速ADC或两者兼有。当芯片的SARADC或高速ADC工作时,就会产生比特流,并通过异或(XOR)逻辑运算作为随机数种子进入随机数生成器。当为数字内核使能RC_FAST_CLK时钟时,随机数发生器也会对RC_FAST_CLK(20MHz)进行采样,作为随机数种子。RC_FAST_CLK是一种异步时钟源,由于存在电路亚稳态,因此可以提高随机数发生器的墒值。然而,为了保证随机数发生器可以获得最大熵值,仍建议在使用随机数发生器时至少使能一路ADC作为随机数种子。

       31.1.2 RNG随机数寄存器
       RND随机数寄存器描述如下所示:

1.png
表31.1.2.1 RNG寄存器列表

第三十一章 RNG实验816.png
图31.1.2.1 RNG_CR寄存器

       需要注意的是,这里的地址都是相对于随机数发生器基地址的地址偏移量。

       31.2 硬件设计

       31.2.1 例程功能
       本实验使用ESP32-S3自带的硬件随机数生成器(RNG),获取随机数,并显示在LCD屏幕上。按BOOT按键可以获取一次随机数。同时程序自动获取0~9范围内的随机数,显示在屏幕上。LED闪烁用于提示程序正在运行。

       31.2.2 硬件资源

       1. LED
              LED - IO1

       2.独立按键
              BOOT - IO0

       3. XL9555
              IIC_SDA-IO41
              IIC_SCL-IO42

       4. SPILCD
              CS-IO21
              SCK-IO12
              SDA-IO11
              DC-IO40(在P5端口,使用跳线帽将IO_SET和LCD_DC相连)
              PWR- IO1_3(XL9555)
              RST- IO1_2(XL9555)

       5. RNG(硬件随机数生成器)

       31.2.3 原理图
       RNG属于ESP32-S3内部资源,通过软件设置好就可以了。本实验通过配合按键获取随机数和通过LCD显示。

       31.3 程序设计

       31.3.1 程序流程图
       程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:

4.png
图31.3.1.1随机数实验程序流程图

       31.3.2 RNG函数解析
       ESP-IDF提供了一套API来配置RNG。要使用此功能,需要导入必要的头文件:
  1. #include "esp_random.h"
复制代码
       接下来,作者将介绍一些常用的ESP32-S3中的RNG函数,这些函数的描述及其作用如下:

       1,得到随机数
       该函数用于获取一个32位的硬件随机数,其函数原型如下:
  1. uint32_t esp_random(void);
复制代码
       该函数的形参描述,如下表所示:

2.png
表31.3.2.1 函数esp_random()形参描述

       该函数的返回值描述,如下表所示:

3.png
表31.3.2.2 函数esp_random ()返回值描述

       31.3.3 RNG驱动解析
       在IDF版21_rng例程中,作者在21_rng\components\BSP路径下新增了一个RNG文件夹,分别用于存放rng.c、rng.h这两个文件。其中,rng.h文件负责声明RNG相关的函数和变量,而rng.c文件则实现了RNG的驱动代码。下面,我们将详细解析这两个文件的实现内容。

       1,rng.h文件
  1. /* 函数声明 */
  2. uint32_t rng_get_random_num(void);          /* 得到随机数 */
  3. int rng_get_random_range(int min, int max); /* 得到某个范围内的随机数 */
复制代码

       2,rng.c文件
  1. /**
  2. * @brief       得到随机数
  3. * @param       无
  4. * @retval      获取到的随机数(32bit)
  5. */
  6. uint32_t rng_get_random_num(void)
  7. {
  8.     uint32_t randomnum;
  9.    
  10.     randomnum = esp_random();
  11.    
  12.     return randomnum;
  13. }

  14. /**
  15. * @brief       得到某个范围内的随机数
  16. * @param       min,max: 最小,最大值.
  17. * @retval      得到的随机数(rval),满足:min<=rval<=max
  18. */
  19. int rng_get_random_range(int min, int max)
  20. {
  21.     uint32_t randomnum;
  22.    
  23.     randomnum = esp_random();
  24.    
  25.     return randomnum % (max - min + 1) + min;
  26. }
复制代码
       从上述代码中,我们不难看出,对于RNG我们并没有相应的初始化函数,ESP32 IDF提供了相应的API函数,我们只需调用即可,具体的在上一小节我们已经介绍过了,在此不做出赘述。

       31.3.4 CMakeLists.txt文件
       打开本实验BSP下的CMakeLists.txt文件,其内容如下所示:
  1. set(src_dirs
  2.             IIC
  3.             KEY
  4.             LCD
  5.             LED
  6.             RNG
  7.             SPI
  8.             XL9555)

  9. set(include_dirs
  10.             IIC
  11.             KEY
  12.             LCD
  13.             LED
  14.             RNG
  15.             SPI
  16.             XL9555)

  17. set(requires
  18.             driver)

  19. idf_component_register(SRC_DIRS ${src_dirs}
  20. INCLUDE_DIRS ${include_dirs} REQUIRES ${requires})

  21. component_compile_options(-ffast-math -O3 -Wno-error=format=-Wno-format)
复制代码
       上述的红色RNG驱动需要由开发者自行添加,以确保RNG驱动能够顺利集成到构建系统中。这一步骤是必不可少的,它确保了RNG驱动的正确性和可用性,为后续的开发工作提供了坚实的基础。

       31.3.5 实验应用代码
       打开main/main.c文件,该文件定义了工程入口函数,名为app_main。该函数代码如下。
  1. i2c_obj_t i2c0_master;

  2. /**
  3. * @brief       程序入口
  4. * @param       无
  5. * @retval      无
  6. */
  7. void app_main(void)
  8. {
  9.     uint8_t key;
  10.     uint32_t random;
  11.     uint8_t t = 0;
  12.     esp_err_t ret;
  13.    
  14.     ret = nvs_flash_init();                                    /* 初始化NVS */

  15. if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||
  16.             ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
  17.     {
  18.         ESP_ERROR_CHECK(nvs_flash_erase());
  19.         ret = nvs_flash_init();
  20.     }

  21.     led_init();                                                /* 初始化LED */
  22.     i2c0_master = iic_init(I2C_NUM_0);                         /* 初始化IIC0 */
  23.     spi2_init();                                               /* 初始化SPI2 */
  24.     xl9555_init(i2c0_master);                                  /* 初始化XL9555 */
  25.     lcd_init();                                                /* 初始化LCD */
  26.     key_init();                                                /* 初始化按键 */
  27.    
  28.     lcd_show_string(30, 50, 200, 16, 16, "ESP32", RED);
  29.     lcd_show_string(30, 70, 200, 16, 16, "RNG TEST", RED);
  30.     lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
  31.    
  32.     lcd_show_string(30, 110, 200, 16, 16, "RNG Ready!   ", RED);
  33.     lcd_show_string(30, 130, 200, 16, 16, "BOOT:Get Random Num", RED);
  34.     lcd_show_string(30, 150, 200, 16, 16, "Random Num:", RED);
  35.     lcd_show_string(30, 180, 200, 16, 16, "Random Num[0-9]:", RED);

  36.     while(1)
  37.     {
  38.         key = key_scan();
  39.         
  40.         if (key == BOOT)                                       /* 获取随机数并显示至LCD */
  41.         {
  42.             random = rng_get_random_num();
  43.             lcd_show_num(30 + 8 * 11, 150, random, 10, 16, BLUE);
  44.         }
  45.         if ((t % 20) == 0)                                                /* 获取0~9间的随机数并显示至LCD */
  46.         {
  47.             LED_TOGGLE();                                /* 每200ms,翻转一次LED */
  48.             random = rng_get_random_range(0, 9);        /* 取[0,9]区间的随机数 */
  49.             lcd_show_num(30 + 8 * 16, 180, random, 1, 16, BLUE);/* 显示随机数 */
  50.         }
  51.         vTaskDelay(10);
  52.         t++;
  53.     }
  54. }
复制代码
       该部分代码也比较简单,在所有外设初始化成功后,进入死循环,等待BOOT按键按下,如果按下,则调用rng_get_random_num函数,读取随机数值,并将读到的随机数显示在LCD上面。每隔200ms获取一次区间[0,9]的随机数,并实时显示在液晶上。同时LED,周期性闪烁,400ms闪烁一次。

       31.4 下载验证
       将程序下载到开发板后,可以看到LED不停的闪烁,提示程序已经在运行了。然后我们按下BOOT,就可以在屏幕上看到获取到的随机数。同时,就算不按BOOT,程序也会自动的获取0~9区间的随机数显示在LCD上面。实验结果如图31.4.1所示:

第三十一章 RNG实验5543.png
图31.4.1 获取随机数成功

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-28 00:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表