STM32生成伪随机数

#include  <stdio.h>
#include  <stdlib.h>

#define   RAND_NUM_MAX  100

//串口打印
int fputc(int ch, FILE * stream)
{
    HAL_UART_Transmit(&huart1, (unsigned char *)&ch, 1, HAL_MAX_DELAY);
    return ch;
}

//打印随机数
void rand_num(void)
{
    srand(HAL_GetTick());    //设置随机数种子
    printf("%d\r\n", rand()%(RAND_NUM_MAX + 1));
}

缺点:这种以滴答时钟为随机数种子生成的随机数 每次开机复位值都会一样。

故STM32内部有硬件随机数RNG寄存器,保证每次开机的时候数值都不一致。

 

全篇完。

本人博客仅仅代表我个人见解方便记录成长笔记。

若有与 看官老爷见解有冲突,我坚信看官老爷见解是对的,我的是错的。

感谢~!

<think>嗯,用户想用STM32生成四位数随机密码。首先,我需要回忆一下STM32随机数生成模块RNG的使用方法。记得RNG是硬件随机数发生器,生成的是真随机数,但可能需要先初始化相关外设。 用户需要四位数的密码,也就是范围在1000到9999之间。那生成随机数可能需要取模运算,不过直接取32随机数的低四位可能不够,因为这样得到的数可能在0到9999之间,但需要确保至少是四位数。比如,可以用取模9000然后加1000,这样得到1000到9999之间的数。 接下来是代码部分。首先需要初始化RNG模块,参考之前的引用,HAL库中要用HAL_RNG_Init,可能需要先启用时钟和配置。然后生成随机数,这里可能需要多次调用,或者直接生成一个32位数然后处理。 但是用户可能需要四位单独的随机数字,每个数字0-9,然后组合成四位数。比如,生成四个0-9的随机数,然后分别转换成字符,拼接起来。或者生成一个0到9999的数,然后格式化为四位,前面补零。比如,如果生成的数是123,那么补零为0123,但用户可能需要四位数,所以可能需要确保数值在0到9999之间,然后格式化输出。 不过用户的问题可能更倾向于生成四位数字密码,每个位置都是0-9的数字。所以可能需要生成四次随机数,每次取一位。不过这样的话,可能需要对每个数字单独处理,比如生成0-9的随机数。不过RNG生成的是32位数,可能需要取模10来得到0-9的数字。 但直接取模可能会有偏差,因为32随机数模10的话,如果RNG的范围不是10的倍数,可能会有分布不均的问题。不过对于四位密码来说,可能可以接受。或者使用更均匀的方法,比如拒绝采样,但可能会复杂。 另外,代码示例需要用到HAL库的函数,比如HAL_RNG_GenerateRandomNumber,然后处理返回值。需要确保RNG已经正确初始化,可能需要检查标志位,如DRDY(数据就绪)标志,确保数据可用。 根据引用[2],读取随机数前要等待DRDY标志置位,然后在代码中读取RNG_DR寄存器。HAL库的函数可能已经封装了这些步骤,比如HAL_RNG_GenerateRandomNumber函数会处理等待就绪的过程,所以示例代码中可能需要调用这个函数四次,或者生成一个32位数,然后拆分成四个部分。 例如,生成一个32位的随机数,然后将其分解为四个字节,每个字节对应一个数字。但每个字节的范围是0-255,要转换成0-9可能需要取模10,或者用位操作。或者生成四个独立的随机数,每个都取模10,然后组合起来。 另一个方法是生成一个0到9999的随机数,然后格式化为四位数字,不足四位前面补零。比如,如果生成的数是345,则转换为0345。这可以通过sprintf函数格式化输出为字符串,或者用整数运算分解各位。 现在,代码结构大致是:初始化RNG,生成随机数,处理成四位密码,返回或输出。 需要检查硬件配置是否正确,比如在CubeMX中启用RNG外设,并确保时钟配置正确。比如,RNG需要48MHz时钟,如果使用HSE或HSI的话,可能需要配置正确。 可能的错误点包括未正确初始化RNG导致无法生成随机数,或者没有处理可能的错误状态,比如种子错误(SECS)标志,这时候需要重新初始化或处理错误。 综上,示例代码应该包括初始化函数和生成四位密码的函数。初始化部分使用HAL_RNG_Init,生成部分可能调用HAL_RNG_GenerateRandomNumber四次,或者生成一个足够大的数然后分解。然后确保每个数字在0-9之间,并组合成四位数。 可能还需要考虑密码的唯一性、随机性质量,但对于基本功能来说,使用RNG模块生成四个数字即可。最后,将生成的数字组合成字符串或整数返回。</think>在STM32上实现四位数随机密码生成需要结合硬件随机数发生器(RNG)和数值处理逻辑。以下是分步实现方法和示例代码: ### 一、硬件配置与初始化 1. **CubeMX配置** 在STM32CubeMX中启用RNG外设,并确保其时钟源正确(通常需48MHz)[^3]。 2. **RNG初始化代码** ```c RNG_HandleTypeDef hrng; void RNG_Init(void) { hrng.Instance = RNG; if (HAL_RNG_Init(&hrng) != HAL_OK) { Error_Handler(); } } ``` --- ### 二、生成四位随机密码逻辑 #### 方法1:单次生成四位数字 ```c uint32_t Generate_Password(void) { uint32_t random = 0; // 生成0-9999范围内的随机数 HAL_RNG_GenerateRandomNumber(&hrng, &random); return (random % 9000) + 1000; // 范围限定为1000-9999 } ``` #### 方法2:逐位生成并拼接(更均匀) ```c char password[5] = {0}; // 存储4位密码+终止符 void Generate_Password_Char(void) { for (int i = 0; i < 4; i++) { uint32_t temp; HAL_RNG_GenerateRandomNumber(&hrng, &temp); password[i] = (temp % 10) + '0'; // 转换为ASCII字符 } } ``` --- ### 三、完整示例代码 ```c #include "stm32f4xx_hal.h" RNG_HandleTypeDef hrng; void RNG_Init(void) { __HAL_RCC_RNG_CLK_ENABLE(); // 启用RNG时钟 hrng.Instance = RNG; if (HAL_RNG_Init(&hrng) != HAL_OK) { Error_Handler(); } } uint32_t Get_Random_Range(uint32_t min, uint32_t max) { uint32_t random; HAL_RNG_GenerateRandomNumber(&hrng, &random); return (random % (max - min + 1)) + min; } // 主函数调用示例 int main(void) { HAL_Init(); RNG_Init(); // 生成4位密码(1000-9999) uint32_t numeric_password = Get_Random_Range(1000, 9999); // 或生成字符型密码(如"3582") char str_password[5]; for (int i = 0; i < 4; i++) { str_password[i] = Get_Random_Range(0, 9) + '0'; } str_password[4] = '\0'; while(1); } ``` --- ### 四、关键注意事项 1. **时钟验证** 通过`RNG_CR`寄存器检查时钟是否稳定(CR寄存器第2位应为1)[^3]。 2. **错误处理** ```c if (__HAL_RNG_GET_FLAG(&hrng, RNG_FLAG_SECS)) { __HAL_RNG_CLEAR_FLAG(&hrng, RNG_FLAG_SECS); HAL_RNG_Init(&hrng); // 重新初始化种子 } ``` 3. **随机性质量** 建议连续读取多个随机数并丢弃前几个,以增强熵质量[^1]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值