uint32_t TM_RNG_Get(void) { //Wait until one RNG number is ready while(RNG_GetFlagStatus(RNG_FLAG_DRDY) == RESET); //Get a 32bit Random number //return RNG_GetRandomNumber(); return RNG->DR; /**** while(RNG_GetFlagStatus(RNG_FLAG_DRDY) == RESET); 8000276: 2001 movs r0, #1 8000278: f00a f8c6 bl 800a408 <RNG_GetFlagStatus> 800027c: 4603 mov r3, r0 800027e: 2b00 cmp r3, #0 8000280: d0f9 beq.n 8000276 <TM_RNG_Get+0x6> * * **** return RNG->DR; * ldr r3, [pc, #8] ; (800028c <TM_RNG_Get+0x1c>) 8000284: 689b ldr r3, [r3, #8] 800028c: 50060800 .word 0x50060800 //equivalent: ldr r0,=0x50060800 ldr r0, [r0, #8] */ //#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */ //#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000) //#define RNG_BASE (AHB2PERIPH_BASE + 0x60800) //RNG_BASE = 0x50060800 }
// generate one random number uint32_t get_random_number() { /* Wait until one RNG number is ready */ while(RNG_GetFlagStatus(RNG_FLAG_DRDY)== RESET); /* Get a 32bit Random number */ uint32_t r = RNG_GetRandomNumber(); return r; }
uint32_t GetRandomInteger(void) { if (!RNGInitialized) { //ERROR return 0; } while (RNG_GetFlagStatus(RNG_FLAG_DRDY) == RESET); return RNG_GetRandomNumber(); }
uint32_t SRAM_Test(void) { uint32_t adr = 0; uint32_t error = 0; uint16_t *prnd; uint16_t *pmem; uint16_t temp; prnd = malloc(512); RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE); RNG_Cmd(ENABLE); for(adr = 0; adr < 512; adr++) { while(RNG_GetFlagStatus(RNG_FLAG_DRDY) == RESET); *(prnd++) = (uint16_t)RNG_GetRandomNumber(); } RNG_Cmd(DISABLE); RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,DISABLE); prnd -= 512; pmem = (uint16_t*)sram_bank3; temp = *prnd; for(adr = 0; adr < 524288; adr++) { if((adr & 0x3ff) == 0x3ff) temp = *(prnd++); temp = (temp + 1024) * 5; *(pmem++) = temp; } for(int test_num = 0; test_num < 3; test_num++) { prnd -= 512; pmem = (uint16_t*)sram_bank3; temp = *prnd; for(adr = 0; adr < 524288; adr++) { if((adr & 0x3ff) == 0x3ff) temp = *(prnd++); temp = (temp + 1024) * 5; if(temp != *(pmem++)) error++; } } free(prnd); return error; }
int init_rng(void) { u16 retry=0; RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE); //开启 RNG 时钟 RNG_Cmd(ENABLE); //使能 RNG while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==RESET&&retry<10000)//等待就绪 { retry++; delay_ms(1); } if(retry>=10000)return 1;//随机数产生器工作不正常 return 0; }
void vTaskTest( void* pvParam ) { u8 t, i; Uart_putstr( "vTaskTest start" ) ; RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE); RNG_Cmd(ENABLE); while( 1 ) { xQueueSend( xqh_Tpframe, (void*)NULL, 0 ) ; while(RNG_GetFlagStatus(RNG_FLAG_DRDY) == RESET); t = RNG_GetRandomNumber(); for( i = 0; i < t; i++ ) vTaskDelay( 100/portTICK_RATE_MS ) ; } }
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(); } }
/** * @brief Main program * @param None * @retval None */ int main(void) { uint32_t random32bit = 0; uint32_t counter = 0; /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup files (startup_stm32f40_41xxx.s/startup_stm32f427_437xx.s/startup_stm32f429_439xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f4xx.c file */ /* Display init (LCD or/and USART)*/ Display_Init(); /* Key Button configuration */ STM_EVAL_PBInit(BUTTON_KEY, BUTTON_MODE_GPIO); /* RNG configuration */ RNG_Config(); while (1) { /* Wait until Key button is pressed */ while(STM_EVAL_PBGetState(BUTTON_KEY) != RESET) { } /* Loop while Key button is maintained pressed */ while(STM_EVAL_PBGetState(BUTTON_KEY) == RESET) { } for(counter = 0; counter < 8; counter++) { /* Wait until one RNG number is ready */ while(RNG_GetFlagStatus(RNG_FLAG_DRDY)== RESET) { } /* Get a 32bit Random number */ random32bit = RNG_GetRandomNumber(); /* Display the Random number value on the LCD or/and USART */ Display(random32bit, counter+1); } } }
/** * @Function u8 RNG_Init(void); * @Description Init_RNG * @Return 0:SUCESS * 1:Error */ u8 RNG_Init(void) { u16 retry=0; RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE);//开启RNG时钟,来自PLL48CLK RNG_Cmd(ENABLE); //使能RNG while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==RESET&&retry<10000) //等待随机数就绪 { retry++; delay_us(100); } if(retry>=10000)return 1;//随机数产生器工作不正常 return 0; }
// rstephane : get a random number between pre defined two markers uint8_t GetRndValue6() { uint8_t rndData; initRng(); while(RNG_GetFlagStatus(RNG_FLAG_DRDY)== RESET) { } /* Get a random number between 0 and 6 */ do { rndData = GetRngValue(); /* mask off the bottom 3 bits */ rndData = rndData & 0x00000007; } while (rndData == 6 || rndData == 7); return rndData; }
// rstephane : get a random number between pre defined two markers uint8_t GetRndValue127() { uint8_t rndData; initRng(); while(RNG_GetFlagStatus(RNG_FLAG_DRDY)== RESET) { } /* Get a random number between 0 and 15 */ do { rndData = GetRngValue(); /* mask off the bottom 7 bits 0 to 126 */ rndData = rndData & 0x0000007F; } while (rndData == 127); return rndData; }
/** * @Function u32 RNG_Get_RandomNum(void); * @Description Get_RandomNum * @Return u32 得到随机数 */ u32 RNG_Get_RandomNum(void) { while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==RESET); //等待随机数就绪 return RNG_GetRandomNumber(); }
/* This function runs before the OS start. */ void NetworkConnecting() { int i, p, test, test1; int sendcounter = 0; u32 *pu32 = NULL; test1 = Timer2Counter; test = Timer2Counter; sPacketbuf[DES_NUM] = SELFADDRESS; sPacketbuf[SRC_NUM] = SELFADDRESS; CC2500_SeleChannel(0); CC2500_SetRecvAddr(SELFADDRESS); CC2500_SetRxd(); CC2500_SendPacket(sPacketbuf,PACKET_LEN); CC2500_SetRxd(); sPacketbuf[DES_NUM]=0x00; NbrList[0]=NbrCount; // while(RESET==RNG_GetFlagStatus(RNG_FLAG_DRDY)); // Delay_100us(RNG_GetRandomNumber() & 0x000000f); pu32 = (u32*) &sPacketbuf[1]; while (0 == NodeFlag[SELFADDRESS]) { if (ISIDLE) { NbrList[0] = NbrCount; sPacketbuf[PRC_NUM] = DISCOVERY_MESSAGE; arm_copy_q7(NbrList, sPacketbuf+LEN_NUM, NbrList[0]+1); pu32[CRC_LENGTH - 2] = Timer2Counter;//Add the timestamp. CRC_ResetDR(); pu32[CRC_LENGTH - 1] = CRC_CalcBlockCRC(pu32, CRC_LENGTH - 1); p = Bernoulli(1.0/(MAXNUM-NbrCount+1)); //Delay_100us(1); if (ISIDLE) { if (0 == DelayFlag) { if (p/*Bernoulli(1.0/(MAXNUM-NbrCount+1))*/) { CC2500_SendPacket(sPacketbuf, PACKET_LEN); CC2500_SetRxd(); DelayFlag=1; } } else { Preemptive_Delay_100us(25, &DelayFlag); DelayFlag=0; } } } } test1 = Timer2Counter - test1; while(MAXNUM > NbrCount) { if (0 != DiscoveryHelp) { if (ISIDLE) { Delay_100us(1); if (ISIDLE) { if (Bernoulli(1.0/(MAXNUM-NbrCount+1))) { NbrList[0] = NbrCount; sPacketbuf[PRC_NUM] = DISCOVERY_MESSAGE; arm_copy_q7(NbrList, sPacketbuf+LEN_NUM, NbrList[0]+1); pu32[CRC_LENGTH - 2] = Timer2Counter;//Add the timestamp. CRC_ResetDR(); pu32[CRC_LENGTH - 1] = CRC_CalcBlockCRC(pu32, CRC_LENGTH - 1); CC2500_SendPacket(sPacketbuf, PACKET_LEN); CC2500_SetRxd(); } } } DiscoveryHelp = 0; } } test = Timer2Counter - test; while(RESET==RNG_GetFlagStatus(RNG_FLAG_DRDY)); Delay_100us(RNG_GetRandomNumber() & 0x000000f); pu32[CRC_LENGTH - 2] = Timer2Counter;//Add the timestamp. sendcounter = 3; while (0 != sendcounter) { if (ISIDLE) { Delay_100us(1); if (ISIDLE) { NbrList[0] = NbrCount; sPacketbuf[PRC_NUM] = DISCOVERY_ACCOMPLISHED; arm_copy_q7(NbrList, sPacketbuf+LEN_NUM, NbrList[0]+1); CRC_ResetDR(); pu32[CRC_LENGTH - 1] = CRC_CalcBlockCRC(pu32, CRC_LENGTH - 1); CC2500_SendPacket(sPacketbuf, PACKET_LEN); CC2500_SetRxd(); sendcounter--; } } Delay_100us(10); } printf("NeighbourList:\r\n"); for (i=0;i<MAXNUM;i++) { printf("%#x\r\n",NbrList[1+i]); } printf("t1 = %d\r\n", test1); printf("t = %d\r\n", test); }
uint32_t rng_get(void) { while(RNG_GetFlagStatus(RNG_FLAG_DRDY)== RESET); return RNG_GetRandomNumber(); }
/** * @brief Start recording * @param None * @retval None */ static void RECORDER_Start (void) { GL_PageControls_TypeDef* item; uint8_t time[6]; RTC_TimeTypeDef RTC_TimeStructure; RTC_DateTypeDef RTC_DateStructure; /*Create file name */ if ( RTC_Error == 0) { RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure); RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure); sprintf((char *)RecFileName, "Rec_%02d%02d%d%02d%02d%02d.wav", RTC_DateStructure.RTC_Date, RTC_DateStructure.RTC_Month, RTC_DateStructure.RTC_Year + 2000, RTC_TimeStructure.RTC_Hours, RTC_TimeStructure.RTC_Minutes, RTC_TimeStructure.RTC_Seconds); } else { /* Wait until one RNG number is ready */ while(RNG_GetFlagStatus(RNG_FLAG_DRDY)== RESET) { } RecoveryRecorderCounter = RNG_GetRandomNumber() & 0x7FFFFFFF; sprintf((char *)RecFileName, "Rec_%014d.wav", (int)RecoveryRecorderCounter); } RECORDER_GetDefaultDirectory(); strcat ((char *)REC_DefaultPath,"/"); strcat((char *)REC_DefaultPath, (char *)RecFileName); RefreshLabel(RecordPage , REC_FILNAME_ID, (uint8_t *)" "); if (AudioRecorder_Open(REC_DefaultPath)) { memset (RecFileName, 0, sizeof(RecFileName)); RefreshLabel(RecordPage , REC_FILNAME_ID, (uint8_t *)"Error Open File !"); return; } else { RefreshLabel(RecordPage , REC_FILNAME_ID, RecFileName); } /* Graphical update */ DestroyPageControl (RecordPage, REC_STRT_ID); RefreshPageControl(RecordPage, REC_STRT_ID); DestroyPageControl (RecordPage, REC_PLAY_ID); RefreshPageControl(RecordPage, REC_PLAY_ID); DestroyPageControl (RecordPage, REC_PAUSE_ID); RefreshPageControl(RecordPage, REC_PAUSE_ID); item = NewIcon (REC_STOP_ID, rec_stop_icon, 40, 40, RECORDER_Stop); AddPageControlObj(170,135,item, RecordPage); RefreshPageControl(RecordPage, REC_STOP_ID); item = NewIcon (REC_PAUSE_ID, rec_pause_icon, 40, 40, RECORDER_Pause); AddPageControlObj(110,135,item, RecordPage); RefreshPageControl(RecordPage, REC_PAUSE_ID); item = NewIcon (REC_CANCEL_ID, rec_cancel_icon, 40, 40, RECORDER_Cancel); AddPageControlObj(50,135,item, RecordPage); RefreshPageControl(RecordPage, REC_CANCEL_ID); sprintf((char *)time, "%02d:%02d", 0, 0); RefreshLabel(RecordPage, REC_TIME_ID, time); REC_GL_State = REC_GL_RECORDING; Recorder_UsedStorage = REC_DefaultPath[0]; AudioRecorder_Start(); }
/** * @brief Save the image frame into a file * @param Storage path * @param file_name * @retval Status 0 = Sucess, !0 :error */ static uint8_t Save_Bmp_To_File (uint8_t *path , uint8_t *file_name) { RTC_TimeTypeDef RTC_TimeStructure; RTC_DateTypeDef RTC_DateStructure; uint32_t i = 0 ,j = 0 , Index; FIL file; for ( i = 0 ; i < IMAGE_COLUMN_SIZE; i++) { for ( j= 0 ; j < 2 * IMAGE_LINE_SIZE; j++) { ImageBuffer.SrcData[j + (2 * IMAGE_LINE_SIZE * i)] = ImageBuffer.RawData[j + (2 * IMAGE_LINE_SIZE * ( IMAGE_COLUMN_SIZE- 1 - i))]; } } /* Convert RGB16 image to RGB24 */ RGB16toRGB24(ImageBuffer.DestData, ImageBuffer.SrcData, 1); /* Update file name */ strcpy((char *)ImageBuffer.ImageName , (char *)path), strcat ((char *)ImageBuffer.ImageName, "/"); if ( RTC_Error == 0) { RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure); RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure); sprintf((char *)file_name, "Camera_%02d%02d%d%02d%02d%02d.bmp", RTC_DateStructure.RTC_Date, RTC_DateStructure.RTC_Month, RTC_DateStructure.RTC_Year + 2000, RTC_TimeStructure.RTC_Hours, RTC_TimeStructure.RTC_Minutes, RTC_TimeStructure.RTC_Seconds); } else { /* Wait until one RNG number is ready */ while(RNG_GetFlagStatus(RNG_FLAG_DRDY)== RESET) { } RecoveryImageCounter = (uint32_t )(RNG_GetRandomNumber() & 0x7FFFFFFF) ; sprintf((char *)file_name, "Camera_%014d.bmp", (int)RecoveryImageCounter); } strcat ((char *)ImageBuffer.ImageName, (char *)file_name); /* Can not create file */ if (f_open(&file, (char *)ImageBuffer.ImageName, FA_CREATE_NEW | FA_WRITE) != FR_OK) { return 0; } /* Write the received data into the file */ if (f_write(&file, (char*)ImageBuffer.ImageHeader, RGB_HEADER_SIZE, (UINT*)&Index)) { f_close(&file); return 0; } if (f_write(&file, (char*)ImageBuffer.DestData, MAX_IMAGE_SIZE, (UINT*)&Index)) { f_close(&file); return 0; } /* Close file */ f_close(&file); return 1 ; }