查看: 7882|回复: 3

【系统初始化】SystemInit()函数注释

[复制链接]

7

主题

12

帖子

61

积分

中级工程师

Rank: 2

积分
61
发表于 2020-10-29 20:23:18 | 显示全部楼层 |阅读模式
使用魔方生成的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调试烧录管脚
}


回复

使用道具 举报

221

主题

397

帖子

3584

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3584
QQ
发表于 2020-10-30 11:29:09 | 显示全部楼层
系统初始化函数主要是对系统时钟进行配置,默认情况下主时钟选择为片上的RCHF 8MHz
如果想详细了解可以参考我们LC0系列的参考历程,您可以对照了解一下
回复

使用道具 举报

0

主题

1

帖子

24

积分

初级工程师

Rank: 1

积分
24
发表于 2021-11-1 23:57:10 | 显示全部楼层
SystemInit()函数 目前基本配置是8M的时钟系统,如果想修改成64M的时钟,这块应该怎么进行修改?有没有什么参考例程?
回复

使用道具 举报

155

主题

847

帖子

4701

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4701
发表于 2021-11-2 08:38:12 | 显示全部楼层
xiaoxiaoyuwu 发表于 2021-11-1 23:57
SystemInit()函数 目前基本配置是8M的时钟系统,如果想修改成64M的时钟,这块应该怎么进行修改?有没有什么 ...

请参考 pll_selrchf 例程, 我们不推荐在系统初始化里修改。可能导致一些不可知问题。原先系统初始化不加注释就是不想用户乱改。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表