本帖最后由 xiaoshen-372360 于 2024-6-17 10:42 编辑
RNG是一个真正的随机数生成器,它将全熵输出作为32位样本提供给应用程序。它由一个活熵源(模拟)和一个内部调节组件组成,其实随机数生成还是又哭可以调用的,但是这个U083的随机数生成器是由硬件生成的,这个的话就是不需要那么多的软件资源了,那么我们就来测试一下吧。先看看RNG的框图,由框图来说其实很简单,相当于使用了模拟量的噪声,来完成随机数的生成,使用多个随机的模拟量作为样本,进行异或操作,在经过裸机处理之后生成一个32位的随机数。因为噪声本来就是不规律,没有规律可循的,变换因素太多,所以作为随机数的产生是相对合理的操作。
在最开始的时候始终都返回失败,经过查找原因,是因为时钟设置设一块忘了做设置。 - #include "RNG.h"
- RNG_HandleTypeDef hrng;
- void MX_RNG_Init(void)
- {
- __HAL_RCC_RNG_CLK_ENABLE();
- RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
- PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RNG;
- PeriphClkInit.RngClockSelection = RCC_RNGCLKSOURCE_MSI;
- HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
-
-
- hrng.Instance = RNG;
- hrng.Init.ClockErrorDetection = RNG_CED_ENABLE;
- if (HAL_RNG_Init(&hrng) != HAL_OK)
- {
- printf("RNG Init Failed !\r\n");
- }
- else
- {
- printf("RNG InitSuccessed !\r\n");
- }
- }
- int Get_RNG_Data(void)
- {
- unsigned int Data=0;
- HAL_RNG_GenerateRandomNumber(&hrng, &Data);
- return Data;
- }
复制代码完成初始化之后,我们需要在主函数里面进行打印。
- #include "stm32u0xx_hal.h"
- #include "LP_UART.h"
- #include "LP_TIM.h"
- #include "RNG.h"
- static GPIO_InitTypeDef GPIO_InitStruct;
- /* USER CODE END PV */
- /* Private function prototypes -----------------------------------------------*/
- void SystemClock_Config(void);
- int main(void)
- {
- HAL_Init();
- SystemClock_Config();
- __HAL_RCC_GPIOA_CLK_ENABLE();
- /* -2- Configure IO in output push-pull mode to drive external LEDs */
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
- GPIO_InitStruct.Pin = GPIO_PIN_5;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- LP_UART_Init();
- LP_TIM_Init();
- MX_RNG_Init();
- while (1)
- {
- printf("RNGDATA is :%d\r\n",Get_RNG_Data());
- HAL_Delay(500);
- // printf("RNG DATA is ");
-
- }
- /* USER CODE END 3 */
- }
复制代码好了我们来看一下产生随机数的结果吧。
到这里,我们就可以看到产生随机数是没有规律可循的,正负数也都是随机的。
|