zoukankan      html  css  js  c++  java
  • STM32 GD32 时钟设置

    以GD32E230为例。

    启动文件:startup_gd32e230x.s 中的代码:

    系统初始化代码:

    void SystemInit (void)
    {
        /* enable IRC8M */
        RCU_CTL0 |= RCU_CTL0_IRC8MEN;
        while(0U == (RCU_CTL0 & RCU_CTL0_IRC8MSTB)){
        }
        /* reset RCU */
        RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC |
                      RCU_CFG0_ADCPSC | RCU_CFG0_CKOUTSEL | RCU_CFG0_CKOUTDIV | RCU_CFG0_PLLDV);
        RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PLLMF | RCU_CFG0_PLLMF4 | RCU_CFG0_PLLDV);
        RCU_CTL0 &= ~(RCU_CTL0_HXTALEN | RCU_CTL0_CKMEN | RCU_CTL0_PLLEN | RCU_CTL0_HXTALBPS);
        RCU_CFG1 &= ~(RCU_CFG1_PREDV);
        RCU_CFG2 &= ~(RCU_CFG2_USART0SEL | RCU_CFG2_ADCSEL);
        RCU_CFG2 &= ~RCU_CFG2_IRC28MDIV;
        RCU_CFG2 &= ~RCU_CFG2_ADCPSC2;
        RCU_CTL1 &= ~RCU_CTL1_IRC28MEN;
        RCU_INT = 0x00000000U;
    
        /* configure system clock */
        system_clock_config();
        
    #ifdef VECT_TAB_SRAM
        nvic_vector_table_set(NVIC_VECTTAB_RAM,VECT_TAB_OFFSET);
    #else
        nvic_vector_table_set(NVIC_VECTTAB_FLASH,VECT_TAB_OFFSET);
    #endif
    }

    系统时钟配置函数:

    static void system_clock_config(void)
    {
    #ifdef __SYSTEM_CLOCK_8M_HXTAL
        system_clock_8m_hxtal();
    #elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL)        
        system_clock_72m_hxtal();
    #elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M_DIV2)
        system_clock_72m_irc8m();
    #elif defined (__SYSTEM_CLOCK_72M_PLL_IRC48M_DIV2)
        system_clock_72m_irc48m();
    #else
        system_clock_8m_irc8m();
    #endif /* __SYSTEM_CLOCK_8M_HXTAL */
    }
    

      根据不同的时钟源宏定义(选择不同的时钟源及频率),调用不同的函数,以选择system_clock_72m_hxtal()为例:

    static void system_clock_72m_hxtal(void)
    {
        uint32_t timeout = 0U;
        uint32_t stab_flag = 0U;
    
        /* enable HXTAL */
        RCU_CTL0 |= RCU_CTL0_HXTALEN;
    
        /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */
        do{
            timeout++;
            stab_flag = (RCU_CTL0 & RCU_CTL0_HXTALSTB);
        }
        while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout));
        /* if fail */
        if(0U == (RCU_CTL0 & RCU_CTL0_HXTALSTB)){
            while(1){
            }
        }
        
        FMC_WS = (FMC_WS & (~FMC_WS_WSCNT)) | WS_WSCNT_2;   // WFY增加2个等待状态
        
        /* HXTAL is stable */
        /* AHB = SYSCLK */
        RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;
        /* APB2 = AHB */
        RCU_CFG0 |= RCU_APB2_CKAHB_DIV1;
        /* APB1 = AHB */
        RCU_CFG0 |= RCU_APB1_CKAHB_DIV1;
    
        /* PLL = HXTAL * 9 = 72 MHz *   8MHz /    
        RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PLLMF | RCU_CFG0_PLLDV);
        RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL9);
        
    //    /* PLL = HXTAL * 6 = 72 MHz   9MHz  */
    //    RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PLLMF | RCU_CFG0_PLLDV);
    //    RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL6);
        
    
        /* enable PLL */
        RCU_CTL0 |= RCU_CTL0_PLLEN;
    
        /* wait until PLL is stable */
        while(0U == (RCU_CTL0 & RCU_CTL0_PLLSTB)){
        }
    
        /* select PLL as system clock */
        RCU_CFG0 &= ~RCU_CFG0_SCS;
        RCU_CFG0 |= RCU_CKSYSSRC_PLL;
    
        /* wait until PLL is selected as system clock */
        while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){
        }
    }
    

     函数选择的是 :HXTAL =8MH.

    如果XHTAL用12MHz , 需要修改3处:

    1、定义宏 , 使用12Mhz

    2、修改代码

        /* PLL = HXTAL * 6 = 72 MHz   AAA */
        RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PLLMF | RCU_CFG0_PLLDV);
        RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL6);

    3、修改文件gd32e23x.h

    HXTAL_VALUE 为12000000

  • 相关阅读:
    后渗透
    Msf小结
    安全狗文件绕过
    文件上传漏洞
    SQL Injection(Blind)
    SQL Injection
    Linux 基础整理
    Python pip升级及升级失败解决方案
    文件包含
    信息收集
  • 原文地址:https://www.cnblogs.com/wfy680/p/14635743.html
Copyright © 2011-2022 走看看