/* * (c) danielinux 2019 * GPLv.2 * * See LICENSE for details */ #include "system.h" #include uint32_t random_uint32(void) { int i; uint32_t rand; /* enable RNG peripheral clock */ AHB2_CLOCK_ER |= RNG_AHB2_CLOCK_ER; /* enable RNG interrupt, set IE bit in RNG->CR register */ RNG_CR |= RNG_CR_IE; /* enable RNG, set RNGEN bit in RNG->CR. Activates RNG, * RNG_LFSR, and error detector */ RNG_CR |= RNG_CR_RNGEN; /* verify no errors, make sure SEIS and CEIS bits are 0 * in RNG->SR register */ if (RNG_SR & (RNG_SR_SECS | RNG_SR_CECS)) return 0; /* wait until RNG number is ready */ while ((RNG_SR & RNG_SR_DRDY) == 0) ; /* get value */ rand = RNG_DR; return rand; }