我是嵌入式开发的初学者,我使用的是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)
答案 0 :(得分:1)
您的代码看起来很好。
RNG由AHB2提供时钟。该时钟源自SYSCLK除以AHB预分频器(RCC_CFGR中的HPRE)。它也被称为HCLK。但正如参考手册所说:
RNG_LFSR由一个常量的专用时钟(RNG_CLK)提供时钟 频率,使随机数的质量与HCLK频率无关。
检查RNG_SR的值。如果设置了任何SEIS,CEIS,SECS,CECS标志,您将陷入无限循环。检查MCU的正确时钟。您使用外部(HSE)还是内部时钟(HSI)?