单片机 :STM32F407
开发板:DMF407电机开发板
平台:keil V5.31
HSE 为8MHZ
HSI为16MHZ
产生随机数。

主函数:
int main(void)
{
uint32_t random;
uint8_t t = 0, key;
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
usmart_dev.init(84); /* 初始化USMART */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
lcd_show_string(30, 70, 200, 16, 16, "RNG TEST", RED);
lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
while (rng_init()) /* 初始化随机数发生器 */
{
lcd_show_string(30, 110, 200, 16, 16, " RNG Error! ", RED);
delay_ms(200);
lcd_show_string(30, 110, 200, 16, 16, "RNG Trying...", RED);
}
lcd_show_string(30, 110, 200, 16, 16, "RNG Ready! ", RED);
lcd_show_string(30, 130, 200, 16, 16, "KEY0:Get Random Num", RED);
lcd_show_string(30, 150, 200, 16, 16, "Random Num:", RED);
lcd_show_string(30, 180, 200, 16, 16, "Random Num[0-9]:", RED);
while (1)
{
key = key_scan(0);
if (key == KEY0_PRES)
{
random = rng_get_random_num();
lcd_show_num(30 + 8 * 11, 150, random, 10, 16, BLUE);
}
if ((t % 20) == 0)
{
LED0_TOGGLE(); /* 每200ms,翻转一次LED0 */
random = rng_get_random_range(0, 9); /* 取[0,9]区间的随机数 */
lcd_show_num(30 + 8 * 16, 180, random, 1, 16, BLUE);/* 显示随机数 */
}
delay_ms(10);
t++;
}
}
配置:
uint8_t rng_init(void)
{
uint16_t retry = 0;
g_rng_handle.Instance = RNG;
HAL_RNG_DeInit(&g_rng_handle);
HAL_RNG_Init(&g_rng_handle); /* 初始化RNG */
while (__HAL_RNG_GET_FLAG(&g_rng_handle, RNG_FLAG_DRDY) == RESET && retry < 10000) /* 等待RNG准备就绪 */
{
retry++;
delay_us(10);
}
if (retry >= 10000)
{
return 1; /* 随机数产生器工作不正常 */
}
return 0;
}
void HAL_RNG_MspInit(RNG_HandleTypeDef *hrng)
{
__HAL_RCC_RNG_CLK_ENABLE();/* 使能RNG时钟 */
}
uint32_t rng_get_random_num(void)
{
uint32_t randomnum;
HAL_RNG_GenerateRandomNumber(&g_rng_handle, &randomnum);
return randomnum;
}
int rng_get_random_range(int min, int max)
{
uint32_t randomnum;
HAL_RNG_GenerateRandomNumber(&g_rng_handle, &randomnum);
return randomnum%(max-min+1) + min;
}
按键产生一个随机数;定时间间隔产生一个一定范围内的随机数。
测试结果:
random = rng_get_random_range(0, 999); /* 取0,999区间的随机数 */
lcd_show_num(30 + 8 * 16, 180, random, 3, 16, BLUE);/* 显示随机数 */
