[STM32L4] 随机数不起作用

[复制链接]
1413|12
 楼主| heweibig 发表于 2021-11-13 21:05 | 显示全部楼层 |阅读模式
我们项目采用的是STM32L431,板子跑程序是正常的,时钟之类的都没错。现在我想搞个随机数,写了个测试程序:
void test_rng(void)
{
        RNG_TypeDef rngType;
        uint32_t num;

        rngType.CR = RNG_BASE;
        rngType.SR = RNG_BASE + 4;
        rngType.DR = RNG_BASE + 8;

        //printf("CR=%x,SR=%x,DR=%x\r\n", rngType.CR, rngType.SR, rngType.DR);

        LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_RNG);
        LL_RNG_Enable(&rngType);
        while (LL_RNG_IsActiveFlag_DRDY(&rngType) == RESET)
        {
        }
        num = LL_RNG_ReadRandData32(&rngType);
        printf("***num1***=%d\r\n", num);
}
程序一直停在while (LL_RNG_IsActiveFlag_DRDY(&rngType) == RESET)这个地方。
我看网上说的步骤都是:
1.使能RNG控制器时钟。
2.使能RNG。
3.等待直到随机数发生器产生有效的随机数(中断或查询模式)。
4.得到随机数。
也不需要特别的步骤。但就是调不通。
请各位大大帮忙看一下,那里的问题。谢谢
ousj 发表于 2021-11-13 21:07 | 显示全部楼层
产生随机数问题是个大牛的问题,目前都是伪随机数
zhanghqi 发表于 2021-11-13 21:09 | 显示全部楼层
简单的办法是做个伪随机数的数组(网上可查),利用系统时钟计数的尾数和某些特定位置的数据(比如ADC的末尾几个bits)通过逻辑操作(比如xor)组合生成随机位置,通过查表产生
yszong 发表于 2021-11-13 21:11 | 显示全部楼层
这里是用的外设,没有用过这个模块
renyaq 发表于 2021-11-13 21:14 | 显示全部楼层
应该是外设还没有配置好吧
xxrs 发表于 2021-11-13 21:16 | 显示全部楼层
这里是用的外设,没有用过这个模块, 是不是还跟其他模块一起作用
 楼主| heweibig 发表于 2021-11-13 21:19 | 显示全部楼层
检查一下状态寄存器,看看是不是有时钟错误、种子错误之类的问题
 楼主| heweibig 发表于 2021-11-13 21:23 | 显示全部楼层
解决了,时钟问题,按下面的就可以了。
void test_rng(void)
{
        uint32_t num;

        LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_RNG);

        LL_RCC_PLLSAI1_ConfigDomain_48M(LL_RCC_PLLSOURCE_MSI, LL_RCC_PLLM_DIV_1, 24, LL_RCC_PLLSAI1Q_DIV_2);
        LL_RCC_PLLSAI1_Enable();
        LL_RCC_PLLSAI1_EnableDomain_48M();
        while(LL_RCC_PLLSAI1_IsReady() != 1)
        {
        };
        LL_RCC_SetRNGClockSource(LL_RCC_RNG_CLKSOURCE_PLLSAI1);

        LL_RNG_Enable(RNG);
        while (LL_RNG_IsActiveFlag_DRDY(RNG) == RESET)
        {
        }
        num = LL_RNG_ReadRandData32(RNG);
        printf("***num1***=%d\r\n", num);
        Delay_MS(10);
        while (LL_RNG_IsActiveFlag_DRDY(RNG) == RESET)
        {
        }
        num = LL_RNG_ReadRandData32(RNG);
        printf("***num2***=%d\r\n", num);
}
jlyuan 发表于 2021-11-13 21:26 | 显示全部楼层
这两段程序差在哪里啊
 楼主| heweibig 发表于 2021-11-13 21:26 | 显示全部楼层
唉,还是没有什么结果,算了,多谢大家啦
aoyi 发表于 2021-12-7 19:36 | 显示全部楼层
是真正的随机数吗
drer 发表于 2021-12-7 19:38 | 显示全部楼层
如何判定是不是真的随机数呢
gwsan 发表于 2021-12-7 20:03 | 显示全部楼层
自身的功能模块吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

869

主题

13089

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部