打印
[STM32L4]

随机数不起作用

[复制链接]
1055|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 | 只看该作者
这里是用的外设,没有用过这个模块

使用特权

评论回复
5
renyaq| | 2021-11-13 21:14 | 只看该作者
应该是外设还没有配置好吧

使用特权

评论回复
6
xxrs| | 2021-11-13 21:16 | 只看该作者
这里是用的外设,没有用过这个模块, 是不是还跟其他模块一起作用

使用特权

评论回复
7
heweibig|  楼主 | 2021-11-13 21:19 | 只看该作者
检查一下状态寄存器,看看是不是有时钟错误、种子错误之类的问题

使用特权

评论回复
8
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);
}

使用特权

评论回复
9
jlyuan| | 2021-11-13 21:26 | 只看该作者
这两段程序差在哪里啊

使用特权

评论回复
10
heweibig|  楼主 | 2021-11-13 21:26 | 只看该作者
唉,还是没有什么结果,算了,多谢大家啦

使用特权

评论回复
11
aoyi| | 2021-12-7 19:36 | 只看该作者
是真正的随机数吗

使用特权

评论回复
12
drer| | 2021-12-7 19:38 | 只看该作者
如何判定是不是真的随机数呢

使用特权

评论回复
13
gwsan| | 2021-12-7 20:03 | 只看该作者
自身的功能模块吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

869

主题

13089

帖子

7

粉丝