HC32 HC32A448创建真随机数

启用TRNG DLL

c 复制代码
hc32a4xx_conf.h

#define LL_TRNG_ENABLE                              (DDL_ON)

初始化TRNG

c 复制代码
void MCU_TRNG_init(void)
{
	/* 开启TRNG功能 */
    FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_TRNG, ENABLE);
    /* TRNG初始化 */
    TRNG_Init(TRNG_SHIFT_CNT64, TRNG_RELOAD_INIT_VAL_ENABLE);
    TRNG_Cmd(ENABLE);
	
	/* 开启TRNG中断 */
	NVIC_ClearPendingIRQ(TRNG_IRQn);
    NVIC_SetPriority(TRNG_IRQn, DDL_IRQ_PRIO_15);
    NVIC_EnableIRQ(TRNG_IRQn);
}

TRNG中断

c 复制代码
void TRNG_Handler(void)
{
    (void)TRNG_GetRandom(MCU_TRNG_au32Random, 2U);
	printf(6, 0, "[TRNG] 0x%x, 0x%x\r\n",
		(unsigned int)MCU_TRNG_au32Random[0U], 
		(unsigned int)MCU_TRNG_au32Random[1U]
	);
    __DSB();
}

主函数

c 复制代码
int32_t main(void)
{
    /* Register write unprotected for some required peripherals. */
    LL_PERIPH_WE(LL_PERIPH_GPIO | LL_PERIPH_ALL | LL_PERIPH_PWC_CLK_RMU);
    //Clock Config
    MCU_App_ClkCfg();
    //Port Config
    App_PortCfg();
    /* Register write protected for some required peripherals. */
	// 初始化随机数
	MCU_TRNG_init();
    LL_PERIPH_WP(LL_PERIPH_GPIO | LL_PERIPH_ALL | LL_PERIPH_PWC_CLK_RMU);
	
    while(1) {
		DDL_DelayMS(1000);
        // 启动生成随机数
		TRNG_Start();
		DDL_DelayMS(1000);
        // 启动生成随机数
		TRNG_Start();
    }
}

程序执行效果

相关推荐
Weird0_1 年前
华大HC32F460移植FreeRTOS
freertos·hc32