(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365)
(代码仓库地址:https://gitee.com/luobing4365/yie002-explorer
具体参考博客:YIE002开发探索-Gitee代码仓库说明)

YIE002开发探索之随机数生成器

  • 1 随机数生成器构建
  • 2 YIE002-STM32的随机数生成器编程
    • 2.1 随机数生成器的Cube MX图形配置
    • 2.2 编写应用代码
      • 1)ADC采样
      • 2)添加USB通信代码
    • 2.3 测试

在规划YIE002开发板的时候,其中有一个目标是,实现类似ChaosKey一样的,可以在UEFI下访问的随机数生成器。

ChaosKey是一个硬件真随机数生成器,通过USB进行通信。其主页为:https://altusmetrum.org/ChaosKey/。

STM32F2和STM32F4系列的芯片,提供了芯片内部的随机数生成器。而YIE002开发板上使用的STM32F103C8T6,并没有提供。因此,必须使用其他办法来实现目标。

1 随机数生成器构建

上一篇中,已经打通了USB HID的双向通信通道,数据可以很方便地发送给上位机了。所需要的,是产生随机数的源。

在YIE002开发板上,有些引脚是悬空的,其中的PB1可用作ADC通道9进行采样,如图1所示。

图1 YIE002的单片机引脚图

由于PB1是悬空状态,所采集的ADC数据是不确定的。可以利用此机制,来构造随机数生成器。不过,由于ADC的量程有限,因此添加一个16位的全局变量random_add。程序运行期间,每次进入main()函数的while循环,此全局变量都增1。

将采集到的ADC值(12位)与radom_add相加,得到一个16位的随机数,通过USB HID的通道返回给上位机,就完成了随机数生成器的构建过程了。

2 YIE002-STM32的随机数生成器编程

随机数生成器分为两部分:ADC采样和USB HID通道构建。

我们可以直接使用上一篇HID双向通信的代码,在其上进行修改。不过,由于采用STM32 Cube MX编程,在自动生成代码的时候,所有非“USER CODE BEGIN”和“USER CODE END”内编写的代码,都会消失。

比如上一篇直接修改了usbd_customhid.c内的函数,这块的代码在自动生成代码的时候,不会保存下来。

2.1 随机数生成器的Cube MX图形配置

主要的工作是在上一篇代码的基础上,打开对ADC的支持。如图2所示。
图2 打开ADC

由于YIE002开发板上的PB1是悬空的,因此选择它使用ADC采样,作为随机数发生器的数据源。ADC可以使用轮询、中断、DMA等方式进行采样,简单起见,我们准备使用轮询的方式来运作。

其余的配置保持之前的状态就可以了,然后选择GENERATE CODE生成代码。

2.2 编写应用代码

由于自动生成的代码把编写的USB相关的内容覆盖了(主要是报表描述符、SetReport和GetReport类命令的处理),因此,需要编写的代码包括ADC采样和USB代码的重编写。

1)ADC采样

为了调整随机数的输出,增加了随机数调整用的变量,在主函数main()中定义变量如下:

uint16_t ADC_Value = 0;
uint16_t random_add = 0;  //用来生成随机数校正用的数值

同时定义一个全局变量,保存生成的随机数:

//通过ADC生成随机数
uint16_t random_value=0x1376;

在main()的while循环中,添加如下代码,对PB1进行ADC采样,获得随机值:

while (1)
{/* USER CODE END WHILE *//* USER CODE BEGIN 3 *///robin 20210815 adcrandom_add++;HAL_ADC_Start(&hadc1);  //启动ADC转换HAL_ADC_PollForConversion(&hadc1,100); //等待转换完成,超时时间为100msif(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC))//判断转换完成标志位是否设置{ADC_Value = HAL_ADC_GetValue(&hadc1);  //读取ADC转换数据,转换为12位random_value = ADC_Value + random_add;}
//…后略

通过以上代码,就得到了需要生成的随机数。

2)添加USB通信代码

按照上一篇博客的内容,添加报表描述符,修改传输数据包等。

针对三种传输方式,需要修改的内容如下。

读写文件的方式,需要修改main()函数中发送数据的部分,内容如下:

if(USBdataFlag == 1)
{USBdataFlag=0;USBRxBuff[0] = (uint8_t)random_value;USBRxBuff[1] = (uint8_t)(random_value>>8);USBRxBuff[2] = 0x11;    USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS,USBRxBuff,USBD_CUSTOMHID_OUTREPORT_BUF_SIZE);
}

Input Report&Output Report的方式,以及Feature Report方式,需要修改类命令SET_REPORT和GET_REPORT的处理。

在usbd_customhid.c中,修改函数USBD_CUSTOM_HID_Setup(),内容如下:

extern uint8_t USBdataFlag;
extern uint8_t USBRxBuff[16];
extern uint8_t Report_InOut_Flag; //Robin: Input报告和Output报告标志
extern uint8_t Report_Feature_Flag;//Robin: Feature报告标志
static uint8_t  USBD_CUSTOM_HID_Setup(USBD_HandleTypeDef *pdev,USBD_SetupReqTypedef *req){//……前略
case CUSTOM_HID_REQ_SET_REPORT://robin add for in/out/feature report//类命令的wValue高字节,1-Input Report; 2-Output Report; 3-Feature Reportif(((req->wValue)&0xff00) == 0x0200)Report_InOut_Flag=1;else if(((req->wValue)&0xff00) == 0x0300)Report_Feature_Flag=1;hhid->IsReportAvailable = 1U;USBD_CtlPrepareRx(pdev, hhid->Report_buf, req->wLength);break;case CUSTOM_HID_REQ_GET_REPORT: //robin 20210815if(((req->wValue)&0xff00) == 0x0100){Report_InOut_Flag=0;for(uint8_t i=0;i<USBD_CUSTOMHID_OUTREPORT_BUF_SIZE;i++)USBRxBuff[i] = hhid->Report_buf[i];USBRxBuff[0] = (uint8_t)random_value;USBRxBuff[1] = (uint8_t)(random_value>>8);USBRxBuff[2] = 0x22;}else if(((req->wValue)&0xff00) == 0x0300){Report_Feature_Flag=0;for(uint8_t i=0;i<USBD_CUSTOMHID_OUTREPORT_BUF_SIZE;i++)USBRxBuff[i] = hhid->Report_buf[i];USBRxBuff[0] = (uint8_t)random_value;USBRxBuff[1] = (uint8_t)(random_value>>8);USBRxBuff[2] = 0x33;}USBD_CtlSendData (pdev, (uint8_t *)&USBRxBuff, USBD_CUSTOMHID_OUTREPORT_BUF_SIZE); // to pc
break;
//……后略
}

不管哪种方式,都是通过前两个字节,将随机数传送给上位机。因此,在上位机发送任何16字节数据之后,都能在返回的16字节中,取出前两个字节的随机数。

2.3 测试

将代码编译后,下载到开发板上。配合UEFI开发探索74篇附带的测试工具UsbHID,可以观察到随机数获取的过程。如图3所示。

图3 测试随机数生成器

至此,就完成了随机数生成器的开发。

目前设计的生成器中,返回的是16位的随机数。一般的随机数,是使用32位的,比如STM32F4就提供了32位的随机数发生部件。稍微修改下本篇的程序,比如调整校正数为32位的,就能提供32位的随机数了。


YIE002开发探索10-随机数生成器相关推荐

  1. UEFI开发探索94 – 迷宫小游戏

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) UEFI下的迷宫小游戏 1 Maze程序结构分析 1)定义全局变量 2)设置迷宫 3) 游戏控制 ...

  2. 开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器

    原文:[原创]开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器                本博客所有文章分类的总目录:http://www.cnblogs.com/asxiny ...

  3. 密码学安全强随机数生成器_强密码学简介

    密码学安全强随机数生成器 让我惊讶的一件事是,大多数开发人员都不熟悉强大的加密技术. 在我的职业生涯中,我已经看到过各种各样的错误,这些错误会导致数据泄漏,可猜测的密码,不幸的泄露甚至更糟. 令人高兴 ...

  4. python的标准随机数生成器模块是_Python的标准随机数生成器模块是

    [简答题]How do critical thinking and our emotions complement each other? [简答题]下列Python语句的输出结果是 print(&q ...

  5. UEFI开发探索72- YIE002USB开发板(01 开篇)

    (请保留-> 作者: 罗冰   https://blog.csdn.net/luobing4365) 最近把USB的各个方面都研究了一遍,也在UEFI下实现了USB设备的访问.趁着这热乎劲,我计 ...

  6. luogu P3306 [SDOI2013] 随机数生成器(BSGS,数列求通项,毒瘤特判)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 发个水题的 题解证明我还在() luogu P3306 [SDOI2013] 随机数生成器 Webli ...

  7. 随机数生成器c语言,句子随机生成器-怎么用C语言生成随机数

    为随机数生成器初始化一个种子值在易语言中使用什么命令名 置随机数种子 () '调用格式: 〈无返回值〉 置随机数种子 ([整数型 欲置入的种子数值]) - 系统核心支持库->算术运算 英文名称: ...

  8. Java中Math3 各种随机数生成器的使用(Random Generator)

    本文作者:合肥工业大学 管理学院 钱洋 email:1563178220@qq.com 内容可能有不到之处,欢迎交流. 未经本人允许禁止转载. 文章目录 背景 python中numpy生成随机数 产生 ...

  9. C/C++ 随机数生成器的 随机化

    C/C++ 随机数生成器的 随机化 为何要随机化? 因为rand函数实际上生成的并不是正在的随机数,而是伪随机数.(具体表现在 重复调用rand会生成看似随机的数字序列,但然而程序每次执行的时产生的序 ...

最新文章

  1. 小猿圈之Linux初学者掌握的基本命令
  2. Python面向对象基础:设置对象属性
  3. 最全的http头部信息分析(转载)
  4. eclipse2019-03设置代码编辑区背景为图片
  5. 会考计算机考试vb知识点,高中会考计算机vb知识点.doc
  6. 技术剖析 | Axonius为什么能获得 2019 RSAC创新大奖 1
  7. C语言编写一个计算器(附全源代码)
  8. 空间索引 - 四叉树
  9. 获取域管理员权限的几种方式
  10. [Essay]看《Re:从零开始的异世界生活》的一些感想
  11. 【端午安康SXY】Python正则表达式进阶用法(以批量修改Markdown英文字体为例)
  12. 全国流通经济杂志全国流通经济杂志社全国流通经济编辑部2022年第25期目录
  13. Linux使用crond定时任务详解,定期同步服务器时间。
  14. texi格式文件的读取
  15. 文字logo设计的作用
  16. 《iOS Drawing Practical UIKit Solutions》读书笔记(三) —— Drawing Images
  17. GitLab CI部署:Runner部署及遇到的问题
  18. Ubuntu解决键盘错乱与图形化切换
  19. 艾司博讯:拼多多商品怎样多件一起付款?
  20. cf Sonya and Robots

热门文章

  1. windows11\window10 开机自启动热点
  2. 英雄联盟官网首页以及攻略页面制作
  3. 数据库:Win11安装数据库
  4. 万千家长的疑问 [益智玩具]大曝光
  5. android zxing简书,Android集成zxing 版本3.4.1
  6. [浙大数据结构] 04-树6 Complete Binary Search Tree (30分)
  7. 论文理解【RL - Episodic Control】 ——【MFEC】Model Free Episodic Control
  8. 2019年第35周DApp影响力排行榜 | TokenInsight
  9. QTranslate 3.1.1:整合7种在线翻译的小工具
  10. 3GP视频转换器代码