STM32 产生随机数方式

news/2024/3/29 19:26:19/文章来源:https://blog.csdn.net/hwytree/article/details/129553548

STM32 产生随机数方式

C语言的stdlib.h库里的srand(unsigned seed)和rand(void)函数,可以配合产生伪随机数。其中srand(seed)产生算法种子,再由rand()通过算法产生随机数,产生的随机数在宏定义RAND_MAX范围内。如果seed不变,则产生的随机数不变。

这里介绍STM32 HAL库环境的随机数产生代码,采用STM32CUBEIDE开发环境,以STM32F103C6T6为例,通过USB虚拟串口将归一化随机数打印出,归一化随机数为0~1之间的浮点值。顺便这里将STM32指令微秒延时函数PY_Delay_us_t(us);的基本参数usDelayBase的测定值打印出。STM32微秒延时函数参考: STM32 HAL us delay(微秒延时)的指令延时实现方式及优化 。

STM32工程配置

首先建立基本工程并设置时钟,这里只用到USB接口用于打印输出:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
设置USB虚拟串口:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
保存并生成初始工程文件:
在这里插入图片描述

STM32随机数生成代码

随机数种子seed的选择,在计算机应用领域,可以采用系统时间作为种子,而在嵌入式方面,因为STM32 HAL有不断运行的毫秒计数值uwTick,因此可选作随机数种子。uwTick是递增形态,为了加强随机性,还可以将uwTick进行一次CRC32计算得到32位验证码,然后用此验证码作为随机数种子。STM32的硬件和软件CRC32计算,参考 C语言CRC-32 STM32格式校验函数,硬件CRC32可以加快随机数产生速度,而软件CRC32则具有通用型,一些型号MCU并不具有硬件CRC32计算组件。

采用空间节约的编译方式,参考 STM32 region `FLASH‘ overflowed by xxx bytes 问题解决
USB虚拟串口的使用,参考 STM32 USB VCOM和HID的区别,配置及Echo功能实现(HAL)
采用的浮点转字符函数py_f2s4printf(),参考 STM32 UART串口printf函数应用及浮点打印代码空间节省 (HAL)

主要功能代码实现部分如下:

      if(USB_CONN_STATUS()){py_f2s4printf(fchar, usDelayBase, 8);sprintf(console, "usDelayBase for STM32F103 in 72MHz is %s\r\n", fchar);CDC_Transmit_FS((uint8_t*)console, strlen(console)) ;seed = uwTick;srand((unsigned)PY_CRC_32_T32_STM32(&seed, 1));rn = ((float)rand())/RAND_MAX;py_f2s4printf(fchar, rn, 8);sprintf(console, "Random number is %s\r\n\r\n", fchar);CDC_Transmit_FS((uint8_t*)console, strlen(console)) ;}

包含主要功能代码的完整的main.c文件:

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2023 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usb_device.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "string.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
__IO float usDelayBase;
void PY_usDelayTest(void)
{__IO uint32_t firstms, secondms;__IO uint32_t counter = 0;firstms = HAL_GetTick()+1;secondms = firstms+1;while(uwTick!=firstms) ;while(uwTick!=secondms) counter++;usDelayBase = ((float)counter)/1000;
}void PY_Delay_us_t(uint32_t Delay)
{__IO uint32_t delayReg;__IO uint32_t usNum = (uint32_t)(Delay*usDelayBase);delayReg = 0;while(delayReg!=usNum) delayReg++;
}void PY_usDelayOptimize(void)
{__IO uint32_t firstms, secondms;__IO float coe = 1.0;firstms = HAL_GetTick();PY_Delay_us_t(1000000) ;secondms = HAL_GetTick();coe = ((float)1000)/(secondms-firstms);usDelayBase = coe*usDelayBase;
}void PY_Delay_us(uint32_t Delay)
{__IO uint32_t delayReg;__IO uint32_t msNum = Delay/1000;__IO uint32_t usNum = (uint32_t)((Delay%1000)*usDelayBase);if(msNum>0) HAL_Delay(msNum);delayReg = 0;while(delayReg!=usNum) delayReg++;
}
/* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
uint32_t PY_CRC_32_T32_STM32(uint32_t *di, uint32_t len)
{uint32_t crc_poly = 0x04C11DB7;  //X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+1 total 32 effective bits without X^32.//uint32_t data_t = 0; //CRC registeruint32_t data_t = 0xffffffff; //CRC registerfor(uint32_t i = 0; i < len; i++){data_t ^= di[i]; //32-bit datafor (uint8_t j = 0; j < 32; j++){if (data_t & 0x80000000)data_t = (data_t << 1) ^ crc_poly;elsedata_t <<= 1;}}return (data_t);
}uint32_t seed;
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
/* USER CODE BEGIN PFP */
/*
*Convert float to string type
*Written by Pegasus Yu in 2022
*stra: string address as mychar from char mychar[];
*float: float input like 12.345
*flen: fraction length as 3 for 12.345
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
void py_f2s4printf(char * stra, float x, uint8_t flen)
{uint32_t base;int64_t dn;char mc[32];base = pow(10,flen);dn = x*base;sprintf(stra, "%d.", (int)(dn/base));dn = abs(dn);if(dn%base==0){for(uint8_t j=1;j<=flen;j++){stra = strcat(stra, "0");}return;}else{if(flen==1){sprintf(mc, "%d", (int)(dn%base));stra = strcat(stra, mc);return;}for(uint8_t j=1;j<flen;j++){if((dn%base)<pow(10,j)){for(uint8_t k=1;k<=(flen-j);k++){stra = strcat(stra, "0");}sprintf(mc, "%d", (int)(dn%base));stra = strcat(stra, mc);return;}}sprintf(mc, "%d", (int)(dn%base));stra = strcat(stra, mc);return;}
}/* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
char fchar[16];
char console[256];float rn;
/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USB_DEVICE_Init();/* USER CODE BEGIN 2 */PY_usDelayTest();PY_usDelayOptimize();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){if(USB_CONN_STATUS()){py_f2s4printf(fchar, usDelayBase, 8);sprintf(console, "usDelayBase for STM32F103 in 72MHz is %s\r\n", fchar);CDC_Transmit_FS((uint8_t*)console, strlen(console)) ;seed = uwTick;srand((unsigned)PY_CRC_32_T32_STM32(&seed, 1));rn = ((float)rand())/RAND_MAX;py_f2s4printf(fchar, rn, 8);sprintf(console, "Random number is %s\r\n\r\n", fchar);CDC_Transmit_FS((uint8_t*)console, strlen(console)) ;}PY_Delay_us_t(500000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}
}/*** @brief GPIO Initialization Function* @param None* @retval None*/
static void MX_GPIO_Init(void)
{/* GPIO Ports Clock Enable */__HAL_RCC_GPIOD_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

代码测试效果

版本下载后,通过USB连接虚拟串口,测试效果如下:

在这里插入图片描述

例程下载

STM32F103C6T6为例 随机数产生例程下载

–End–

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_102728.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

URL 转为QR code(二维码)

推荐一个良心的网站&#xff0c;能够免费地将url、text编码为二维码&#xff0c;而且还能设计logo、颜色等。 https://www.the-qrcode-generator.com/ 如下图&#xff1a; 可以自己定义logo、颜色&#xff1a; 还能查看扫描历史等统计信息&#xff1a; 上述所有功能都是免…

【虚拟仿真】Unity3D打包WEBGL后播放视频(VideoPlayer组件)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 本篇文章实现Unity3D打包WEBGL后播放视频&#xff0c;如下图所…

VGG网络与中间层特征提取

1. 背景 VGG是常见的用于大型图片识别的极深度卷积网络&#xff0c; 这里主要介绍VGG网络预测在ImageNet数据集上的训练及预测。 2. ImageNet图像数据集简介 ImageNet包含了145W张224*224像素的三通道彩色图像数据集&#xff0c;图像划分为1000个种类。其中训练集130W张&…

Observability:添加免费和开放的 Elastic APM 作为 Elastic 可观察性部署的一部分 - 8.x

作者&#xff1a;David Hope 在最近的一篇博文中&#xff0c;我们向你展示了如何开始使用 Elastic 可观察性的免费开放层。 下面&#xff0c;我们将介绍你需要做些什么来扩展你的部署&#xff0c;这样你就可以开始免费从应用程序性能监控&#xff08;APM&#xff09;或跟踪集群…

可算是熬出头了,测试4年,费时8个月,入职阿里,涨薪14K

前言 你的努力&#xff0c;终将成就无可替代的自己。 本科毕业后就一直从事测试的工作&#xff0c;和多数人一样&#xff0c;最开始从事点点点的工作&#xff0c;看着自己的同学一步一步往上走&#xff0c;自己还是在原地踏步&#xff0c;说实话这不是自己想要的状态。 一年半…

为什么你永远不应该在CSS中使用px来设置字体大小

代码部署后可能存在的BUG没法实时知道&#xff0c;事后为了解决这些BUG&#xff0c;花了大量的时间进行log 调试&#xff0c;这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。 在Josh Collinsworth的博客文章“永远不要用px作为字体大小”中&#xff0c;作者讨论了为什么不…

Ceph入门到精通-Ceph 编排器简介

第 1 章 Ceph 编排器简介 作为存储管理员&#xff0c;您可以将 Ceph 编排器与 Cephadm 实用程序搭配使用&#xff0c;能够发现设备并在 Red Hat Ceph Storage 集群中创建服务。 1.1. 使用 Ceph Orchestrator Red Hat Ceph Storage Orchestrators 是经理模块&#xff0c;主要…

C语言函数大全-- o 开头的函数

C语言函数大全 本篇介绍C语言函数大全-- o 开头的函数 1. obstack_init&#xff0c;obstack_free&#xff0c;obstack_alloc&#xff0c;obstack_blank&#xff0c;obstack_grow 1.1 函数说明 函数声明函数功能void obstack_init(struct obstack *obstack_ptr);它是 POSIX …

TypeScript自学笔记

目录 1.什么是Ts? 1.1 设计公司&#xff1a;微软 1.2 TS概述 1.3 TS是静态类型 JS是动态类型 1.4 TS是强类型语言 JS是弱类型语言 2.TypeScript编译器 2.1 安装 2.2 TS自动编译和编译选项设置 3.TS的数据类型 3.1 基础数据类型number、string、boolean 3.2 Arrays&a…

美颜sdk开发实践:如何构建美颜sdk功能?

美颜功能是现今很多应用中必不可少的一项功能。而要实现美颜功能&#xff0c;除了自己编写美颜算法外&#xff0c;还可以使用美颜sdk来实现。本文将介绍如何从零开始构建美颜功能&#xff0c;利用美颜sdk实现美颜效果。 一、简介 美颜sdk可以向用户提供多种美颜效果&#xff…

大学生用什么蓝牙耳机好?2023好用的蓝牙耳机推荐

近几年&#xff0c;蓝牙耳机市场不断扩大&#xff0c;逐渐取代有线耳机成为最受人欢迎的数码产品之一。作为蓝牙耳机主要受众群的大学生&#xff0c;用什么蓝牙耳机比较好呢&#xff1f;下面&#xff0c;我来给大家推荐几款便宜好用的蓝牙耳机&#xff0c;一起来看看吧。 一、…

stm32读写内部Flash

stm32内部flash地址架构映射 因为我的stm32f407的内部flash是1M的所以块2不存在&#xff0c;但他的地址仍然存在&#xff0c;只是没有作用&#xff0c;这是stm32的整体框架。 主存储器 一般我们说 STM32 内部 FLASH 的时候&#xff0c;都是指这个主存储器区域&#xff0c;它…

生成树协议三姐妹:STP、RSTP 和 MSTP,附思科和华为双厂商命令示例

在计算机网络中&#xff0c;为了保证网络拓扑结构的稳定性和可靠性&#xff0c;需要采用一些协议进行网络的管理和控制。其中&#xff0c;STP、RSTP 和 MSTP 是三种常用的网络管理协议。本文将分别介绍这三种协议&#xff0c;并且使用华为、思科两家厂商作为案例给出相应的命令…

数据库之约束、索引和事务

一、约束 约束,顾名思义就是数据库对数据库中的数据所给出的一组检验规则.负责判断元素是否符合数据库要求.其目的就是为了提高效率以及准确性. 1.not null - > 数据元素非空 表示如果插入数据,则当前数据不能为空. //创建一张学生表,其班级id和年级id不为空 create …

【嵌入式笔/面试】嵌入式软件基础题和真题总结——网络相关

在学习的时候找到几个十分好的工程和个人博客&#xff0c;先码一下&#xff0c;内容都摘自其中&#xff0c;有些重难点做了补充&#xff01; 才鲸 / 嵌入式软件笔试题汇总 嵌入式与Linux那些事 阿秀的学习笔记 小林coding 百问网linux 嵌入式软件面试合集 2022年春招实习十四面…

unity3d---物体加点击事件

目录 1.给需要点击点物体加collider 2.层级面板加EventSystem 3. 相机加Physics Raycaster 4.物体单独响应点击事件 5.控制脚本实现各物体的点击事件 6.点击ui时屏蔽 物体点击事件 1.给需要点击点物体加collider 2.层级面板加EventSystem 3. 相机加Physics Raycaster 2d…

6. 树的入门

6. 树的入门 之前我们实现的符号表中&#xff0c;不难看出&#xff0c;符号表的增删查操作&#xff0c;随着元素个数N的增多&#xff0c;其耗时也是线性增多的&#xff0c;时间复杂度都是O(n),为了提高运算效率&#xff0c;接下来我们学习树这种数据结构。 6.1 树的基本定义 …

PerformanceTest, monitoring command

PerformanceTest, monitoring command 1、数据库 #查看最大连接数 show variables like max_connections; #例如:查看mysql连接数 show status like Threads%; 说明: threads_cached //查看线程缓存内的线程的数量 threads_connected //查看当前打开的连接的数量(打开的…

Pytorch的几种常用优化器

文章目录 AdagradSGDRMSpropAdamAdamW Adagrad Adagrad是一种可以自动调节每个参数更新的梯度的优化器&#xff0c;也可以做到在梯度平缓时走的步长大&#xff0c;在梯度小时走的步长小&#xff0c;从而防止loss出现剧烈震荡的情况。这里默认你已知道了他的原理了&#xff0c;…

离散数学-考纲版-01-命题逻辑

文章目录 1. 命题逻辑的等值演算与推理演算参考1.1 命题1.2 常用联结词1.3 命题公式命题公式的分类-重言式-矛盾式-可满足式等价关系式-逻辑等价 logically equivalent 1.4 命题的等值演算与推理基本等价式逻辑蕴涵重言式 logically implication重言蕴涵推到归结法 1.5 命题公式…