【RTD MCAL 篇3】 K312 MCU时钟系统配置
【RTD MCAL 篇3】 K312 MCU时钟系统配置
- 一,文档简介
- 二, 时钟系统理论与配置
- 2.1 K312 时钟系统
- 2.1.1 PLL
- 2.1.2 MUX_0系统
- 2.1.3 MUX_6 时钟输出
- 2.1.4 option B推荐方案
- 2.2 EB 配置
- 2.2.1 General 配置
- 2.2.2 McuClockSettingConfig配置
- 2.2.2.1 McuFIRC配置
- 2.2.2.2 McuSIRC配置
- 2.2.2.3 McuFXOSC配置
- 2.2.2.4 McuCgm0ClockMux0配置
- 2.2.2.5 McuCgm0ClockMux1配置
- 2.2.2.6 McuCgm0ClockMux3配置
- 2.2.2.7 McuCgm0ClockMux4配置
- 2.2.2.8 McuCgm0ClockMux5配置
- 2.2.2.9 McuCgm0ClockMux6配置
- 2.2.2.10 McuCgm0ClockMux11配置
- 2.2.2.11 McuRtcClockSelect配置
- 2.2.2.12 McuPLL配置
- 2.2.2.13 McuClockReferencePoint配置
- 2.2.3 McuModeSettingConf 配置
- 2.2.4 PORT 配置
- 三,测试结果
- 3.1 CLKOUT FIRC_CLK DIV2
- 3.2 CLKOUT SIRC_CLK DIV2
- 3.3 CLKOUT FXOSC_CLK DIV10
- 3.4 CLKOUT PLLPH0 CLK DIV10
- 3.5 CLKOUT CORE CLK DIV10
- 3.6 CLKOUT PLLPH1 CLK DIV4
- 3.7 CLKOUT HSE CLK DIV10
- 3.8 CLKOUT AIPS_PLAT CLK DIV10
- 3.9 CLKOUT AIPS_SLOW CLK DIV10
一,文档简介
很久没开张了,理由省掉一万字,结论为绝非偷懒!抓着2024的尾巴尖,再次激活下写文章系统。既然新的一年要开始了,那么就从MCU的小心脏跳动起来: 谈谈如何在K3芯片MCAL的MCU中配置时钟系统。这个话题之前在做LLD的时候,一直是不屑去讲的,因为K3的时钟系统实在是太过简单,内部快慢时钟源,外部快慢时钟源,一个PLL倍频,然后各路内核外设来分羹,K3的RM甚至还做了几个option把规则给框了起来,从LLD的角度,尤其是S32DS CT配置的角度,更是简洁明了,来个CT图秀一下:


就这么个时钟系统,小手点点戳戳几下,一生成代码不就完事了。但是在LLD里面太过自由,到了MCAL却时常磕磕碰碰,所以,索性花些许时间把这个MCAL MCU的整个时钟系统给整的明明白白,本文以K312为例来讲解,其他的K3系列类似。
二, 时钟系统理论与配置
2.1 K312 时钟系统
从RM的时钟章节,可以看到整个系统框图情况:

这个框图把每个部分的情况都画的很清晰,时钟来源有四种:
内部快速时钟FIRC:48MHz, +/-5%误差,启动最大25us
内部慢速时钟SIRC: 32KHz,+/-10%误差,启动最大3ms
外部快速时钟FXOSC: 8-40MHz, 启动稳定时间FXOSC_CTRL[EOCV] × 128
外部慢速时钟SXOSC:32.768KHz, 启动稳定时间SXOSC_CTRL[EOCV] x 128
一个PLL:输入8-40MHZ,VOC输出640M-1280Mhz,PLL_PHIn_CLK输出25-480MHz。
MUX_0:输出CORE_CLK, AIPS_PLAT_CLK, AIPS_SLOW_CLK, HSE_CLK,DCM_CLK
MUX_1: 输出系统定时器STM0_CLK
MUX_3: 输出FLEXCAN0-2时钟
MUX_4: 输出FLEXCAN3-5时钟
MUX_5: 输出CLKOUT_STANDBY
MUX_6: 输出 CLKOUT_RUN
MUX_11: 输出TRACE_CLK
RTC_CLK:RTC时钟
2.1.1 PLL
从PLL角度,需要知道倍频和哪些值有关,可以通过如下公式去计算:

如果是整数情况,上图的红色框是常用的方式,本文也会用上面的方式去配置。
PLL_PHI是最终PLL输出的时钟,供给其他MUX对应的MC去选择的。
2.1.2 MUX_0系统
从RM中可以看到细节的MUX_0系统:

可以看到,MUX_0的时钟源头可以是两种:PLL或者内部FIRC。
然后后面是可以生成内核时钟,AIPS_PLAT_CLK, AIPS_SLOW_CLK, HSE_CLK, DCM_CLK.
那么具体是生成时钟的频率是多少?原则上是符合各个模块对应的最大时钟即可,但是K3系列里面还做了一些option的推荐,比如K312推荐RUN的时候用optionB模式,尤其HSE的时钟,通常是需要严格满足option的推荐。
2.1.3 MUX_6 时钟输出
为了检查芯片内对应时钟情况,可以通过CLKOUT引脚输出对应的时钟,CLKOUT引脚可以对应多个时钟源的选择,具体情况如下:

图中黄色的内容是K312的CLKOUT_RUN所能支持的,后续配置时钟之后,将会具体选择对应的时钟测试是否输出和配置一致。
2.1.4 option B推荐方案
本文K312将会在EB中配置optionB的时钟情况。

2.2 EB 配置
首先先新建一个K312的EB工程,具体新建方法可以参考之前的文章:
S32K3 工具篇8:如何移植RTD现有demo到其他K3芯片
本文将重点讲解基于RTD400 MCAL的MCU模块对应的时钟配置,对于MCU配置,两个文档需要作为工具书查阅:
C:\NXP\SW32K3_S32M27x_RTD_R21-11_4.0.0\eclipse\plugins\Mcu_TS_T40D34M40I0R0\doc下的:RTD_MCU_UM.pdf和RTD_MCU_IM.pdf
有些不知道怎么配置的,就按照文档推荐的默认值配置即可。
下图是mcu的概览,主要配置的模块有如下三个组件:
General, McuClockSettingConfig, McuModeSettingConf

2.2.1 General 配置
除了图8,需要打开内部外部快慢速时钟控制以及PLL控制,并且添加对应API, 以及晶振频率情况,如果这边不打开,后面的对应配置将会无法配置。

2.2.2 McuClockSettingConfig配置
这里是MCU时钟配置的核心区域,里面包含了时钟源,PLL,以及各大MUX情况。
首先需要先添加一个时钟配置:

点击进去,里面会有详细的配置:

里面一共17个选项,对于第1,6可以保持默认配置,5外部慢速晶振,由于板子没接,所以不配置。其余要根据实际情况配置,下面予以一一讲解:
2.2.2.1 McuFIRC配置
内部快速时钟,48MHz:

2.2.2.2 McuSIRC配置
内部慢速时钟32Khz

2.2.2.3 McuFXOSC配置
外部晶振16MHZ,根据实际连接情况填写。

2.2.2.4 McuCgm0ClockMux0配置
Mux0配置,这里配置的有内核时钟,AIPS_PLAT_CLK,AIPS_SLOW_CLK,HSE, DCM_CLK,是满足optionB要求,并且时钟来源于PLL_PHI0_CLK,真正配置的时候,先配置PLL时钟输出正确的PLL_PHI0_CLK, PLL_PHI1_CLK时钟。

2.2.2.5 McuCgm0ClockMux1配置

可以根据实际模块需要的时钟源情况去配置。
2.2.2.6 McuCgm0ClockMux3配置
配置FLEXCAN0-2模块的时钟源:

2.2.2.7 McuCgm0ClockMux4配置
配置FLEXCAN3-5模块的时钟源:

2.2.2.8 McuCgm0ClockMux5配置
配置CLKOUT_STANBY模块的时钟源:

2.2.2.9 McuCgm0ClockMux6配置
配置CLKOUT_RUN模块的时钟源

2.2.2.10 McuCgm0ClockMux11配置
配置TRACE_CLK模块的时钟源

2.2.2.11 McuRtcClockSelect配置
配置RTC模块的时钟源

2.2.2.12 McuPLL配置
配置PLL模块的时钟源

2.2.2.13 McuClockReferencePoint配置
配置参考时钟,外设模块的时钟源选择接口。

到这里,时钟就配置结束了。
下面为了验证,可以使用CLKOUT_RUN这个输出,将对应的时钟输出到引脚PTD10查看。
2.2.3 McuModeSettingConf 配置
Mcu中的McuModeSettingConf->McuPeripheral这里需要把使用到的外设给打开:

2.2.4 PORT 配置
因为需要将内部时钟输出到CLKOUT_RUN, K312的PTD10 MSCR106查看,所以添加PORT引脚如下:

三,测试结果
下面在S32K312-EVB板子上,通过修改EB的CLKOUT_RUN的时钟源测试看看时钟是否和配置的能够对上。
常用的mcu相关驱动如下:

系统启动MCU初始化的调用顺序如下:
1). Mcu_Init()
2). Mcu_InitClock()
3). Mcu_GetPllStatus() - Till PLL is locked.
4). Mcu_DistributePllClock()
5). Mcu_SetMode()
6). Mcu_InitRamSection() - If required
对应的main代码如下:
#include "Mcu.h"
#include "Mcu_Cfg.h"
#include "Port.h"
#include "Dio.h"
#include "Port_Cfg.h"
#include "Platform.h"
void TestDelay(uint32 delay);
void TestDelay(uint32 delay)
{static volatile uint32 DelayTimer = 0;while(DelayTimer < delay){DelayTimer++;}DelayTimer = 0;
}/**
* @brief Main function of the example
* @details Initialize the used drivers and uses the Icu
* and Dio drivers to toggle a LED on a push button
*/
int main(void)
{uint8 count = 0U;uint8 u8TimeOut = 100U;/* Initialize the Mcu driver */
#if (MCU_PRECOMPILE_SUPPORT == STD_ON)Mcu_Init(NULL_PTR);
#elif (MCU_PRECOMPILE_SUPPORT == STD_OFF)Mcu_Init(&Mcu_Config_VS_0);
#endif /* (MCU_PRECOMPILE_SUPPORT == STD_ON) *//* Initialize the clock tree and apply PLL as system clock */Mcu_InitClock(McuClockSettingConfig_0);#if (MCU_NO_PLL == STD_OFF)while ( MCU_PLL_LOCKED != Mcu_GetPllStatus() ){}Mcu_DistributePllClock();
#endif/* Apply a mode configuration */Mcu_SetMode(McuModeSettingConf_0);/* Initialize all pins using the Port driver */Port_Init(NULL_PTR);/* Initialize Platform driver */Platform_Init(NULL_PTR);while (count++ < 10){Dio_WriteChannel(DioConf_DioChannel_Digital_Output_LED_Q172, STD_HIGH);Dio_WriteChannel(DioConf_DioChannel_Digital_Output_LED_Q257, STD_HIGH);TestDelay(5000000);Dio_WriteChannel(DioConf_DioChannel_Digital_Output_LED_Q172, STD_LOW);Dio_WriteChannel(DioConf_DioChannel_Digital_Output_LED_Q257, STD_LOW);TestDelay(5000000);}// Exit_Example(TRUE);return (0U);
}#ifdef __cplusplus
}
#endif
3.1 CLKOUT FIRC_CLK DIV2

可以看到对于FIRC原本48Mhz的时钟做2分频输出,得到了24Mhz的时钟波形,正确!
3.2 CLKOUT SIRC_CLK DIV2

可以看到对于SIRC原本32Khz的时钟做2分频输出,得到了16khz的时钟波形,正确!
3.3 CLKOUT FXOSC_CLK DIV10

可以看到对于FXOSC原本16Mhz的时钟做10分频输出,得到了1.6Mhz的时钟波形,正确
3.4 CLKOUT PLLPH0 CLK DIV10

可以看到对于PLLPH0原本120Mhz的时钟做10分频输出,得到了12Mhz的时钟波形,正确
3.5 CLKOUT CORE CLK DIV10

可以看到对于CORE原本120Mhz的时钟做10分频输出,得到了12Mhz的时钟波形,正确
3.6 CLKOUT PLLPH1 CLK DIV4

可以看到对于PLLPH1原本48Mhz的时钟做4分频输出,得到了12Mhz的时钟波形,正确
3.7 CLKOUT HSE CLK DIV10

可以看到对于HSE原本60Mhz的时钟做10分频输出,得到了6Mhz的时钟波形,正确
3.8 CLKOUT AIPS_PLAT CLK DIV10

可以看到对于AIPS_PLAT_CLK原本60Mhz的时钟做10分频输出,得到了6Mhz的时钟波形,正确
3.9 CLKOUT AIPS_SLOW CLK DIV10

可以看到对于AIPS_SLOW_CLK原本30Mhz的时钟做10分频输出,得到了3Mhz的时钟波形,正确
相关文章:
【RTD MCAL 篇3】 K312 MCU时钟系统配置
【RTD MCAL 篇3】 K312 MCU时钟系统配置 一,文档简介二, 时钟系统理论与配置2.1 K312 时钟系统2.1.1 PLL2.1.2 MUX_0系统2.1.3 MUX_6 时钟输出2.1.4 option B推荐方案 2.2 EB 配置2.2.1 General 配置2.2.2 McuClockSettingConfig配置2.2.2.1 McuFIRC配置…...
探索Docker Compose:轻松管理多容器应用
探索Docker Compose:轻松管理多容器应用 在现代软件开发中,容器化已经成为构建、部署和扩展应用的主流方式。而Docker Compose作为Docker生态系统的重要组成部分,可以简化多容器应用的管理。本文将深入探讨Docker Compose的核心功能及应用场…...
计算机网络 (18)使用广播信道的数据链路层
一、广播信道的基本概念 广播信道是一种允许一个发送者向多个接收者发送数据的通信信道。在计算机网络中,广播信道通常用于局域网(LAN)内部的主机之间的通信。这种通信方式的主要优点是可以节省线路,实现资源共享。 二、广播信道数…...
【vLLM 学习】欢迎来到 vLLM!
vLLM 是一款专为大语言模型推理加速而设计的框架,实现了 KV 缓存内存几乎零浪费,解决了内存管理瓶颈问题。 更多 vLLM 中文文档及教程可访问 →https://vllm.hyper.ai/ vLLM 是一个快速且易于使用的库,专为大型语言模型 (LLM) 的推理和部署…...
现代网络基础设施中的 TCP 握手之下
TCP 3 次握手 在最简单的形式中,TCP 三次握手很容易理解,并且有 大量在线材料都在讨论这个问题。(如果你能读懂 Chinease,你可以看看我之前的一篇文章。 然而,在实际中理解、练习和解决 TCP 问题 世界是另一回事。随…...
GRAPE——RLAIF微调VLA模型:通过偏好对齐提升机器人策略的泛化能力(含24年具身模型汇总)
前言 24年具身前沿模型大汇总 过去的这两年,工作之余,我狂写大模型与具身的文章,加之具身大火,每周都有各种朋友通过CSDN私我及我司「七月在线」寻求帮助/指导(当然,也欢迎各大开发团队与我司合作共同交付)…...
NeurIPS 2024 | 像素级LLM实现图像视频理解、生成、分割和编辑大统一(昆仑万维等)
Accepted by NeurIPS 2024 文章链接:https://arxiv.org/pdf/2412.19806 项目链接:https://vitron-llm.github.io/ Github链接:https://github.com/SkyworkAI/Vitron 亮点直击 首次提出了一种通用的视觉多模态大语言模型(MLLM&…...
中药和西药的区别
中药和西药的区别 一、定义与来源 (一)中药 中药主要是在中国传统医学理论指导下用于预防、诊断、治疗疾病或调节人体机能的药物。它的来源广泛,包括植物药、动物药、矿物药等。植物药是中药的主要组成部分,例如人参࿰…...
Spring Security(maven项目) 3.0.2.4版本
前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…...
【Ubuntu】安装华为的MindSpore
目录 1 安装Anaconda 2 更换国内源 3 安装MindSpore 1 安装Anaconda 2 更换国内源 具体方法如下: 打开命令行 cmd 工具,输入以下命令。 ① Conda 换源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ c…...
【模型】Qwen2-VL 服务端UI
1. 前言 最近在测试VLM模型,发现官方的网页demo,代码中视频与图片分辨率可能由于高并发设置的很小,导致达不到预期效果,于是自己研究了一下,搞了一个简单的前端部署,自己在服务器部署了下UI界面࿰…...
计算机网络•自顶向下方法:网络层介绍、路由器的组成
网络层介绍 网络层服务:网络层为传输层提供主机到主机的通信服务 每一台主机和路由器都运行网络层协议 发送终端:将传输层报文段封装到网络层分组中,发送给边缘路由器路由器:将分组从输入链路转发到输出链路接收终端࿱…...
安卓11 SysteUI添加按钮以及下拉状态栏的色温调节按钮
最近客户想要做一个台灯产品,需要实现 串口调节台灯功能 ,其中包括 亮度调节 色温调节 开关 三个功能 话不多说,贴代码 diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml old mode 100644 new …...
多个线程处理不同的数据,等线程都完成后再进行下一步操作
现在有三个任务,三个任务之间没有关联关系,但是第四个任务要等前三个完成之后才能进行,于是使用多线程完成前三个任务节省时间 示例代码: public void saveDataByOnlineTimeNew(LocalDateTime startTime, LocalDateTime endTime) {Objects.requireNonNull(startTime, "开…...
聆听音乐 1.5.9 | 畅听全网音乐,支持无损音质下载
聆听音乐手机版是面向广大音乐爱好者的移动应用程序,用户可以随时随地通过手机享受丰富的音乐资源。它提供了多种魅力功能,让用户在手机上畅享更舒适的音乐体验,每位用户都能享受精彩纷呈的收听体验。此外,软件还支持无损音质音乐…...
Rust 基础入门指南
Rust 基础入门指南 1. Rust 语言概述 Rust 的历史与设计理念 Rust 是由 Mozilla 研究院的 Graydon Hoare 于2010年开始创建的系统编程语言。其设计目标是创建一种安全、并发、实用的编程语言,特别关注内存安全和并发性。 Rust 的核心设计理念包括: …...
青少年编程与数学 02-006 前端开发框架VUE 03课题、编写APP组件
青少年编程与数学 02-006 前端开发框架VUE 03课题、编写APP组件 一、组件二、VUE中的组件三、APP组件四、应用示例1. App.vue - 根组件2. HelloWorld.vue - 子组件3. main.js - 应用入口文件4. router/index.js - 路由配置文件5. index.html - HTML入口文件6. package.json - 项…...
基于Java的银行排号系统的设计与实现【源码+文档+部署讲解】
目 录 内容提要 1. 引言 2. 系统分析 2.1 系统初步调查 2.2 系统可行性分析 2.2.1 经济可行性 2.2.2 操作可行性 2.2.3 技术可行性 2.3 系统开发环境概述 2.3.1 硬件环境 2.3.2 软件环境 2.4 系统需求分析 2.4.1 业务流程分析 2.4.2 系统体系结构设计 2.4.3 系统逻辑模型 2.5 …...
linux-26 文件管理(四)install
说一个命令,叫install,man install,install是什么意思?安装,install表示安装的意思,那你猜install是用来干什么的?猜一猜干什么的?安装软件,安装第三方软件,错…...
VS2015中使用boost库函数时报错问题解决error C4996 ‘std::_Copy_impl‘
在VS2015中使用boost库函数buffer时遇到问题,其他函数定义均能执行,当加上bg::buffer(参数输入正确);语句后就报如下错误: 错误 C4996 std::_Copy_impl: Function call with parameters that may be unsafe - this call relies…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
