Перейти до основного вмісту

Модуль RNG MCAL

Підтримувані родини STM32: U5
Не підтримуються: G4, H5, H7, L4

Цей модуль надає абстракцію для керування апаратним генератором випадкових чисел (Random Number Generator, RNG) та отримання з нього даних.
Він пропонує функціональність ініціалізації, конфігурації, керування виконанням, обробки помилок і отримання даних.


Публічні типи​

Типи версій​

  • rng_MajorVersion_t – номер мажорної версії (uint8_t).
  • rng_MinorVersion_t – номер мінорної версії (uint8_t).
  • rng_PatchVersion_t – номер версії патча (uint8_t).
  • rng_ModuleVersion_t – структура, що містить { Major, Minor, Patch }.

Типи стану та статусу​

  • rng_FunctionState_t – стан функції: активна/неактивна.
  • rng_FlagState_t – загальний стан прапорця.
  • rng_RequestState_t – результат обробки запиту (RNG_REQUEST_OK / RNG_REQUEST_ERROR).

Типи ідентифікації та конфігурації​

  • rng_PeriphId_t – ідентифікатор периферії (наприклад, RNG_PERIPH_1).
  • rng_ClkSource_t – вибір джерела тактування RNG.
  • rng_ClkDivider_t – вибір дільника тактування RNG.
  • rng_ConfigSelection_t – конфігурація режиму RNG (наприклад, NIST, AIS_31_SPEED, AIS_31_ENTROPY).
  • rng_Error_t – маска помилок (наприклад, SEED_ERR, CLOCK_ERR).
  • rng_TransferStyle_t – стиль передачі даних (немає, блокуюча, через переривання).

Типи даних​

  • rng_RandomData_t – контейнер вихідних випадкових даних (uint32_t value[RNG_FIFO_LEN]).
  • rng_IrqPrio_t – тип пріоритету IRQ.
  • rng_DataRdyCallback_t – тип callback-а готовності даних.
  • rng_ErrCallback_t – тип callback-а помилки.

Структура конфігурації​

  • rng_ConfigStruct_t – об'єднує всі поля конфігурації периферії:
    • PeriphId
    • ClkSource
    • ConfigSelection
    • TransferStyle
    • IrqPrio
    • DataRdyCallback
    • ErrorCallback

Публічний API​

Інформація про модуль​

rng_ModuleVersion_t Rng_Get_ModuleVersion(void);

Ініціалізація​

rng_RequestState_t Rng_Init(rng_ConfigStruct_t * const rngConfig);
rng_RequestState_t Rng_Deinit(rng_ConfigStruct_t * const rngConfig);
void Rng_Task(void);
rng_RequestState_t Rng_Get_DefaultConfig(rng_ConfigStruct_t *rngConfig);

Керування виконанням​

rng_RequestState_t Rng_Set_ExecActive(rng_PeriphId_t rngId);
rng_RequestState_t Rng_Set_ExecInactive(rng_PeriphId_t rngId);
rng_RequestState_t Rng_Get_ExecState(rng_PeriphId_t rngId, rng_FunctionState_t * const state);

rng_RequestState_t Rng_Set_ExecPauseActive(rng_PeriphId_t rngId);
rng_RequestState_t Rng_Set_ExecPauseInactive(rng_PeriphId_t rngId);
rng_RequestState_t Rng_Get_ExecPauseState(rng_PeriphId_t rngId, rng_FunctionState_t * const state);

Доступ до даних​

rng_RequestState_t Rng_Get_Data(rng_PeriphId_t rngId, rng_RandomData_t * const data);
rng_RequestState_t Rng_Get_DataReadyState(rng_PeriphId_t rngId, rng_FunctionState_t * const state);

Конфігурація​

rng_RequestState_t Rng_Set_Configuration(rng_PeriphId_t rngId, rng_ConfigSelection_t configSelection);
rng_RequestState_t Rng_Get_Configuration(rng_PeriphId_t rngId, rng_ConfigSelection_t * const configSelection);

rng_RequestState_t Rng_Set_ClkSource(rng_PeriphId_t rngId, rng_ClkSource_t clkSource);

rng_RequestState_t Rng_Set_ClkDivider(rng_PeriphId_t rngId, rng_ClkDivider_t clkDivider);
rng_RequestState_t Rng_Get_ClkDivider(rng_PeriphId_t rngId, rng_ClkDivider_t * const clkDivider);

Обробка помилок​

rng_RequestState_t Rng_Get_Error(rng_PeriphId_t rngId, rng_Error_t * const errMask);
rng_RequestState_t Rng_Clear_Error(rng_PeriphId_t rngId, rng_Error_t errMask);

rng_RequestState_t Rng_Set_ClockErrorDetectActive(rng_PeriphId_t rngId);
rng_RequestState_t Rng_Set_ClockErrorDetectInactive(rng_PeriphId_t rngId);
rng_RequestState_t Rng_Get_ClockErrorDetectState(rng_PeriphId_t rngId, rng_FunctionState_t * const state);

rng_RequestState_t Rng_Set_AutoResetActive(rng_PeriphId_t rngId);
rng_RequestState_t Rng_Set_AutoResetInactive(rng_PeriphId_t rngId);
rng_RequestState_t Rng_Get_AutoResetState(rng_PeriphId_t rngId, rng_FunctionState_t * const reqState);

Обробка callback-ів​

rng_RequestState_t Rng_Set_DataRdyCallback(rng_PeriphId_t rngId, rng_DataRdyCallback_t * const callback);
rng_RequestState_t Rng_Get_DataRdyCallback(rng_PeriphId_t rngId, rng_DataRdyCallback_t ** const callback);

rng_RequestState_t Rng_Set_ErrorCallback(rng_PeriphId_t rngId, rng_ErrCallback_t * const callback);
rng_RequestState_t Rng_Get_ErrorCallback(rng_PeriphId_t rngId, rng_ErrCallback_t ** const callback);

Обробка переривань​

rng_RequestState_t Rng_Set_IrqActive(rng_PeriphId_t rngId);
rng_RequestState_t Rng_Set_IrqInactive(rng_PeriphId_t rngId);
rng_RequestState_t Rng_Get_IrqState(rng_PeriphId_t rngId, rng_FunctionState_t * const reqState);

rng_RequestState_t Rng_Set_IrqPriority(rng_PeriphId_t rngId, rng_IrqPrio_t irqPrio);
rng_RequestState_t Rng_Get_IrqPriority(rng_PeriphId_t rngId, rng_IrqPrio_t * const irqPrio);

🛠 Інтеграція з CMake​

  1. Додайте Rng_Lib до вашої CMake-бібліотеки.
  2. Підключіть Rng_Port.h у вашому проєкті.
  3. Злінкуйте з файлами реалізації модуля Rng.
  4. Налаштуйте модуль відповідно до вашого апаратного забезпечення.

Ліцензія​

Цей проєкт ліцензовано за Creative Commons Attribution–NonCommercial 4.0 International (CC BY-NC 4.0).

Ви вільні використовувати, змінювати та поширювати цю роботу в некомерційних цілях за умови належного зазначення авторства.

Повні умови дивіться у LICENSE.md або на creativecommons.org/licenses/by-nc/4.0.


Автори​

Внески вітаються! Будь ласка, відкрийте pull request.