【STM32】硬件随机数程序示例
生活随笔
收集整理的這篇文章主要介紹了
【STM32】硬件随机数程序示例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
00. 目錄
文章目錄
- 00. 目錄
- 01. 概述
- 02. 硬件模塊
- 03. 相關函數
- 04. 程序示例
- 05. 結果驗證
- 06. 附錄
- 07. 聲明
01. 概述
STM32F4 自帶了硬件隨機數發生器(RNG),RNG 處理器是一個以連續模擬噪聲為基礎的隨機數發生器,在主機讀數時提供一個 32 位的隨機數。
相關頭文件和源碼在stm32f4xx_rng.h/stm32f4xx_rng.c。
02. 硬件模塊
用到的硬件資源有:
1) 指示燈 DS0
2) 串口
3) KEY0 按鍵
4) 隨機數發生器(RNG)
5) TFTLCD 模塊
03. 相關函數
/* Exported macro ------------------------------------------------------------*/ /* Exported functions --------------------------------------------------------*/ /* Function used to set the RNG configuration to the default reset state *****/ void RNG_DeInit(void);/* Configuration function *****************************************************/ void RNG_Cmd(FunctionalState NewState);/* Get 32 bit Random number function ******************************************/ uint32_t RNG_GetRandomNumber(void);/* Interrupts and flags management functions **********************************/ void RNG_ITConfig(FunctionalState NewState); FlagStatus RNG_GetFlagStatus(uint8_t RNG_FLAG); void RNG_ClearFlag(uint8_t RNG_FLAG); ITStatus RNG_GetITStatus(uint8_t RNG_IT); void RNG_ClearITPendingBit(uint8_t RNG_IT);04. 程序示例
rng.h文件
#ifndef __RNG_H__ #define __RNG_H__#include "sys.h"//初始化 u8 RNG_Init(void);//獲取隨機數 u32 RNG_Get_RandomNum(void);//獲取范圍內的隨機數 u32 RNG_Get_RandomRange(int min, int max);#endif/*__RNG_H__*/rng.c文件
#include "rng.h"#include "delay.h"//初始化 u8 RNG_Init(void) {u16 retry = 0;//使能時鐘RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE);//使能RNGRNG_Cmd(ENABLE);//等待隨機數就緒while(RNG_GetFlagStatus(RNG_FLAG_DRDY) == RESET && retry < 10000){retry++;delay_us(100);}if (retry >= 10000){return 1;}//獲取第一個隨機數丟棄處理//將 RNGEN 位置 1 后產生的第一個隨機數不應使用,但應保存起來,//與產生的下一個隨機數進行比較。隨后產生的每個隨機數都需要與//產生的上一個隨機數進行比較。如果任何一對進行比較的數字相等,//則測試失敗(連續隨機數發生器測試)。RNG_GetRandomNumber();return 0; }//獲取隨機數 u32 RNG_Get_RandomNum(void) {//等待隨機數就緒while(RNG_GetFlagStatus(RNG_FLAG_DRDY) == RESET)/*Do Nothing*/;return RNG_GetRandomNumber(); }//獲取范圍內的隨機數 u32 RNG_Get_RandomRange(int min, int max) {return RNG_Get_RandomNum() % (max - min + 1) + min; }main.c文件
#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "beep.h" #include "key.h" #include "usmart.h" #include "lcd.h" #include "rtc.h" #include "rng.h" #include "key.h"//LED狀態設置函數 void led_set(u8 sta) {LED1 = sta; }//函數參數調用測試函數 void test_fun(void(*ledset)(u8), u8 sta) {ledset(sta); }int main(void) { u32 num = 0;u8 key = 0;u8 t = 0;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2delay_init(168);uart_init(115200);usmart_dev.init(84);LED_Init();KEY_Init();LCD_Init();POINT_COLOR = RED;LCD_ShowString(30,50,200,16,16,"Explorer STM32F4"); LCD_ShowString(30,70,200,16,16,"RNG TEST"); LCD_ShowString(30,90,200,16,16,"ATOM@tom");LCD_ShowString(30,110,200,16,16,"2020/09/10"); //初始化隨機數發生器while(RNG_Init()){LCD_ShowString(30,130,200,16,16,"RNG Error!");delay_ms(200);LCD_ShowString(30,130,200,16,16,"RNG Trying...."); }LCD_ShowString(30,130,200,16,16,"RNG Ready! "); LCD_ShowString(30,150,200,16,16,"KEY0:Get Random Num"); LCD_ShowString(30,180,200,16,16,"Random Num: "); LCD_ShowString(30,210,200,16,16,"Random Num[0-9]: "); POINT_COLOR = BLUE;while(1){delay_ms(20);key = Key_Scan();if (key == KEY0_PRESS){//獲取隨機數num = RNG_Get_RandomNum();LCD_ShowNum(30 + 8 * 16, 180, num, 10, 16); }if ((t % 25) == 0){LED1 = !LED1;//獲取隨機數num = RNG_Get_RandomRange(0, 9);LCD_ShowNum(30 + 8 * 16, 210, num, 1, 16); }t++; } }05. 結果驗證
將程序下載到探索者 STM32F4 開發板后,可以看到 DS0 不停的閃爍,提示程序已經在運行了。同時每隔 250ms,獲取一次區間[0,9]的隨機數,實時顯示在液晶上。然后我們也可以按下 KEY0,就可以在屏幕上看到獲取到的隨機數,
06. 附錄
6.1 【STM32】STM32系列教程匯總
網址:【STM32】STM32系列教程匯總
07. 聲明
該教程參考了正點原子的《STM32 F4 開發指南》
總結
以上是生活随笔為你收集整理的【STM32】硬件随机数程序示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【STM32】随机数发生器相关函数和类型
- 下一篇: 【STM32】低功耗相关函数和类型