打印
[STM32L4]

随机数不起作用

[复制链接]
1002|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhenxizhou|  楼主 | 2019-11-12 10:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们项目采用的是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.得到随机数。
也不需要特别的步骤。但就是调不通。
请各位大大帮忙看一下,那里的问题。谢谢

使用特权

评论回复
沙发
kingkits| | 2019-11-12 10:41 | 只看该作者
产生随机数问题是个大牛的问题,目前都是伪随机数,简单的办法是做个伪随机数的数组(网上可查),利用系统时钟计数的尾数和某些特定位置的数据(比如ADC的末尾几个bits)通过逻辑操作(比如xor)组合生成随机位置,通过查表产生

使用特权

评论回复
板凳
airwill| | 2019-11-12 22:18 | 只看该作者
这里是用的外设,没有用过这个模块, 应该是外设还没有配置好吧。

使用特权

评论回复
地板
airwill| | 2019-11-12 22:18 | 只看该作者
本帖最后由 airwill 于 2019-11-12 22:24 编辑

这里是用的外设,没有用过这个模块, 是不是还跟其他模块一起作用
STM32L4随机数生成器模块(RNG)介绍.pdf (95.82 KB)

使用特权

评论回复
5
sonicll| | 2019-11-13 09:00 | 只看该作者
检查一下状态寄存器,看看是不是有时钟错误、种子错误之类的问题

使用特权

评论回复
6
zhenxizhou|  楼主 | 2019-11-13 10:26 | 只看该作者
解决了,时钟问题,按下面的就可以了。
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);
}

使用特权

评论回复
7
wakayi| | 2019-12-9 16:28 | 只看该作者
恭喜楼主解决问题

使用特权

评论回复
8
wowu| | 2019-12-9 16:34 | 只看该作者
我也长知识了

使用特权

评论回复
9
xiaoqizi| | 2019-12-9 16:43 | 只看该作者
这两段程序差在哪里啊

使用特权

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

本版积分规则

37

主题

76

帖子

2

粉丝