В наше время ни для кого не секрет, что в современных контроллерах есть возможность генерировать случайные числа. Причём эта возможность заложена в устройства в виде отдельного «железного» блока.
Исключением не есть и STM32 контроллеры.
Я же расскажу о том как написать программу для этого семейства микроконтроллеров для получения 32битного случайного числа.
В стандартной периферийной библиотеке от STM32 (SPL) модуль для работы со случайными числами назвали RNG — Random Number Generator.
Ниже пример программы, которая при нажатии по клавише платы stm32f4-discovery генерирует прерывание, в котором происходит генерация и вывод числа на lcd экран.
Инклуды пропущу…
Функция настройки прерывания по PA.0 :
void init_it() { EXTI_InitTypeDef EXTI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_Init(GPIOA, &GPIO_InitStructure); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
Если что-то не ясно идём суда.
Обработчик прерывания имеет вид:
void EXTI0_IRQHandler() { if (EXTI_GetITStatus(EXTI_Line0) != RESET) { STM_EVAL_LEDToggle(LED3); // сигнализируем о прерывании while(RNG_GetFlagStatus(RNG_FLAG_DRDY) == RESET) // ждём окончания работы генератора { } uint32_t random32bit = 0; random32bit = RNG_GetRandomNumber(); // получаем случайное число lcd_set_cursor(0,0); // устанавливаем курсор в начало lcd_write_dec_xxxx(random32bit); // выводим число EXTI_ClearITPendingBit(EXTI_Line0); }
Оговорочка: Число получается 32 битное. Т.е. 2^32 = 4294967296. Я вывожу его при помощи функции вывода 4ёх значного числа. Цифры на экране будут полной билибердой, но они тоже случайные)) Так что как сигнализатор результата вполне подходит!
Теперь перейдём к телу функции main.
Сначала включаем тактирование модуля:
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE); // Теперь запускаем его работу: RNG_Cmd(ENABLE);
Запускаем функцию настройки прерывания:
init_it();
Теперь инициализируем дисплей:
lcd_init();
2 светодиода:
STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4);
В бесконечном цикле с задержкой мигаем диодом:
while (1){ STM_EVAL_LEDToggle(LED4); delay(0xffffff); }
Вот и всё 😉
PS. Дисплей у меня WH1602b функции для работы описаны тут.