APP RNG驱动
结构体
app_rng_params_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
app_rng_type_t use_type |
设置RNG运行模式 |
该参数的取值可以是下列值中的任意一个:
|
rng_init_t init |
设置RNG初始化参数 |
参考rng_init_t结构体 |
rng_env_t rng_env |
仅用于记录初始化设备的句柄、相关参数和信号量等,不需要配置 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_rng.h。
app_rng_evt_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
app_rng_evt_type_t type |
事件的类型 |
该参数的取值可以是下列值中的任意一个:
|
uint32_t random_data |
生成的随机数 |
该参数为中断运行模式下生成的随机数 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_rng.h。
rng_init_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
uint32_t seed_mode |
产生随机数提供种子的方式 |
该参数的取值可以是下列值中的任意一个:
|
uint32_t lfsr_mode |
LFSR模式 |
该参数的取值可以是下列值中的任意一个:
|
uint32_t out_mode |
输出方式 |
该参数的取值可以是下列值中的任意一个:
|
uint32_t post_mode |
后处理模式 |
该参数的取值可以是下列值中的任意一个:
|
- GR551x/GR5526/GR5x25:SDK_Folder\drivers\inc\hal\gr55xx_hal_rng.h
- GR533x:SDK_Folder\drivers\inc\hal\gr533x_hal_rng.h
- GR5405:SDK_Folder\hal_drv\include\hal_rng.h
枚举
app_rng_type_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
APP_RNG_TYPE_INTERRUPT |
中断运行模式 |
APP_RNG_TYPE_POLLING |
轮询运行模式 |
APP_RNG_TYPE_MAX |
参数检查使用,不能作为入参 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_rng.h。
app_rng_evt_type_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
APP_RNG_EVT_DONE |
随机数生成完成事件标志 |
APP_RNG_EVT_ERROR |
随机数生成出错事件标志 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_rng.h。
app_rng_state_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
| APP_RNG_INVALID = 0 | RNG不可用 |
| APP_RNG_ACTIVITY = 1 | RNG激活 |
| APP_RNG_SLEEP = 2 | RNG睡眠 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_rng.h。
接口函数
| API | 芯片 | ||||
|---|---|---|---|---|---|
| GR551x | GR5526 | GR5x25 | GR533x | GR5405 | |
| app_rng_init |
Y |
Y |
Y |
Y |
Y |
| app_rng_deinit |
Y |
Y |
Y |
Y |
Y |
| app_rng_gen_sync |
Y |
Y |
Y |
Y |
Y |
| app_rng_gen_async |
Y |
Y |
Y |
Y |
Y |
| app_rng_get_handle |
Y |
Y |
Y |
Y |
Y |
app_rng_init
| 函数原型 | uint16_t app_rng_init(app_rng_params_t *p_params, app_rng_evt_handler_t evt_handler); |
|---|---|
| 功能说明 | 根据初始化参数初始化RNG模块 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 回调函数形式参照typedef void (*app_rng_evt_handler_t)(app_rng_evt_t *p_evt); HAL层已经实现中断标志位的清理,用户不用关心中断标志的清理。 |
app_rng_deinit
| 函数原型 | uint16_t app_rng_deinit(void); |
|---|---|
| 功能说明 | 反初始化RNG模块 |
| 输入参数 | |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_rng_gen_sync
| 函数原型 | uint16_t app_rng_gen_sync(uint16_t *p_seed, uint32_t *p_random32bit); |
|---|---|
| 功能说明 | 同步(轮询)模式产生随机数 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | p_seed仅在配置为RNG_SEED_USER才生效,若采用59-bit模式则需要提供64-bit种子,若采用128-bit模式则需要提供128-bit种子;当配置为RNG_SEED_FR0_S0时,p_seed可传入NULL |
app_rng_gen_async
| 函数原型 | uint16_t app_rng_gen_async(uint16_t *p_seed); |
|---|---|
| 功能说明 | 异步(中断)模式产生随机数 |
| 输入参数 | p_seed:用户指定种子 |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | p_seed仅在配置为RNG_SEED_USER才生效,若采用59-bit模式则需要提供64-bit种子,若采用128-bit模式则需要提供128-bit种子;当配置为RNG_SEED_FR0_S0时,p_seed可传入NULL |
app_rng_get_handle
| 函数原型 | rng_handle_t *app_rng_get_handle(void); |
|---|---|
| 功能说明 | 获取RNG句柄 |
| 输入参数 | |
| 返回值 |
RNG句柄,详见:
|
| 备注 |
示例工程
RNG
采用用户提供的种子和环形振荡器产生的种子生成随机数,工程路径:SDK_Folder\projects\peripheral\rng\app_rng。
流程图
示例工程采用了两种种子,且通过中断和轮询两种方式生成随机数。下面只以轮询方式进行说明,中断方式查看示例工程。
使用用户提供的种子生成随机数
app_rng_params_t rng_polling_params = {
.use_type = APP_RNG_TYPE_POLLING,
.init = {
.seed_mode = RNG_SEED_USER,
.lfsr_mode = RNG_LFSR_MODE_59BIT,
.out_mode = RNG_OUTPUT_LFSR,
.post_mode = RNG_POST_PRO_NOT,
},
};
- use_type:传输方式选择APP_RNG_TYPE_POLLING(轮询)
- init.seed_mode:种子源选择RNG_SEED_USER(用户提供)
- init.lfsr_mode:LFSR模式选择RNG_LFSR_MODE_59BIT
- init.out_mode:输出模式选择RNG_OUTPUT_LFSR(LFSR直接输出)
- init.post_mode:后处理选择RNG_POST_PRO_NOT(不进行后处理)
使用环形振荡器产生的种子生成随机数
rng_polling_params.init.seed_mode = RNG_SEED_FR0_S0;
rng_polling_params.init.out_mode = RNG_OUTPUT_FR0_S0;
- init.seed_mode:种子源选择RNG_SEED_FR0_S0(环形振荡器S0提供的种子)
- init.out_mode:输出模式选择RNG_OUTPUT_FR0_S0(环形振荡器直接输出)
重要函数
- 初始化RNG
app_rng_init (&rng_polling_params, NULL) - 同步生成随机数
app_rng_gen_sync(g_random_seed, &random_number)- g_random_seed:随机种子(使用环形振荡器产生的种子,此参数可传入NULL)。
- random_number:生成的随机数。
- 异步生成随机数
app_rng_gen_async(g_random_seed)g_random_seed:随机种子(使用环形振荡器产生的种子,此参数可传入NULL)。
测试验证
连接开发板到PC端,打开串口,串口将打印生成的随机数。