bool rng_word(portTickType timeout, uint32_t *result) { // try to receive some data right away if(pdTRUE != xQueueReceive(rng_buffer, result, (portTickType)0)) { RNG_ITConfig(ENABLE); return pdTRUE == xQueueReceive(rng_buffer, result, timeout); } return true; }
void rng_irq_handler(void) { portBASE_TYPE shouldYield = pdFALSE; uint32_t word = 0; if(RNG_GetFlagStatus(RNG_FLAG_DRDY) == SET) { word = RNG_GetRandomNumber(); if(pdTRUE != xQueueSendFromISR(rng_buffer, &word, &shouldYield)) { RNG_ITConfig(DISABLE); } } if(pdTRUE == shouldYield) { taskYIELD(); } }
void InitializeRandom(void) { RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE); RNG_Cmd(ENABLE); RNG_ITConfig(DISABLE); RNGInitialized = 1; }