日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【STM32】硬件随机数程序示例

發布時間:2024/4/24 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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】硬件随机数程序示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。