当前位置: 首页 > news >正文

【复旦微FM33 MCU 外设开发指南】系统篇——时钟

在这里插入图片描述

前言

本系列基于复旦微FM33系列单片机的DataSheet编写,旨在提供一些开发指南。
本文章及本系列其他文章将持续更新,本系列其它文章请跳转↓↓↓
【复旦微FM33 MCU 外设开发指南】总集篇

本文章最后更新日期:2024/08/04

文章目录

  • 前言
  • 时钟源
    • 1. 高频RC振荡器RCHF(RC High Frequency)
    • 2. 中频RC振荡器RCMF(RC Middle Frequency)
    • 3. 低功耗RC振荡器LPOSC(Low Power OSC)
    • 4. 低频晶体振荡器XTLF(Crystal Low Frequency)
    • 5. 高频晶体振荡器XTHF(Crystal High Frequency)
  • 重点:注意事项
    • 1. 时钟校准(RCHF/RCMF/LPOSC)
    • 2. 稳定性(RCHF/RCMF/LPOSC/XTLF/XTHF)
    • 3. 起振时间
    • 4. FLASH读写等待周期
    • 5. 外设时钟频率
  • 应用Tips
    • 1. 通过FOUT引脚输出时钟
    • 2. 快速的初始化
  • 时钟相关的寄存器
    • 1. 时钟管理单元
    • 2. 总线与存储单元

本文对应FM33LC0xx DataSheet 第11章——时钟管理单元(CMU),部分参数来源于 第3章——电参数

时钟源

系统所有用到的时钟都是以下时钟源产生的。

1. 高频RC振荡器RCHF(RC High Frequency)

RCHF可选的时钟频率为8MHz/16MHz/24MHz,全温区最大偏差±1%。
RCHF在上电后即为8MHz的时钟频率,用于MCU完成初始化操作。

2. 中频RC振荡器RCMF(RC Middle Frequency)

RCMF的时钟频率为4MHz,全温区最大偏差±3%。

3. 低功耗RC振荡器LPOSC(Low Power OSC)

LPOSC的时钟频率为32kHz,在-40℃最大偏差-6%,在85℃偏差最大4%。

4. 低频晶体振荡器XTLF(Crystal Low Frequency)

对于英文缩写,我认为应该是因为XT和Crystal的发音很像,所以就用XT代替Crystal(晶振)了。
XTLF只有在有外接晶振的情况下才有时钟,其性能应该就是取决于外部晶振。
XTLF具有停振检测电路,详见DataSheet第12章——停振检测(FDET)

5. 高频晶体振荡器XTHF(Crystal High Frequency)

XTHF只有在有外接晶振的情况下才有时钟,其性能应该就是取决于外部晶振。
XTHF具有停振检测电路,详见DataSheet第12章——停振检测(FDET)

DataSheet中关于外接晶振的描述在第34章——I/O端口
在这里插入图片描述

重点:注意事项

1. 时钟校准(RCHF/RCMF/LPOSC)

由于每颗芯片的差异,实际的时钟频率和设定的时钟频率有一定的差异,向调校寄存器中写入校准值可以在一定范围内调整时钟频率。
校准值的读取
MCU在出厂前,测试仪会测试MCU的时钟频率,并将校准值写入Flash中供用户读取。
需要注意32bit的校验值中,高16位和低16位分别保存校准值和反码校验字,在使用前应做正反码校验。
在这里插入图片描述
校准值的写入
由于RCHF上电即为8MHz的频率,MCU会自动读取8MHz的时钟校准值并写入寄存器中。
但如果切换其它频率的时钟,就需要我们自己读取相应频率的时钟校准值,并写入调校寄存器中了。
(显然,当你从16MHz的时钟频率切换到8MHz时,也要重新读取8MHz的时钟校准值写入)

2. 稳定性(RCHF/RCMF/LPOSC/XTLF/XTHF)

以RCHF为例,DataSheet上写明,RCHF可以最高配置为24MHz
(其实RCHF应该可以配置为更高的时钟频率,但Flash中没有保存其校准值)
我们可以将高频率的RCHF作为系统时钟并提供给APB总线上挂载的各种外设

使用内置RC振荡器应该注意:
1.更高频率的RCHF的稳定性将变差。如常温下8MHz的RCHF频率偏差为0.16MHz,而24MHz的RCHF频率偏差为0.48MHz
(即偏差的百分比固定,频率越高偏差越大)
2.高频率的RCHF高低温性能将变差。8MHz的RCHF全温区偏差为±1%,而24MHz的RC HF全温区偏差为±3%
3.相比RCMF,RCHF有更好的全温区性能。RCHF为±1%,而RCMF为±3%

显然在大部分的应用场景中可能不差这一点时钟偏差,但系统时钟的偏差将直接影响APB总线时钟,如果你是用定时器高精度的采集脉冲信号宽度的话,那就需要注意这些方面的影响了。一旦MCU放入量产产品中,其在各种工况下的稳定性就十分重要了。

因此在系统时钟要求频率很高,或稳定性要求高的时候:
1.使用内置时钟,用8MHz的RCHF,分频给PLL并等待其锁定后,将PLL作为系统时钟(PLL的高低温稳定性更好)。
2.使用外接晶振,外接晶振的高低温稳定性更好,但要注意其起振时间慢,可能需要200ms。

该图取自3.4.7章节:内部时钟源特性

3. 起振时间

外置晶振
前面提到外置晶振其稳定性更好,但晶振的起振时间较长,实测下来要200ms以上。
起振时间和晶体振荡电路的振荡强度有关,FM33提供了XTHF的振荡强度配置寄存器RCC_XTHFCR
但注意不是振荡强度越强,起振时间越短的,在振荡强度和晶振匹配时,起振时间是最短的。

RC振荡器
文档没有写RCHF的起振时间(有可能是因为上电后RCHF就自动启动,所以这个参数没什么意义?)
RCMF的起振时间为10us。
LPOSC的起振时间为50——100us。

PLL
前面已经讲过在高频的系统时钟应用中,应该使用PLL。
PLL接收到时钟输入后,是需要等待一段时间才能建立稳定的时钟输出的,DataSheet典型值为65us。
因此软件必须在配置和启动PLL后,等待PLL锁定后,才可以将PLL配置为系统时钟。

如果没有等待锁定就配置为系统时钟,就很容易产生一些莫名其妙的错误
1.在启动PLL和切换系统时钟中间的语句执行时间较长,长于锁定时间,那么就没什么问题
2. 把初始化阶段的系统时钟频率变高,导致同样的程序执行之间变短,短与锁定时间,那很有可能进入硬件错误中断了

4. FLASH读写等待周期

在系统时钟频率很高时,必须按照手册要求配置FLS_RDCR寄存器配置FLASH读写等待周期。
在这里插入图片描述
如果没有配置正确的FLASH读写等待周期,就很容易产生一些莫名其妙的错误
1.程序在这块板子上好好的,换一块板子跑不起来了
2.程序本来好好的,填了几句话崩掉了,断点还打不上

5. 外设时钟频率

各个外设有其上限的工作频率。以SPI为例,其最高工作频率为16MHz。
SPI外设挂载在APB总线上,而APB时钟来源于系统时钟。

例:当系统时钟为64MHz时:
1.APBCLK使用不分频的系统时钟,就必须将SPI的工作时钟预分频为4分频或更高分频。
2.APBCLK使用4分频的系统时钟,SPI工作时钟可以不分频或配置为更高的预分频。

应用Tips

1. 通过FOUT引脚输出时钟

当配置好时钟后要确定其是否正常工作,可以通过两个引脚(PB12/PD1)来输出时钟信号。
FOUT引脚要想工作,必须配置GPIO寄存器GPIO->FOUTSEL
(配置GPIO寄存器之前要使能GPIO时钟,他在RCC->PCLKCR1中的PAD_PCE寄存器使能)
在这里插入图片描述
通过FOUT引脚输出时钟后,就可以用示波器观察其时钟频率了~

2. 快速的初始化

在MCU上电后,并不是马上进入main()函数的。
启动文件告诉我们,系统上电复位后,在main函数之前先取SystemInit()函数的指针并跳转。
因此对一些要求初始化时间很短的场合,可以在SystemInit()函数中将默认的8MHz RCHF系统时钟更改为更高频率的时钟源。
以获取更快的初始化代码运行速度。
在这里插入图片描述

时钟相关的寄存器

1. 时钟管理单元

在这里插入图片描述

2. 总线与存储单元

这里是配置Flash的读等待周期的寄存器。
在这里插入图片描述

相关文章:

  • java 基础知识一
  • 国产数据库备份恢复实现
  • 在图片URL后面添加一个参数以清理缓存
  • [Unity实战]Mirror网络与Addressable场景管理
  • 多租户系统数据隔离方案
  • 深入理解SQL中的窗口函数
  • Android顶部标题栏自定义,添加按钮
  • springboot多媒体内容管理系统-计算机毕业设计源码08580
  • Linux学习笔记:Linux基础知识汇总(个人复习版)
  • 2435. 矩阵中和能被 K 整除的路径(leetcode)
  • 详解Xilinx FPGA高速串行收发器GTX/GTP(5)--详解8B10B编解码
  • Mojo中值的所有权简介
  • 区块链的搭建和运维4
  • 数据可视化Axure大屏原型制作分享
  • CAN 应用编程基础-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
  • 78. Subsets
  • centos安装java运行环境jdk+tomcat
  • ERLANG 网工修炼笔记 ---- UDP
  • es6
  • JAVA_NIO系列——Channel和Buffer详解
  • javascript 总结(常用工具类的封装)
  • Java读取Properties文件的六种方法
  • mockjs让前端开发独立于后端
  • node.js
  • PHP 的 SAPI 是个什么东西
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • 第2章 网络文档
  • 基于webpack 的 vue 多页架构
  • 少走弯路,给Java 1~5 年程序员的建议
  • 我看到的前端
  • 做一名精致的JavaScripter 01:JavaScript简介
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • $ git push -u origin master 推送到远程库出错
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (算法)Travel Information Center
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .Family_物联网
  • .mysql secret在哪_MySQL如何使用索引
  • .net 7 上传文件踩坑
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET Core WebAPI中封装Swagger配置
  • .Net 执行Linux下多行shell命令方法
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @Service注解让spring找到你的Service bean