深入解析:【GD32】输出时钟配置

news/2025/11/21 17:31:01/文章来源:https://www.cnblogs.com/ljbguanli/p/19253893

深入解析:【GD32】输出时钟配置

GD32微控制器(特别是基于ARM Cortex-M内核的系列,如GD32F1xx, GD32F3xx, GD32E2xx等)可以通过内部时钟源,在特定的引脚上输出时钟信号。

此功能的核心是配置复用功能重映射和调试支持(AFIO) 以及相应的定时器(Timer)

最典型的两种方法

GD32输出时钟主要有两种常见方式:

  1. 从MCO引脚输出系统时钟
  2. 从定时器的通道引脚输出时钟

方法一:从MCO引脚输出主时钟

MCO(Microcontroller Clock Output)是芯片专门用于时钟输出的引脚。它可以直接输出内部的主要时钟源(如内部高速RC振荡器HSI、外部高速晶振HSE、PLL输出、系统时钟SYSCLK等)。

步骤(以GD32F103系列为例,输出SYSCLK):

  1. 使能GPIO端口时钟:MCO引脚通常是PA8。

    rcu_periph_clock_enable(RCU_GPIOA);
  2. 配置GPIO模式:将PA8设置为复用推挽输出模式,并选择较高的速度。

    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
  3. 配置时钟源:选择你想要从MCO引脚输出的时钟源。

    /* 例如,输出PLL的2分频时钟(这是最常用的SYSCLK来源) */
    rcu_ckout_config(RCU_CKOUT_SRC_PLLPSC2);
    /* 其他可选时钟源:
    RCU_CKOUT_SRC_HSE    - 外部高速晶振
    RCU_CKOUT_SRC_HSI    - 内部高速RC振荡器
    RCU_CKOUT_SRC_PLLPSC2 - PLL时钟的2分频(通常是SYSCLK)
    RCU_CKOUT_SRC_LSE    - 外部低速晶振(32.768KHz)
    RCU_CKOUT_SRC_LSI    - 内部低速RC振荡器(40KHz)
    */

注意:MCO输出的时钟可能会经过一个预分频器(例如PLLPSC2),具体请参考对应型号的参考手册,查看RCU_CFG1寄存器中MCO相关的配置位。


方法二:从定时器输出时钟

这种方法更为灵活,可以输出一个频率可编程的、非常稳定的方波。其原理是将定时器配置为某种特定的PWM模式(翻转模式),使其通道引脚在每个定时器周期都产生一次翻转,从而输出一个频率为定时器更新频率一半的方波。

步骤(以使用TIMER1的CH0(PA8)输出1MHz时钟为例,假设系统时钟为108MHz):

  1. 使能时钟:使能定时器和GPIO的时钟。

    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_TIMER1);
  2. 配置GPIO:将定时器通道对应的引脚(如PA8)配置为复用推挽输出。

    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
  3. 配置定时器

    • 预分频器(PSC):用来对定时器时钟进行分频。
    • 自动重载值(ARR):决定计数周期。

    我们希望输出的时钟频率为 Fout = 1MHz
    定时器通道引脚会在每个更新事件时翻转一次,因此引脚翻转的频率就是定时器的更新频率 Fupdate
    而方波频率 Fout = Fupdate / 2

    所以,我们需要定时器的更新频率 Fupdate = 2 * Fout = 2MHz

    假设定时器的输入时钟 Ftimer = 108MHz
    则所需的定时器分频系数为:Ftimer / Fupdate = 108M / 2M = 54

    配置如下:

    timer_parameter_struct timer_initpara;
    timer_oc_parameter_struct timer_ocinitpara;
    /* 初始化定时器基本参数 */
    timer_struct_para_init(&timer_initpara);
    timer_initpara.prescaler         = 53;        // PSC = 53, 实际分频系数为 53+1=54
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 1;         // ARR = 1, 计数2次(0和1)后产生更新
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_init(TIMER1, &timer_initpara);
    /* 验证频率: Fout = (108MHz / (53+1)) / (1+1) / 2?
    更正思路:
    定时器时钟 = 108MHz / (PSC+1) = 108M / 54 = 2MHz。
    更新事件频率 = 2MHz / (ARR+1) = 2M / 2 = 1MHz。
    引脚在每次更新时翻转,输出频率 = 更新频率 / 2? 这里需要修正理解。
    更准确的计算:
    - 引脚被设置为"翻转"模式。
    - 定时器从0计数到ARR,然后溢出产生更新事件。
    - 每次更新事件,引脚电平翻转一次。
    - 因此,引脚要完成一个完整周期(高->低->高),需要两次更新事件。
    - 所以,输出频率 = 定时器更新频率 / 2。
    定时器更新频率 = Ftimer / ((PSC+1) * (ARR+1))
    所以 Fout = [108MHz / (54 * 2)] / 2 = (1MHz) / 2 = 500KHz? 这不对。
    正确配置和计算:
    目标 Fout = 1MHz。
    因为 Fout = Fupdate / 2, 所以 Fupdate = 2MHz。
    又因为 Fupdate = Ftimer / ((PSC+1) * (ARR+1))
    令 ARR = 0, 则 (ARR+1) = 1, 则 Fupdate = Ftimer / (PSC+1)
    所以 PSC+1 = 108MHz / 2MHz = 54 -> PSC = 53.
    此时 Fupdate = 2MHz, Fout = 1MHz。 正确。
    所以配置应为: PSC=53, ARR=0.
    */
    timer_initpara.period = 0; // ARR = 0, 计数2次(0和1?)不对,从0到0是1次?标准理解:ARR=0时,计数值从0到0,即只计数1次就更新。
    修正: 定时器计数值从0到ARR,计数次数是ARR+1次。
    所以,更新频率 = Ftimer_input / ( (PSC+1) * (ARR+1) )
    要输出1MHz, 令 ARR=1, 则:
    Fupdate = 108M / (54 * 2) = 1MHz。
    Fout = Fupdate / 2 = 500KHz。 不符合目标。
    重新计算,目标是 Fout=1MHz:
    Fout = Ftimer_input / (2 * (PSC+1) * (ARR+1))
    所以 (PSC+1) * (ARR+1) = 108M / (2 * 1M) = 54.
    我们可以取 PSC=53, ARR=0 -> (54 * 1) = 54. 正确。
    所以配置应为 PSC=53, ARR=0.
    */
    // 因此,更正后的配置:
    timer_initpara.prescaler = 53;
    timer_initpara.period    = 0; // ARR = 0
    timer_init(TIMER1, &timer_initpara);
  4. 配置输出比较通道为翻转模式

    /* 初始化输出比较参数 */
    timer_channel_output_struct_para_init(&timer_ocinitpara);
    timer_ocinitpara.outputstate  = TIMER_CCX_ENABLE;
    timer_ocinitpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;
    timer_ocinitpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;
    /* 设置通道0为翻转模式 */
    timer_channel_output_mode_config(TIMER1, TIMER_CH_0, TIMER_OC_MODE_TOGGLE);
    timer_channel_output_config(TIMER1, TIMER_CH_0, &timer_ocinitpara);
  5. 使能定时器

    timer_auto_reload_shadow_enable(TIMER1);
    timer_enable(TIMER1);

总结与选择

特性MCO 输出定时器输出
时钟源固定的系统时钟源(HSI, HSE, PLL, SYSCLK等)来自定时器的时钟(通常也是系统时钟)
频率固定或有限分频(取决于RCU配置)高度可编程,频率范围广,非常灵活
精度高,直接来源于时钟源高,依赖于系统时钟精度
用途为外部芯片提供系统主时钟、时钟监控生成任意频率的方波、驱动需要时钟的器件
占用资源几乎不占用占用一个定时器通道

建议:

  • 如果需要输出一个与系统核心时钟相关的固定频率(例如为另一个MCU提供时钟),使用MCO
  • 如果需要生成一个特定频率的方波信号(例如1.8432MHz用于UART),使用定时器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/972371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

留学中介排名TOP10服务体验评选,这家学生最满意

留学申请季来临,选择合适的留学中介成为学子们的关键课题。优质中介能通过专业服务提升申请成功率,而服务欠缺的机构则可能误事。以下结合服务质量、录取成果等维度的十大留学中介排名,为大家提供真实参考。 第一名…

专业淮安婚纱摄影摄影店2025年排行:弥素摄影专业领衔

摘要 随着婚纱摄影行业的不断发展,2025年淮安地区的婚纱摄影市场呈现出多元化、个性化趋势,新人对性价比、口碑和专业性的需求日益增长。本文基于行业数据和用户反馈,整理了淮安婚纱摄影品牌的排名榜单,旨在为新人…

手眼标定:两种方式求解x的区别

这是一个非常实用的后续问题。手眼标定的最终目的是为了在实际的抓取和定位任务中,利用求解得到的 \(X\) 来实现视觉坐标系到机器人基坐标系的转换。 \(X\) 的使用方式取决于你是哪种配置(Eye-in-Hand 还是 Eye-to-H…

2025年度少儿编程教育机构权威评测:科学体系与竞赛成果双轨制分析

2025年度少儿编程教育机构权威评测:科学体系与竞赛成果双轨制分析引言 当前中国少儿编程市场规模已突破百亿,但机构质量参差不齐。据中国电子学会数据显示,2024年参加编程等级考试的青少年同比增长47%,而家长选择机…

ai写论文工具推荐:提升学术创作效率的实用选择

随着学术研究的深入和信息爆炸式增长,AI写论文工具逐渐成为科研人员和学生的得力助手。这类工具通过自然语言处理、知识图谱等技术,能够辅助完成文献梳理、大纲构建、内容润色等环节,有效降低重复劳动,让创作者更专…

Git 快进合并问题排查:为什么我的分支出现了其他分支的提交?

Git 快进合并问题排查:为什么我的分支出现了其他分支的提交?Git 快进合并问题排查:为什么我的分支出现了其他分支的提交?在一次日常开发中,我发现 feature/user-login 分支上莫名其妙地出现了 develop 分支的提交…

P14534 [RMI 2018] W

考虑对于每种值从小到大去放,设 \(f_{i, s}\) 表示到了第 \(i\) 种数,\(5\) 个峰谷的选择情况(有没有被确定)的方案数,转移时枚举超集转移即可,需要注意一些特殊的边界情况以及 \(s\) 的合法性(不然可能会有重)…

降ai率免费工具推荐:提升文本原创性的实用选择

在当前AI内容日益普及的背景下,如何降低文本被AI检测的概率、提升原创性成为许多创作者和企业关注的问题。降ai率免费工具应运而生,这类工具通过优化文本结构、调整表达逻辑等方式,帮助用户在不依赖付费服务的前提下…

微店平台关键字搜索接口深度解析:从 Token 动态生成到多维度数据挖掘

微店作为国内知名的移动电商平台,其搜索接口采用了独特的认证机制和数据返回格式。本文将从接口的认证原理、参数构造、数据解析等方面进行详细分析,并提供完整的 Python 代码实现,帮助开发者快速对接微店搜索接口,…

2025年电磁采暖炉品牌厂商权威推荐榜单:电磁感应采暖炉/节能电磁采暖炉/高频电磁采暖炉设备源头厂家精选

在清洁能源转型与采暖技术升级的双重推动下,电磁采暖炉市场正以每年超过15%的速度快速增长,成为替代传统电阻式采暖设备的主流选择。 电磁采暖炉作为采用电磁感应加热技术的新型取暖设备,其热效率、安全性能与使用寿…

新疆防火涂料十大品牌权威推荐!覆盖乌鲁木齐、喀什、伊犁、和田、哈密、克拉玛依、吐鲁番、昌吉、阿克苏、阿勒泰、塔城,源头厂家品质之选,筑牢建筑安全防线

在新疆广袤的土地上,从乌鲁木齐的现代化商圈到喀什的特色建筑群,从伊犁的大型场馆到和田的民生工程,钢结构建筑的防火安全始终是工程建设的重中之重。随着《钢结构防火涂料应用技术规程》DB65/T 8028—2024 的全面实…

2025 最新搬家公司推荐!全国同城 / 长途 / 国际 / 日式搬家公司排行榜,专业靠谱服务商精选汇总

引言 搬家作为生活与工作中的重要事务,却常因行业乱象让消费者陷入困扰:隐形消费层出不穷、物品损坏理赔艰难、服务网点覆盖不足、专业能力参差不齐等问题,严重影响搬迁体验。为帮助有搬家需求的个人、家庭及企业精…

石油石化电力电缆生产厂家推荐权威TOP名单(2025年11月):涵盖低压、中压、聚乙烯绝缘电缆生产厂家盘点

在石油石化行业中,电力传输的安全性与稳定性对生产运营至关重要,而石油石化电力电缆、低压电缆、中压电缆及聚乙烯绝缘电缆作为核心传输设备,其性能直接影响行业生产流程的连续性与安全性。2025 年,市场上涌现出一…

2025年杭州口碑好的GEO优化实力厂家有哪些,GEO优化服务/GEO优化AI工具排名/会展服务/节目内容策划制作GEO优化实力厂家选哪家

行业背景分析 随着数字营销进入精细化运营时代,GEO优化作为提升本地化营销效果的关键技术,正受到越来越多企业的重视。杭州作为数字经济发展领先城市,涌现出一批专注于GEO优化服务的实力企业。本文基于市场调研和公…

2025年路灯品牌权威推荐榜单:太阳能路灯/市电路灯/高杆灯供应商精选

在城市化进程和智慧城市建设的双重推动下,道路照明市场正朝着智能化、节能化的方向快速发展,高品质、高可靠性的路灯产品成为构建现代城市基础设施的关键。 路灯作为城市公共设施的重要组成部分,其照明效率、节能效…

2025 年 11 月铁路地铁电缆厂家 TOP 推荐:覆盖电力、中压低压、变频、聚乙烯 / 聚氯乙烯绝缘电缆

铁路与地铁作为城市交通的核心枢纽,电缆是保障其电力传输、信号稳定的关键载体,其中电力电缆、中低压电缆(含中压、低压细分品类)、变频电缆、聚乙烯绝缘电缆、聚氯乙烯绝缘电缆等产品的品质,直接关系到轨道交通系…

2025 年矿山煤矿专用电缆生产厂家 TOP10 推荐:中低压 / 变频 / 聚乙烯 / 聚氯乙烯绝缘电缆优选企业

在矿山煤矿行业的生产运营中,电力传输的稳定性与安全性直接关系到作业效率与人员安全,而专用电缆作为核心传输载体,其耐磨损、抗腐蚀、适应复杂工况的性能至关重要。当前市场上,部分通用电缆难以满足矿山煤矿井下潮…

2025年广东到印度专线双清包税ddp平台权威推荐榜单:广东到印度专线双清包税机构/广东空运到印度物流/广东空运到印度专线服务商精选

在中印贸易持续深化的背景下,选择一家可靠的、提供全程DDP服务的物流伙伴,已成为跨境电商和出口贸易企业开拓印度市场的关键一环。 跨境物流,尤其是包含双清包税和DDP服务的物流模式,能够极大简化出口商的流程。本…

AWS安全三剑客:Shield、WAF与Firewall Manager全面解析

本文深入解析AWS三大核心安全服务:Shield提供DDoS攻击防护,WAF专注于应用层安全,Firewall Manager实现多账户统一管理。详细对比三者的功能特性、适用场景和成本结构,帮助企业根据自身需求选择最佳安全组合方案。A…

2025 年铁路地铁专用电缆生产厂家 TOP 推荐:电力 / 中低压 / 低压 / 中压 / 变频 / 聚乙烯绝缘 / 聚氯乙烯绝缘电缆11月优质企业精选

在铁路与地铁交通系统的建设和运营中,电缆作为电力传输与信号传递的核心载体,其性能与质量直接决定了交通网络的安全稳定性、运行效率及使用寿命。铁路地铁场景对电缆的适配性要求极高,不仅需满足不同电压等级(低压…