STM32 RNG时钟错误

时间:2015-11-19 15:38:32

标签: random embedded clock stm32


我是嵌入式开发的初学者,我使用的是STM32F417VGx板

让RNG工作有麻烦 我尝试将这些值直接用于寄存器和CMSIS Peripheral Libraty功能。

所以,我的代码:

int main() {
    SystemInit();              /* Initialize clocks */
    Init_GPIO();               /* Initialize LED's pins */
    Init_RNG();                /* Initialize RNG */

    RCC_ClocksTypeDef clocks;  
    RCC_GetClocksFreq(&clocks); /* Check clocks */
                                /* All clocks are 16 MHz (F42400) */

    while(1) {
        unsigned rdiode = randomRange(0, 3);
        toggleDiode(GPIOD, DIODES[rdiode]);
        soft_delay(1000000);
    }

}

InitRNG():

void Init_RNG() {
    RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE);
    RNG_Cmd(ENABLE);
}

randomRange(uint,uint):

uint32_t randomRange(uint32_t low, uint32_t int high){
    while(RNG_GetFlagStatus(RNG_FLAG_DRDY) == RESET);
    return RNG_GetRandomNumber() % (high-low) + low;
}

它挂起时(RNG_GetFlagStatus(RNG_FLAG_DRDY)== RESET);
RNG_SR中的CEIS为0x1,因此存在时钟错误。

我在google的每个地方都看过,在每个教程中,RNG开箱即用,甚至没有人关心检查SEIS和CEIS标志(?_?)
所以我知道RNG需要至少48MHz的时钟,但我找不到它使用的时钟源以及如何调整它的时钟:C

在stm32f4xx.h中我有那些时钟值(在一个教程中推荐),但是HSE是外部(不是板载)时钟源,不是吗?

#define HSE_VALUE    ((uint32_t)8000000)

1 个答案:

答案 0 :(得分:1)

您的代码看起来很好。

RNG由AHB2提供时钟。该时钟源自SYSCLK除以AHB预分频器(RCC_CFGR中的HPRE)。它也被称为HCLK。但正如参考手册所说:

  

RNG_LFSR由一个常量的专用时钟(RNG_CLK)提供时钟   频率,使随机数的质量与HCLK频率无关。

检查RNG_SR的值。如果设置了任何SEIS,CEIS,SECS,CECS标志,您将陷入无限循环。检查MCU的正确时钟。您使用外部(HSE)还是内部时钟(HSI)?