[STM32L4] 随机数不起作用

[复制链接]
1255|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, 下载次数: 2)
sonicll 发表于 2019-11-13 09:00 | 显示全部楼层
检查一下状态寄存器,看看是不是有时钟错误、种子错误之类的问题
 楼主| 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);
}
wakayi 发表于 2019-12-9 16:28 | 显示全部楼层
恭喜楼主解决问题
wowu 发表于 2019-12-9 16:34 | 显示全部楼层
我也长知识了
xiaoqizi 发表于 2019-12-9 16:43 | 显示全部楼层
这两段程序差在哪里啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

76

帖子

2

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