Генерируем случайные числа на STM32 контроллере

В наше время ни для кого не секрет, что в современных контроллерах есть возможность генерировать случайные числа. Причём эта возможность заложена в устройства в виде отдельного «железного» блока.
Исключением не есть и 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 функции для работы описаны тут.

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий