国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32 產(chǎn)生隨機數(shù)方式

這篇具有很好參考價值的文章主要介紹了STM32 產(chǎn)生隨機數(shù)方式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

STM32 產(chǎn)生隨機數(shù)方式

C語言的stdlib.h庫里的srand(unsigned seed)和rand(void)函數(shù),可以配合產(chǎn)生偽隨機數(shù)。其中srand(seed)產(chǎn)生算法種子,再由rand()通過算法產(chǎn)生隨機數(shù),產(chǎn)生的隨機數(shù)在宏定義RAND_MAX范圍內(nèi)。如果seed不變,則產(chǎn)生的隨機數(shù)不變。

這里介紹STM32 HAL庫環(huán)境的隨機數(shù)產(chǎn)生代碼,采用STM32CUBEIDE開發(fā)環(huán)境,以STM32F103C6T6為例,通過USB虛擬串口將歸一化隨機數(shù)打印出,歸一化隨機數(shù)為0~1之間的浮點值。順便這里將STM32指令微秒延時函數(shù)PY_Delay_us_t(us);的基本參數(shù)usDelayBase的測定值打印出。STM32微秒延時函數(shù)參考: STM32 HAL us delay(微秒延時)的指令延時實現(xiàn)方式及優(yōu)化 。

這里介紹的方法,不依賴于硬件產(chǎn)生隨機數(shù)的方式,因此也可以用于STM8和其它廠家的各種MCU產(chǎn)生隨機數(shù)。

STM32工程配置

首先建立基本工程并設(shè)置時鐘,這里只用到USB接口用于打印輸出:
STM32 產(chǎn)生隨機數(shù)方式
STM32 產(chǎn)生隨機數(shù)方式
STM32 產(chǎn)生隨機數(shù)方式
設(shè)置USB虛擬串口:
STM32 產(chǎn)生隨機數(shù)方式
STM32 產(chǎn)生隨機數(shù)方式
STM32 產(chǎn)生隨機數(shù)方式
保存并生成初始工程文件:
STM32 產(chǎn)生隨機數(shù)方式

STM32隨機數(shù)生成代碼

隨機數(shù)種子seed的選擇,在計算機應(yīng)用領(lǐng)域,可以采用系統(tǒng)時間作為種子,而在嵌入式方面,因為STM32 HAL有不斷運行的毫秒計數(shù)值uwTick,因此可選作隨機數(shù)種子。uwTick是遞增形態(tài),為了加強隨機性,還可以將uwTick進行一次CRC32計算得到32位驗證碼,然后用此驗證碼作為隨機數(shù)種子。STM32的硬件和軟件CRC32計算,參考 C語言CRC-32 STM32格式校驗函數(shù),硬件CRC32可以加快隨機數(shù)產(chǎn)生速度,而軟件CRC32則具有通用型,一些型號MCU并不具有硬件CRC32計算組件。

采用空間節(jié)約的編譯方式,參考 STM32 region `FLASH‘ overflowed by xxx bytes 問題解決
USB虛擬串口的使用,參考 STM32 USB VCOM和HID的區(qū)別,配置及Echo功能實現(xiàn)(HAL)
采用的浮點轉(zhuǎn)字符函數(shù)py_f2s4printf(),參考 STM32 UART串口printf函數(shù)應(yīng)用及浮點打印代碼空間節(jié)省 (HAL)

主要功能代碼實現(xiàn)部分如下:

      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 register
	uint32_t data_t = 0xffffffff; //CRC register

    for(uint32_t i = 0; i < len; i++)
    {
    	data_t ^= di[i]; //32-bit data

        for (uint8_t j = 0; j < 32; j++)
        {
            if (data_t & 0x80000000)
            	data_t = (data_t << 1) ^ crc_poly;
            else
            	data_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連接虛擬串口,測試效果如下:

STM32 產(chǎn)生隨機數(shù)方式

例程下載

STM32F103C6T6為例 隨機數(shù)產(chǎn)生例程下載

–End–文章來源地址http://www.zghlxwxcb.cn/news/detail-492471.html

到了這里,關(guān)于STM32 產(chǎn)生隨機數(shù)方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • C語言rand()函數(shù)產(chǎn)生隨機數(shù)詳解

    C語言rand()函數(shù)產(chǎn)生隨機數(shù)詳解

    rand函數(shù)的原型: rand函數(shù)的功能: 用來產(chǎn)生一個隨機數(shù) rand函數(shù)的界限: stdlib.h頭文件中有宏#define RAND_MAX 0x7fff,這表示rand產(chǎn)生一個0-0x7fff的隨機數(shù),即最大是32767的一個數(shù) rand函數(shù)獲取隨機數(shù)的基礎(chǔ)用法為: a是一個整數(shù),返回值為0到a的隨機數(shù),包含0,但不包含a。 如果想要

    2024年02月06日
    瀏覽(14)
  • 在MATLAB產(chǎn)生正態(tài)(Gauss)分布隨機數(shù)

    在MATLAB產(chǎn)生正態(tài)(Gauss)分布隨機數(shù)

    在 MATLAB 中內(nèi)置了有產(chǎn)生標(biāo)準(zhǔn)正態(tài)(Gauss)分布的隨機數(shù)函數(shù),使用方法如下: 其中 m、n 為產(chǎn)生矩陣的行數(shù)和列數(shù), p 為產(chǎn)生矩陣的個數(shù),產(chǎn)生的矩陣中的每個元素均為服從 N ( 0 , 1 ) N(0, 1) N ( 0 , 1 ) 的標(biāo)準(zhǔn)正態(tài)分布的元素。 使用如下命令產(chǎn)生一個 100x1 的服從 標(biāo)準(zhǔn)正態(tài)(Gauss)分布

    2024年02月02日
    瀏覽(19)
  • 基于FPGA的LFSR16位偽隨機數(shù)產(chǎn)生算法實現(xiàn),可以配置不同的隨機數(shù)種子和改生成多項式,包含testbench

    基于FPGA的LFSR16位偽隨機數(shù)產(chǎn)生算法實現(xiàn),可以配置不同的隨機數(shù)種子和改生成多項式,包含testbench

    目錄 1.算法仿真效果 2.算法涉及理論知識概要 3.Verilog核心程序 4.完整算法代碼文件 vivado2019.2仿真結(jié)果如下: ? ? ? ? ? LFSR(線性反饋移位寄存器)提供了一種在微控制器上快速生成非序列數(shù)字列表的簡單方法。生成偽隨機數(shù)只需要右移操作和 XOR 操作。LFSR 完全由其多項式

    2024年02月11日
    瀏覽(26)
  • C語言隨機數(shù)的產(chǎn)生(rand、srand、time函數(shù)細節(jié)講解)

    C語言隨機數(shù)的產(chǎn)生(rand、srand、time函數(shù)細節(jié)講解)

    先上代碼,再詳細解釋: 我們先來查詢下rand函數(shù) 網(wǎng)站舊版我放在這兒,可以查詢庫函數(shù)等https://legacy.cplusplus.com/reference/cstring/strcat/ rand函數(shù)的頭文件是stdlib.h。 rand函數(shù)無需傳參數(shù),返回類型是一個偽隨機的整數(shù)范圍是0到RAND_MAX。那這個RAND_MAX所對應(yīng)的值是多少呢?我們同樣

    2024年02月08日
    瀏覽(20)
  • Google Earth Engine(GEE)——土地分類精度分析randomColumn產(chǎn)生偽隨機數(shù)然后進行混淆矩陣計算

    Google Earth Engine(GEE)——土地分類精度分析randomColumn產(chǎn)生偽隨機數(shù)然后進行混淆矩陣計算

    我們在進行土地分類時,需要進行精度驗證,但是之前我們要進行樣本點的隨機分類,也就是分出一部分作為訓(xùn)練樣本另外一部分作為,這是我們要想產(chǎn)生隨機種子賦值給我們所選定的訓(xùn)練樣本,這樣我們就可以隨機將樣本進行分成訓(xùn)練樣本和驗證樣本,而我們使用的函數(shù)

    2024年02月09日
    瀏覽(17)
  • Unity 中的隨機數(shù)的基礎(chǔ)常用的隨機數(shù)生成方法

    在 Unity 中,可以使用 Random 類來生成隨機數(shù)。以下是一些常用的隨機數(shù)生成方法: Random.Range(min, max):生成一個在[min, max)范圍內(nèi)的隨機整數(shù)。 Random.value:生成一個在[0, 1)范圍內(nèi)的隨機浮點數(shù)。 Random.insideUnitCircle:生成一個在單位圓內(nèi)的隨機二維向量。 Random.insideUnitSphere:生成

    2024年02月20日
    瀏覽(43)
  • JS - 生成隨機數(shù)的方法匯總(不同范圍、類型的隨機數(shù))

    (1)使用 random() 方法可以返回一個介于 0 ~ 1 之間的偽隨機數(shù)(包括 0,不包括 1)。 (2)下面是一個測試樣例 (1)這種最簡單,因為和 random 的特點保持一致。只需使用如下公式即可: (2)比如下面生成 [10,15) 范圍內(nèi)的隨機浮點數(shù)。 因為 random 的特點,要取得這幾個區(qū)間

    2023年04月08日
    瀏覽(28)
  • Hutool 生成隨機數(shù)和隨機字符串

    官方文檔: https://www.hutool.cn/docs/#/core/工具類/隨機工具-RandomUtil 整理完畢,完結(jié)撒花~

    2024年02月16日
    瀏覽(37)
  • MySQL、Oracle 生成隨機ID、隨機數(shù)、隨機字符串

    MySQL、Oracle 生成隨機ID、隨機數(shù)、隨機字符串

    UUID():是由128位的數(shù)字組成的全局唯一標(biāo)識符。每次都生成一個新的隨機數(shù)。 它通常以32個十六進制數(shù)的形式表示,分為5個部分,以連字符分隔。 UUID的長度是36個字符,包括32個十六進制數(shù)字和4個連字符。 UUID的標(biāo)準(zhǔn)格式是由 8-4-4-4-12 個十六進制數(shù)字組成的,其中每個部分的

    2024年01月16日
    瀏覽(29)
  • 一文詳解安全隨機數(shù)

    本文分享自華為云社區(qū)《【安全攻防】深入淺出實戰(zhàn)系列專題-安全隨機數(shù)》,作者: MDKing 。 使用隨機數(shù)可分類安全場景跟非安全場景。非安全場景需要生成的越快越好。安全場景使用的隨機數(shù)必須足夠安全,保證不能被預(yù)測到。 常見的非安全場景: 數(shù)據(jù)的索引號、標(biāo)識;

    2024年02月05日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包