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);}