首页 > 其他分享 >更改晶振后如何修改配置

更改晶振后如何修改配置

时间:2024-06-08 13:32:27浏览次数:21  
标签:更改 RCU 晶振后 uint32 修改 CTL PLL CFG0 HXTAL

GD32官方提供的固件库中使用的晶振配置一般为8M或25M,如果读者使用其他频率的晶振如何修改配置呢?本文为大家讲解如何修改。

以GD32F303为例,官方固件库中的晶振及时钟配置代码如下,改配置代码为使用外部8M晶振倍频到120M时钟。

C
/* use HXTAL(XD series CK_HXTAL = 8M, CL series CK_HXTAL = 25M) */
//#define __SYSTEM_CLOCK_HXTAL                    (uint32_t)(__HXTAL)
//#define __SYSTEM_CLOCK_48M_PLL_HXTAL            (uint32_t)(48000000)
//#define __SYSTEM_CLOCK_72M_PLL_HXTAL            (uint32_t)(72000000)
//#define __SYSTEM_CLOCK_108M_PLL_HXTAL           (uint32_t)(108000000)
#define __SYSTEM_CLOCK_120M_PLL_HXTAL           (uint32_t)(120000000)

#if !defined  HXTAL_VALUE
#ifdef GD32F30X_CL
#define HXTAL_VALUE    ((uint32_t)25000000) /*!< value of the external oscillator in Hz */
#else
#define HXTAL_VALUE    ((uint32_t)8000000) /* !< from 4M to 32M *!< value of the external oscillator in Hz*/
#endif /* HXTAL_VALUE */
#endif /* high speed crystal oscillator value */

static void system_clock_120m_hxtal(void)
{
    uint32_t timeout = 0U;
    uint32_t stab_flag = 0U;

    /* enable HXTAL */
    RCU_CTL |= RCU_CTL_HXTALEN;

    /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */
    do{
        timeout++;
        stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB);
    }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout));

    /* if fail */
    if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){
        while(1){
        }
    }

    RCU_APB1EN |= RCU_APB1EN_PMUEN;
    PMU_CTL |= PMU_CTL_LDOVS;

    /* HXTAL is stable */
    /* AHB = SYSCLK */
    RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;
    /* APB2 = AHB/1 */
    RCU_CFG0 |= RCU_APB2_CKAHB_DIV1;
    /* APB1 = AHB/2 */
    RCU_CFG0 |= RCU_APB1_CKAHB_DIV2;

#if (defined(GD32F30X_HD) || defined(GD32F30X_XD))
    /* select HXTAL/2 as clock source */
    RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0);
    RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_CFG0_PREDV0);

    /* CK_PLL = (CK_HXTAL/2) * 30 = 120 MHz */
    RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5);
    RCU_CFG0 |= RCU_PLL_MUL30;

#elif defined(GD32F30X_CL)
    /* CK_PLL = (CK_PREDIV0) * 30 = 120 MHz */
    RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5);
    RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_PLL_MUL30);

    /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */
    RCU_CFG1 &= ~(RCU_CFG1_PLLPRESEL | RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0);
    RCU_CFG1 |= (RCU_PLLPRESRC_HXTAL | RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10);

    /* enable PLL1 */
    RCU_CTL |= RCU_CTL_PLL1EN;
    /* wait till PLL1 is ready */
    while((RCU_CTL & RCU_CTL_PLL1STB) == 0U){
    }
#endif /* GD32F30X_HD and GD32F30X_XD */

    /* enable PLL */
    RCU_CTL |= RCU_CTL_PLLEN;

    /* wait until PLL is stable */
    while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){
    }

    /* enable the high-drive to extend the clock frequency to 120 MHz */
    PMU_CTL |= PMU_CTL_HDEN;
    while(0U == (PMU_CS & PMU_CS_HDRF)){
    }

    /* select the high-drive mode */
    PMU_CTL |= PMU_CTL_HDS;
    while(0U == (PMU_CS & PMU_CS_HDSRF)){
    }

    /* 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)){
    }
}

在此我们举例,若外部晶振使用16M该如何配置,主要修改以下两点:

1、修改HXTAL_VALUE为16M,如下红色底纹部分。

C
#if !defined  HXTAL_VALUE
#ifdef GD32F30X_CL
#define HXTAL_VALUE    ((uint32_t)25000000) /*!< value of the external oscillator in Hz */
#else
#define HXTAL_VALUE    ((uint32_t)16000000) /* !< from 4M to 32M *!< value of the external oscillator in Hz*/
#endif /* HXTAL_VALUE */
#endif /* high speed crystal oscillator value */

2、修改时钟倍频到120M.如下图红色底纹部分,配置15倍频,计算公式为16M/2*15=120M.

C
    /* select HXTAL/2 as clock source */
    RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0);
    RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_CFG0_PREDV0);

    /* CK_PLL = (CK_HXTAL/2) * 15 = 120 MHz */
    RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5);
    RCU_CFG0 |= RCU_PLL_MUL15;

 PS:GD固件库中修改使用内部时钟非常方便,只要打开内部时钟的宏定义就可以啦。

C
/* select a system clock by uncommenting the following line */
/* use IRC8M */
//#define __SYSTEM_CLOCK_IRC8M                    (uint32_t)(__IRC8M) 
//#define __SYSTEM_CLOCK_48M_PLL_IRC8M            (uint32_t)(48000000)
//#define __SYSTEM_CLOCK_72M_PLL_IRC8M            (uint32_t)(72000000)
//#define __SYSTEM_CLOCK_108M_PLL_IRC8M           (uint32_t)(108000000)
//#define __SYSTEM_CLOCK_120M_PLL_IRC8M           (uint32_t)(120000000)

 GD32MCU技术交流群:859440462

更多GD32 MCU相关咨询:单片机开发板_国产mcu视频_GD32 - 苏州聚沃电子科技有限公司

标签:更改,RCU,晶振后,uint32,修改,CTL,PLL,CFG0,HXTAL
From: https://blog.csdn.net/weixin_45254847/article/details/139525166

相关文章

  • 转载:Virtuoso中通过cdsini文件修改初始设置
    转自:Virtuoso中通过cdsini文件修改初始设置-Analog/RFIC资料共享-EETOP创芯网论坛(原名:电子顶级开发网)-virtuoso的很多初始设置一点都不人性化,每次修改太费功夫,可以通过cdsini文件修改,每次启动virtuoso都会自动执行。首先找到Virtuoso启动目录,在其中编辑或新建.cdsini......
  • Django 里的表格内容做修改
    当Django里表格内容需要做修改,可以这么操作。先看效果图修改后的表格1.先得在asset_list.html里修改。你们的html有可能跟我不一样<tableborder="1px"><thead><tr><th>ID</th><th>标题</th><th>价格......
  • Java使用poi导出excel折线图--以三温层车辆运输单据温度为例(含如何更改各标题大小)
    maven依赖引入<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> ......
  • MainWindows移动View文件夹和使用Window.DataContext单例绑定需要修改的地方
    项目结构移动文件夹后需要修改的三个地方1、App.xaml2、MainWindow.xaml3、MainWindow.xaml.cs单例绑定需要修改的地方MainWindow.xaml ......
  • 基于修改iOS内核绕过iOS 基于svc 0x80的ptrace反调试
    yuzhouheike62天 看到一个帖子:[原创]绕过iOS基于svc0x80的ptrace反调试24.跟着操作了下.这篇文章的核心思想来源于[原创]iOS内核修改之过某音等PT_DENY_ATTACH反动态ptrace调试我的设备是:iphone7iOS14.1,DarwinKernelVersion20.0.0:WedSep3003:24:41......
  • 修改k8s pod的hosts文件
    当我们服务需要使用自定义的域名解析时,就需要修改pod内hosts文件。而如果我们在pod内部修改后,下次重启依然会丢,所有下面用两种方式实现持久化修改: 1.当集群内所有或者大部分服务都需要修改hosts文件时,我们可以修改CoreDNS的configmap文件 kubectleditcm-nkube-systemco......
  • eBay卖家如何更改店铺收款账号?
    摘要:eBay是全球在线拍卖及购物平台,2023财年交易额达732亿美元。本文分享eBay卖家如何更改店铺收款账户,包括注册GeeWallet账号、换绑银行卡号、小额验证等步骤,以助卖家更好运营店铺。作为全球性的在线拍卖及购物网站,在eBay上可以购买、出售各种商品,包括二手物品、收藏品、时尚......
  • SAP mrp后台作业配置修改
    SM37查看和更改后台作业的配置输入之前给后台作业设定的名称,并在下方检索条件进行勾选或删除。这里可以看到该后台作业的详细运行情况。选中已释放状态的作业名,然后点击左上角作业然后跳转到该界面进行更改配置即可,具体修改配置请看《SAPmrp后台作业》创建一文。......
  • 【接口测试】Fiddler修改请求参数详解
       1.启动Fiddler   打开Fiddler应用程序,它会自动开始捕获HTTP/HTTPS流量。确保Fiddler的捕获功能已启用(通常默认就是启用的)。   2.设置断点   在Fiddler中,有两种方式可以设置断点:自动断点和手动断点。       1.自动断点:       通过菜单栏选择“R......
  • docker修改镜像源
    一,更改docker的镜像源1.修改:vi/etc/docker/daemon.json文件,新增下面的内容(一般建议新增2-3个){#中国科技大学"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]#网易"registry-mirrors":["https://hub-mirror.c.163.com"]#阿里"registry......