你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32 硬件随机数程序示例

[复制链接]
STMCU小助手 发布时间:2022-6-15 14:00
01. 概述
STM32F4 自带了硬件随机数发生器(RNG),RNG 处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个 32 位的随机数。

相关头文件和源码在stm32f4xx_rng.h/stm32f4xx_rng.c。

02. 硬件模块
用到的硬件资源有:
1) 指示灯 DS0
2) 串口
3) KEY0 按键
4) 随机数发生器(RNG)
5) TFTLCD 模块

03. 相关函数
  1. /* Exported macro ------------------------------------------------------------*/
  2. /* Exported functions --------------------------------------------------------*/

  3. /*  Function used to set the RNG configuration to the default reset state *****/
  4. void RNG_DeInit(void);

  5. /* Configuration function *****************************************************/
  6. void RNG_Cmd(FunctionalState NewState);

  7. /* Get 32 bit Random number function ******************************************/
  8. uint32_t RNG_GetRandomNumber(void);

  9. /* Interrupts and flags management functions **********************************/
  10. void RNG_ITConfig(FunctionalState NewState);
  11. FlagStatus RNG_GetFlagStatus(uint8_t RNG_FLAG);
  12. void RNG_ClearFlag(uint8_t RNG_FLAG);
  13. ITStatus RNG_GetITStatus(uint8_t RNG_IT);
  14. void RNG_ClearITPendingBit(uint8_t RNG_IT);
复制代码

04. 程序示例
rng.h文件

  1. #ifndef __RNG_H__
  2. #define __RNG_H__

  3. #include "sys.h"

  4. //初始化
  5. u8 RNG_Init(void);

  6. //获取随机数
  7. u32 RNG_Get_RandomNum(void);

  8. //获取范围内的随机数
  9. u32 RNG_Get_RandomRange(int min, int max);


  10. #endif/*__RNG_H__*/
复制代码

rng.c文件

  1. #include "rng.h"

  2. #include "delay.h"

  3. //初始化
  4. u8 RNG_Init(void)
  5. {
  6.         u16 retry = 0;
  7.         
  8.         //使能时钟
  9.         RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE);
  10.         
  11.         //使能RNG
  12.         RNG_Cmd(ENABLE);
  13.         
  14.         //等待随机数就绪
  15.         while(RNG_GetFlagStatus(RNG_FLAG_DRDY) == RESET && retry < 10000)
  16.         {
  17.                 retry++;
  18.         
  19.                 delay_us(100);
  20.         }
  21.         
  22.         if (retry >= 10000)
  23.         {
  24.                 return 1;
  25.         }
  26.         
  27.         //获取第一个随机数丢弃处理
  28.         //将 RNGEN 位置 1 后产生的第一个随机数不应使用,但应保存起来,
  29.         //与产生的下一个随机数进行比较。随后产生的每个随机数都需要与
  30.         //产生的上一个随机数进行比较。如果任何一对进行比较的数字相等,
  31.         //则测试失败(连续随机数发生器测试)。
  32.         RNG_GetRandomNumber();

  33.         return 0;
  34. }

  35. //获取随机数
  36. u32 RNG_Get_RandomNum(void)
  37. {
  38.         //等待随机数就绪
  39.         while(RNG_GetFlagStatus(RNG_FLAG_DRDY) == RESET)
  40.                 /*Do Nothing*/;

  41.         return RNG_GetRandomNumber();
  42. }

  43. //获取范围内的随机数
  44. u32 RNG_Get_RandomRange(int min, int max)
  45. {

  46.         return RNG_Get_RandomNum() % (max - min + 1) + min;
  47. }
复制代码

main.c文件

  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "beep.h"
  6. #include "key.h"
  7. #include "usmart.h"
  8. #include "lcd.h"
  9. #include "rtc.h"
  10. #include "rng.h"
  11. #include "key.h"

  12. //LED状态设置函数
  13. void led_set(u8 sta)
  14. {
  15.         LED1 = sta;
  16. }

  17. //函数参数调用测试函数
  18. void test_fun(void(*ledset)(u8), u8 sta)
  19. {
  20.         ledset(sta);
  21. }

  22. int main(void)
  23. {
  24.         u32 num = 0;
  25.         u8 key = 0;
  26.         u8 t = 0;

  27.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  28.         
  29.         delay_init(168);
  30.         
  31.         uart_init(115200);
  32.         
  33.         usmart_dev.init(84);

  34.         
  35.         LED_Init();
  36.         
  37.         KEY_Init();
  38.         
  39.         LCD_Init();
  40.         
  41.                
  42.         POINT_COLOR = RED;
  43.         
  44.         LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");        
  45.         LCD_ShowString(30,70,200,16,16,"RNG TEST");        
  46.         LCD_ShowString(30,90,200,16,16,"ATOM@tom");
  47.         LCD_ShowString(30,110,200,16,16,"2020/09/10");         
  48.         
  49.         //初始化随机数发生器
  50.         while(RNG_Init())
  51.         {
  52.                 LCD_ShowString(30,130,200,16,16,"RNG Error!");
  53.                 delay_ms(200);
  54.                 LCD_ShowString(30,130,200,16,16,"RNG Trying....");        
  55.         }
  56.         
  57.         LCD_ShowString(30,130,200,16,16,"RNG Ready! ");         

  58.         LCD_ShowString(30,150,200,16,16,"KEY0:Get Random Num");         

  59.         LCD_ShowString(30,180,200,16,16,"Random Num: ");         

  60.         LCD_ShowString(30,210,200,16,16,"Random Num[0-9]: ");         
  61.         
  62.         POINT_COLOR = BLUE;
  63.         
  64.         while(1)
  65.         {
  66.                 delay_ms(20);
  67.                
  68.                 key = Key_Scan();
  69.                 if (key == KEY0_PRESS)
  70.                 {
  71.                         //获取随机数
  72.                         num = RNG_Get_RandomNum();
  73.                         LCD_ShowNum(30 + 8 * 16, 180, num, 10, 16);        
  74.                 }
  75.                
  76.                
  77.                 if ((t % 25) == 0)
  78.                 {
  79.                         LED1 = !LED1;
  80.                         //获取随机数
  81.                         num = RNG_Get_RandomRange(0, 9);
  82.                         LCD_ShowNum(30 + 8 * 16, 210, num, 1, 16);                                
  83.                 }
  84.                
  85.                 t++;        
  86.         }
  87. }
复制代码

05. 结果验证
将程序下载到探索者 STM32F4 开发板后,可以看到 DS0 不停的闪烁,提示程序已经在运行了。同时每隔 250ms,获取一次区间[0,9]的随机数,实时显示在液晶上。然后我们也可以按下 KEY0,就可以在屏幕上看到获取到的随机数,


收藏 评论0 发布时间:2022-6-15 14:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版