单片机RNG实验
单片机 :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);/* 显示随机数 */
