STM32 HAL库学习 RNG篇

RNG 指的是STM32 单片机带有的硬件随机数生成器功能,通过这个硬件功能可以生成真随机数。功能明确,使用简单。

1、HAL_StatusTypeDef HAL_RNG_Init(RNG_HandleTypeDef *hrng)

RNG_HandleTypeDef hrng;

void MX_RNG_Init(void)
{
  hrng.Instance = RNG;
  hrng.Init.ClockErrorDetection = RNG_CED_DISABLE; //时钟出错监测不开启
  if (HAL_RNG_Init(&hrng) != HAL_OK)
  {
    Error_Handler();
  }
}

初始化函数,内部只需要对时钟出错是否监测功能开启与否的一个选择,因为RNG功能的真随机数生成需要使用时钟作为信号源,不同于其他的软件生成一般利用当前的时间作为信号源,所以对时钟的有所要求。

2、void HAL_RNG_MspInit(RNG_HandleTypeDef* rngHandle)

初始化回调函数,被函数1自动调用。用于配置信号源的选择和开启外设时钟,此处选择的信号源为LSE。除了可以选择这个时钟之外还有低速内部时钟48M、LSI、PLL的分频时钟可以做选择。如果选择的时钟源不存在程序会在此处卡死。

void HAL_RNG_MspInit(RNG_HandleTypeDef* rngHandle)
{
  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  if(rngHandle->Instance==RNG)
  {
    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RNG;
    PeriphClkInitStruct.RngClockSelection = RCC_RNGCLKSOURCE_LSE;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    {
      Error_Handler();
    }
    __HAL_RCC_RNG_CLK_ENABLE();
  }
}

3、HAL_StatusTypeDef HAL_RNG_GenerateRandomNumber(RNG_HandleTypeDef *hrng, uint32_t *random32bit)

主要函数,生成随机数据。此处使用了非中断生成的方法,还可以使用中断生成的方法。

   uint32_t randnum = 0;
  while (1)
  {
 
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4);
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
	  HAL_RNG_GenerateRandomNumber(&hrng,&randnum);
	  K_Printf("RandNumber is %d\n",randnum);
	  rt_thread_mdelay(500);
  }

4、HAL_StatusTypeDef HAL_RNG_GenerateRandomNumber_IT(RNG_HandleTypeDef *hrng)

5、void RNG_IRQHandler(void)

6、void HAL_RNG_IRQHandler(RNG_HandleTypeDef *hrng)

7、void HAL_RNG_ReadyDataCallback(RNG_HandleTypeDef *hrng, uint32_t random32bit)

四个函数作用是使用中断模式来生成随机数据。在配置的时候需要开启中断才可以使用。

void HAL_RNG_MspInit(RNG_HandleTypeDef* rngHandle)
{
	RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};

	if(rngHandle->Instance == RNG)
	{
		PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RNG;
		PeriphClkInitStruct.RngClockSelection    = RCC_RNGCLKSOURCE_LSE;

		HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);

		__HAL_RCC_RNG_CLK_ENABLE();

	   HAL_NVIC_EnableIRQ(RNG_IRQn);
	   HAL_NVIC_SetPriority(RNG_IRQn,0,1);
	}

}

void RNG_IRQHandler(void)
{
	HAL_RNG_IRQHandler(&hrng);

}

void HAL_RNG_ReadyDataCallback(RNG_HandleTypeDef *hrng, uint32_t random32bit)
{

	K_Printf("RandNumber is %d\n",random32bit);

}
//主循环中
...
 while (1)
  {
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4);
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
	  HAL_RNG_GenerateRandomNumber_IT(&hrng); //开启中断 获取随机数
	  rt_thread_mdelay(500);
  }

你可能感兴趣的:(stm32,学习,嵌入式硬件)