S32K144之时钟配置
一般来说,时钟精度、稳定性取决于所采用的时钟源,就MCU S32K来说如内部振荡器SIRC,FIRC,128KLPO,外部晶振等,跟所使用的外设(FTM, LPIT,LPT,RTC等)和哪一路输出时钟(SYS_CLK,BUS_CLK,SPLLDVI1_CLK等)没有直接关系。
由于S32K144提供的时钟源和配置方法比较多,那么如何有效配置得到自己想要的时钟呢?
下面以S32K144为例,从时钟定义图开始,逐步介绍如何寻找S32K144时钟(CORE_CLK, BUS_CLK,)合适的配置方法,并根据测试方法验证配置是否有效。
1.时钟定义
配置时钟先从学会看时钟分配图开始,会看图了,配置就成功了一半。
2.确认内部时钟要求
CORE_CLK/ SYS_CLK 最高支持112M(HSRUN) , 80M(RUN),目标@80M符合要求。
不过,BUS_CLK最高支持56M(HSRUN), 48M(RUN),目标@40M符合要求。
3.确认外部晶振 8M
查看S32KEVB-Q100评估板原理图,知外部晶振8M => System PLL输入 SPLL_SOURCE=8M
考虑:这里MULTI还可以>24 => 倍频因子>40,那么能不能配置VCO_CLK >320M,而最终CORE_CLK=80M呢?
答案是不行,因为VCO_CLK最高支持到320M,可以参考S32K-RM。
5.具体寄存器配置
可参考RM配置方法
6.设置检测方法
int main(void) {volatile uint32_t cnt = 0;Clock_Init();Port_Init();Clock_Out_Bus();while(1){cnt ++;}return 0; }
View Code
clock.c - 时钟配置
/*** 配置MCU时钟, 使SYS_CLK=80MHz, BUS_CLK=40MHz, FLASH_CLK=20MHz, 用外部晶振f_osc=8MHz* SPLL_CLK=160MHz, VCO_CLK=320MHz* @note* 计算公式:* BUS_CLK=SYS_CLK / DIVBUS* SYS_CLK=SPLL_CLK / DIVCORE* SPLL_CLK=(VCO_CLK) / 2* VCO_CLK=SPLL_SOURCE / (PREDIV + 1) x (MULT + 16)* 选择外部晶振作为SPLL_SOURCE, SPLL_SOURCE=8MHz*/ void Clock_Init(void) {// 以下初始化顺序不可改变 Clock_SOSC_Init_8M(); // SOSC&SPLL_SOURCE初始化为输出8M Clock_SPLL_Init_160M(); // SPLL&SCG初始化为输出160M Clock_RUNMode_SYS_Init_80M(); // sys clock = 80M, bus clock = 40M, flash = 20M }void Clock_ConfigureOut(SIM_CLKOUTSEL_Type clkoutsel) {if(clkoutsel <= RTC_CLK){SIM->CHIPCTL &= ~SIM_CHIPCTL_CLKOUTEN_MASK; // disable CLKOUTSIM->CHIPCTL &= ~SIM_CHIPCTL_CLKOUTSEL_MASK; // clear CLKOUT SIM->CHIPCTL |= SIM_CHIPCTL_CLKOUTSEL(clkoutsel); // select CLKOUT source = clkoutsel SIM->CHIPCTL |= SIM_CHIPCTL_CLKOUTEN_MASK; // enable CLKOUT } }/*** CLKOUT pin输出Bus CLK*/ void Clock_Out_Bus(void) {Clock_ConfigureOut(BUS_CLK); }/*** 配置SOSC_CLK=8M* @output SOSCDIV1_CLK* @output SOSCDIV2_CLK* @note* 外部晶振8M* 计算公式* SOSCDIV1_CLK=SOSC_CLK / SOSCDIV1* SOSCDIV2_CLK=SOSC_CLK / SOSCDIV2*/ void Clock_SOSC_Init_8M(void) {// Frequency division for SOSCDIV1_CLK, SOSCDIV2_CLKSCG->SOSCDIV=SCG_SOSCDIV_SOSCDIV1(1) // SOSCDIV1=1 : Divide by 1| SCG_SOSCDIV_SOSCDIV2(1); // SOSCDIV2=1 : Divide by 1 SCG->SOSCCFG=SCG_SOSCCFG_RANGE(0b11) // RANGE=3: 8-40 MHz SOSC// RANGE=3: 8-40 MHz SOSC| SCG_SOSCCFG_HGO(1) // HGO=0: Configure crystal oscillator for high-gain operation| SCG_SOSCCFG_EREFS(1); // EREFS=1: Internal crystal oscillator of OSC selectedwhile(SCG->SOSCCSR & SCG_SOSCCSR_LK_MASK); /* Ensure SOSCCSR unlocked */SCG->SOSCCSR = SCG_SOSCCSR_SOSCEN(1); // SOSC Enable }/*** 配置MCU时钟SPLL_CLK=160M* @require SOSC_CLK = 8M* @output SPLL_CLK*/ void Clock_SPLL_Init_160M(void) {while(SCG->SPLLCSR & SCG_SPLLCSR_LK_MASK); /* Ensure SPLLCSR unlocked */// 关闭SPLLSCG->SPLLCSR = 0; /* SPLLEN=0: SPLL is disabled (default) */// 配置SCG_SPLLCFG, 使VCO_CLK=320MHz, SPLL_CLK=160MHzSCG->SPLLCFG = SCG_SPLLCFG_PREDIV(0) | SCG_SPLLCFG_MULT(0b11000);SCG->RCCR = SCG_RCCR_SCS(0b0110) // System Clock Source: System PLL (SPLL_CLK)| SCG_RCCR_DIVCORE(0) // DIVCORE=0| SCG_RCCR_DIVBUS(1) // DIVBUS=1| SCG_RCCR_DIVSLOW(1); // DVISLOW=1// 使能SPLLSCG->SPLLCSR |= SCG_SPLLCSR_SPLLEN_MASK;// Lock SPLLSCG->SPLLCSR |= SCG_SPLLCSR_LK_MASK; }/*** SYS_CLK = 80M, BUS_CLK = 40M, FLASH_CLK=20M* @require SPLL_CLK=160M* @note SYS_CLK=80MHz,BUS_CLK=40MHz, 使用外部晶振f_osc=8MHz* 前提条件使用SPLL_SOURCE=160M作为system clock* 计算公式:* SYS_CLK=SPLL_CLK / DIVCORE* BUS_CLK=SYS_CLK / DIVBUS* FLASH_CLK=SYS_CLK / DIVSLOW* SPLL_CLK=(VCO_CLK) / 2* VCO_CLK=SPLL_SOURCE / (PREDIV + 1) x (MULT + 16)** =>DIVCORE=1, DIVBUS=1,DIVSLOW=3*/ void Clock_RUNMode_SYS_Init_80M(void) {// 配置system clock源, DIVCORE, DIVBUS, DIVFLASHSCG->RCCR = SCG_RCCR_SCS(0b0110)// Select System Clock Source: System PLL (SPLL_CLK)| SCG_RCCR_DIVCORE(1)| SCG_RCCR_DIVBUS(1)| SCG_RCCR_DIVSLOW(3);// 检查Clock Status(SCG_CSR) 是否为RCCR配置while(0b0110 != (SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT) { } }
View Code
#define PORTD14_IDX 14 #define PORTD16_IDX 16#define PORT_CLKOUT_IDX PORTD14_IDX #define PORT_LED_GREEN_IDX PORTD16_IDX/** PTD14 - CLKOUT* PTD16 - GPO for LED*/ void Port_Init(void) {// Enable clock to PORTDif(PCC->PCCn[PCC_PORTD_INDEX] & PCC_PCCn_PR_MASK){PCC->PCCn[PCC_PORTD_INDEX] |= PCC_PCCn_CGC(1); // Clock enabled to PORTD }// Set Port Data DirectionPTD->PDDR |= 1 << PORT_LED_GREEN_IDX; // Port Data Direction: output// set/clear PortD's value // PTD->PTSO |= 1 << PORT_LED_GREEN_IDX; // Port Set OutputPTD->PCOR |= 1 << PORT_LED_GREEN_IDX; // Port Clear Output// PTD16 - GPOPORTD->PCR[PORT_LED_GREEN_IDX] = PORT_PCR_MUX(0b0000001); // Port D16: MUX=ALT1, GPIO(to green LED on EVB/PCB)// PTD14 - CLKOUTPORTD->PCR[PORT_CLKOUT_IDX] = PORT_PCR_MUX(0b00000111); // Port D14: MUX=ALT4, CLKOUT }
View Code
clock.c - CLKOUT 输出选择
/*** CLKOUT pin输出Bus CLK*/ void Clock_Out_Bus(void) {Clock_ConfigureOut(0b1001); }void Clock_ConfigureOut(SIM_CLKOUTSEL_Type clkoutsel) {if(clkoutsel <= 0b1110){SIM->CHIPCTL &= ~SIM_CHIPCTL_CLKOUTEN_MASK; // disable CLKOUTSIM->CHIPCTL &= ~SIM_CHIPCTL_CLKOUTSEL_MASK; // clear CLKOUT SIM->CHIPCTL |= SIM_CHIPCTL_CLKOUTSEL(clkoutsel); // select CLKOUT source = clkoutsel SIM->CHIPCTL |= SIM_CHIPCTL_CLKOUTEN_MASK; // enable CLKOUT } }
View Code
8. 观察CLKPUT pin 输出
需要用示波器观测PTD14,截图略。
转载于:https://www.cnblogs.com/fortunely/p/11057040.html
S32K144之时钟配置相关推荐
- S32K144之时钟配置及时钟查看
S32K144之时钟配置及时钟查看 以S32K144为配置测试 一.时钟树介绍 输入部分:S32K144有四个时钟源,如上图时钟树已圈出,分别是: 时钟源 允许频率 Fast IRC(内部高速时钟源) ...
- s32k144 isystem linux,S32K144之时钟配置
一般来说,时钟精度.稳定性取决于所采用的时钟源,就MCU S32K来说如内部振荡器SIRC,FIRC,128KLPO,外部晶振等,跟所使用的外设(FTM, LPIT,LPT,RTC等)和哪一路输出时钟 ...
- S32K144之时钟
一,时钟树. 1,时钟源. 参考: S32K144之时钟配置及时钟查看 - 爱码网 (likecs.com) 时钟源有4种,如上图圈出来的. 2,时钟介绍 1.内核时钟(CORE_CLK) 2.总线 ...
- S32K144(2)时钟配置
目录 1.简介 2.时钟树 2.1.时钟源 2.2.时钟模式 2.3.各模块的时钟频率 3.寄存器 3.1.SCG_VERID:Version ID Register 3.2.SCG_PARAM:Pa ...
- S32K144:1.时钟配置
1.按照如下参数进行时钟配置 2.配置SOSC时钟 1)使用SCG_SOSCDIV寄存器配置SOSC_DIV1.DIV2时钟频率: 2)使用SCG_SOSCCFG寄存器配置选择振荡器为参考时钟.振荡器 ...
- STM32的时钟配置随笔
以前使用STM32都是使用库函数开发,最近心血来潮想要使用寄存器来试试手感,于是乎便在工作之余研究了一下STM32F4的时钟配置,在此将经历过程写下来作为锻炼,同时也供和我一样的新手参考,如有错误或者 ...
- 华大单片机HC32L136J8TA读取DS18B20温度(源码+时钟配置)
免费的C语言和linuxPDF文档:传送门 有一点C语言基础和华大单片机开发经验,应该就能看得懂就不多介绍了,有疑问可以留言,看到就回了; 关于协议具体解析:传送门@不脱发的程序猿 注(2021-05 ...
- STM32的时钟配置——时钟树解析
此文章由于讲得较详细因此篇幅较长,请带着一点耐心去读,相信会有收获! 目录 STM32为什么要有复杂的时钟系统 详解STM32时钟系统 STM32有几个时钟源 关于时钟输出 软件配置时钟 STM32为 ...
- NXP(I.MX6uLL)DDR3实验——DDR3重要时间参数、时钟配置与原理图简析
目录 DDR3 内存时间参数 传输速率 tRCD 参数 CL 参数 AL 参数 tRC 参数 tRAS 参数 I.MX6U MMDC内存控制器简介 MMDC内存控制器简介 MMDC内存控制器信号引脚 ...
最新文章
- Python数据结构与算法(第五天)
- 下一代CAN通信技术CAN XL简介
- linux 硬盘报错日志,Linux内核I_O系统报错日志与硬盘故障对应关系
- php cdi_集成CDI和WebSockets
- vb.net中滚动条一直显示没有数据时也显示_前端学习中你必须了解的几张图
- Linux文件上传下载sz 和 rz 命令
- Java-Runoob-高级教程-实例-字符串:14. Java 实例 - 连接字符串
- webview加载百度失败_独家|神秘SDK暗刷百度广告 植入数千款APP
- [摩斯密码表]摩斯密码对照表
- 安装microsoft office 和visio遇到的那些事儿
- 中国人的大师之路--《像外行一样思考,像专家一样实践》读后感
- 多开助手完美版,APP一键多开,支持安卓10
- PS批量处理图片大小-PS批量处理水印整齐
- 浩方对战平台原理分析
- mysql删除密码代码_mysql 用户新建、受权、删除。密码修改
- 10bit灰阶测试图_10bit色深是噱头?修图显示器有必要上10bit吗
- oracle先决条件内存,oracle11g安装客户端检查先决条件失败
- 穆迪将收购GCR Ratings多数股权以拓展非洲业务
- WiFi5 (802.11ac) Vs WiFi6(802.11ax)频宽及速率对比
- 基于matlab使用合成雷达和无线通信信号训练的语义分割神经网络执行频谱检测
热门文章
- 救活被微软封杀的Windows XP操作系统(转)
- Unity中鼠标的交互事件
- ansysworkbench直线和曲线路径设置
- 软件测试工程师自我介绍范文_软件测试面试自我介绍范文3篇
- java zmq api_zmqSocket 使用和相关java后台准备
- Kaggle比赛总结
- 理光 MP 2554 sp 打印机再windows10系统下经常脱机和打印延迟的解决方案
- php将字符串转换成utf8编码,php字符串转utf8编码的方法
- vivado技巧总结
- 笔记本电脑与台式机同步连接_如何将台式机与Google云端硬盘(和Google相册)同步...