Přeskočit na hlavní obsah

Modul MCAL RNG

Podporované rodiny STM32: U5
Nepodporované: G4, H5, H7, L4

Tento modul poskytuje abstrakci pro ovládání hardwarového generátoru náhodných čísel (RNG) a získávání dat z něj.
Nabízí funkce pro inicializaci, konfiguraci, řízení běhu, zpracování chyb a čtení dat.


Veřejné typy​

Typy verzí​

  • rng_MajorVersion_t – číslo hlavní verze (uint8_t).
  • rng_MinorVersion_t – číslo vedlejší verze (uint8_t).
  • rng_PatchVersion_t – číslo patch verze (uint8_t).
  • rng_ModuleVersion_t – struktura obsahující { Major, Minor, Patch }.

Typy stavů​

  • rng_FunctionState_t – stav funkce aktivní/neaktivní.
  • rng_FlagState_t – obecný stav příznaku.
  • rng_RequestState_t – výsledek zpracování požadavku (RNG_REQUEST_OK / RNG_REQUEST_ERROR).

Typy pro identifikaci a konfiguraci​

  • rng_PeriphId_t – identifikátor periferie (např. RNG_PERIPH_1).
  • rng_ClkSource_t – výběr zdroje hodin RNG.
  • rng_ClkDivider_t – výběr děličky hodin RNG.
  • rng_ConfigSelection_t – konfigurace režimu RNG (např. NIST, AIS_31_SPEED, AIS_31_ENTROPY).
  • rng_Error_t – maska chyb (např. SEED_ERR, CLOCK_ERR).
  • rng_TransferStyle_t – styl přenosu dat (žádný, blokující, přerušení).

Datové typy​

  • rng_RandomData_t – kontejner pro výstup náhodných dat (uint32_t value[RNG_FIFO_LEN]).
  • rng_IrqPrio_t – typ priority přerušení.
  • rng_DataRdyCallback_t – typ callbacku pro připravená data.
  • rng_ErrCallback_t – typ callbacku pro chybu.

Konfigurační struktura​

  • rng_ConfigStruct_t – sdružuje všechna konfigurační pole periferie:
    • PeriphId
    • ClkSource
    • ConfigSelection
    • TransferStyle
    • IrqPrio
    • DataRdyCallback
    • ErrorCallback

Veřejné API​

Informace o modulu​

rng_ModuleVersion_t Rng_Get_ModuleVersion(void);

Inicializace​

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);

Řízení běhu​

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);

Přístup k datům​

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);

Konfigurace​

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);

Zpracování chyb​

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);

Správa 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);

Obsluha přerušení​

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);

🛠 Integrace s CMake​

  1. Zahrňte Rng_Lib do své knihovny CMake.
  2. Zahrňte Rng_Port.h do svého projektu.
  3. Prolinkujte implementační soubory modulu Rng.
  4. Nakonfigurujte modul podle potřeb vašeho hardwaru.

Licence​

Tento projekt je licencován pod licencí Creative Commons Uveďte původ–Neužívejte komerčně 4.0 Mezinárodní (CC BY-NC 4.0).

Toto dílo můžete volně používat, upravovat a sdílet pro nekomerční účely za předpokladu, že uvedete odpovídající autorství.

Úplné podmínky najdete v LICENSE.md nebo navštivte creativecommons.org/licenses/by-nc/4.0.


Autoři​

Příspěvky jsou vítány! Otevřete prosím pull request.