|
使用魔方生成的fm33lc023n示例代码,对SystemInit函数进行学习和注释,看这样理解是否有问题。
SystemInit()主要功能:
(1)关闭PLL
(2)默认时钟选择RCHF, 8MHz
(3)启用低频的外部晶振XTLF,并启用XTLF停振时自动切换为LPOSC
(4)从flash读取时钟的校准值并写入相应寄存器。
SystemInit()具体注释:
void SystemInit (void)
{
uint32_t temp;
/* */
RCC->PLLCR = (uint32_t)0x00000000U; //关闭PLL
RCC->SYSCLKCR = (uint32_t)0x0A000000U;
//XTLF停振,开启LSCLK自动切换;
//在sleep/deep sleep模式开启外部引脚中断采样;
//APB2时钟不分频
//APB1时钟不分频
//AHB时钟不分频
//RFU = 0
//USB输出时钟选择48M
//SYSCLKSEL = 000,选择RCHF作为系统时钟
/* PAD RCC*/
RCC->PCLKCR1 |= (0x1U << 7U); //PADCFG总线时钟使能
#ifdef USE_LSCLK_CLOCK_SRC_XTLF //如果宏定义需启用XTLF
GPIOD->FCR |= 0x3C0000; //PD10/PD9作为模拟管脚,连接32.768KHz的晶振
/* XTLF*/
RCC->XTLFCR = (uint32_t)(0x00000000U); //先清除XTLFCR寄存器设置
/* XTLF*/
RCC->XTLFCR |= (uint32_t)(0x00000005U<<8); //使能XTLF和FDET
for(temp = 2000;temp>0;temp--); //等待XTLF起振
/* LSCLKXTLF*/
RCC->LSCLKSEL = 0xAA; //将LSCLK源头切换为XTLF
/* LSCXTLF*/
RCC->SYSCLKCR |= 0x8000000U; //当XTLF异常停振时,自动使能LPOSC并将LSCLK切换到LPOSC
#else
RCC->SYSCLKCR &= 0x7FFFFFFU;
RCC->LSCLKSEL = 0x55;
#endif
/*PDR*/
RMU->PDRCR |=0x01; //下电复位使能
/*BOR*/
RMU->BORCR &=0xFE; //使能BOR下电复位
/* DEBUG IWDT WWDT */
DBG->CR =0x03; //Debug时关闭GPTIM1和GPTIM0
RCC->RCMFTR = RCMF4M_TRIM; //写入RCMF校准值
RCC->LPOSCTR = LPOSC_TRIM; //写入LPOSCTR校准值
GPIOD->PUEN |= 0x3 << 7; //PD7和PD8上拉使能,SW调试烧录管脚
}
|
|