当前位置: 首页 > news >正文

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

http://www.jsqmd.com/news/907805/

相关文章:

  • 企业级智能搜索实战:基于Amazon Kendra构建知识库
  • 投票小程序如何制作,云帆投票详细教程 - 投票小程序
  • NeRF卷王之争:深度拆解Mega-NeRF如何用‘分而治之’搞定城市级建模,对比Block-NeRF、CityNeRF谁更强?
  • 别再手动数数了!用Excel的COUNTIFS函数,5分钟搞定学生获奖统计表
  • 如何用WeChatMsg打造你的个人数字记忆库:三步实现聊天记录永久保存
  • Pot桌面应用深度调试指南:跨平台翻译软件的开发与调试实践
  • 智能解析:解锁智慧教育平台电子课本的本地化管理方案
  • 软件架构中的“小即是美”:微服务、容器与Serverless的实践哲学
  • AI驱动测试:mabl如何重塑DevOps中的软件质量保障
  • 科望医药冲刺港股:2025年无收入 净亏1.55亿 高瓴与腾讯是股东
  • 2026年热门的手持超声波焊接机/超声波塑料焊接机/无锡超声波点焊机/全自动超声波焊接机用户口碑推荐厂家 - 行业平台推荐
  • 从U.2接口到DPC协议:一次完整的NVMe热插拔,硬件和软件到底在忙些什么?
  • 2026年知名的大连鸡蛋包装箱/食品包装箱公司选择指南 - 品牌宣传支持者
  • 基于Arduino Nano与N20电机的桌面机器人YAKSHA制作全攻略
  • BERT与GPT架构深度对比:从双向理解到自回归生成的技术演进与应用选型
  • 13701黄大年茶思屋榜文137期·第一题:面向大模型推理加速的极低比特量化算法
  • Arduino Pro Max升级版开发板设计:硬件改造与多模块集成实战
  • 别再只会看原理图了!开关电源里这些‘不起眼’的小元件,才是决定稳定性的关键(电阻/电容/电感选型详解)
  • 别再只用‘分区统计’了!ArcGIS中‘区域直方图’与‘面积制表’的隐藏用法与场景辨析
  • 2026年热门的实验室干燥柜/PP 实验室家具生产厂家推荐 - 行业平台推荐
  • 2026年5月昆明装修公司推荐:TOP5评测大户型整装性价比高专业价格 - 品牌推荐
  • 如何让VS Code变身全能办公平台?Office Viewer插件完整指南
  • 2026年知名的振动麈擦焊接机/摩擦焊接机/无锡塑料焊接机/超声波塑料焊接机公司选择指南 - 品牌宣传支持者
  • 【PCI】PCI设备访问及配置过程、虚拟PCIe switch方案(六)
  • 嘎嘎降AI为什么是性价比首选?2026年降AI率工具TOP10实测
  • MYTHOS-26B-A4B性能优化指南:GPU内存管理与推理速度提升技巧
  • 观察使用taotoken token plan套餐在长期项目中的成本节省效果
  • 2026年5月25-30万家用SUV车型推荐:TOP5排名家庭出行舒适评测专业价格 - 品牌推荐
  • 别再死记硬背三次握手了!用Wireshark抓个包,亲手‘看见’TCP连接全过程
  • 构建面向AI的现代数据湖:核心原则、架构选型与实施指南