S32K144:1.时钟配置

1.按照如下参数进行时钟配置
请添加图片描述
2.配置SOSC时钟
1)使用SCG_SOSCDIV寄存器配置SOSC_DIV1、DIV2时钟频率;
2)使用SCG_SOSCCFG寄存器配置选择振荡器为参考时钟、振荡器为高速模式(8-40MHz)、振荡器为低增益模式;
3)使用SCG_SOSCCSR寄存器使能时钟;
3)使用SCG_SOSCCSR寄存器等待完成配置;

3.配置PLL时钟
1)使用SCG_SPLLDIV寄存器SPLL_DIV1、DIV2时钟频率;
2)使用SCG_SPLLCFG寄存器选择SOSC作为PLL的时钟源、配置PLL分频系数及倍频系数;
3)使用SCG_SPLLCSR寄存器使能PLL时钟;
4)使用SCG_SPLLCSR寄存器等待完成配置;

4.RUN模式下CORE/SYS_CLK时钟/BUS_CLK/FLASH_CLK配置
1)使用SCG_RCCR寄存器选择PLL作为系统时钟源;
2)使用SCG_RCCR寄存器设置DIVCORE = 2;
3) 使用SCG_RCCR寄存器设置DIVBUS = 2;
4) 使用SCG_RCCR寄存器设置DIVSLOW = 3;
5) 使用SCG_CSR寄存器设置等待配置完成;

5.相关配置函数如下:

/**
  ******************************************************************************
  * @file    clocks_and_modes.c
  * @author  ZYY
  * @version 0.0
  * @date    2021.9.27
  * @brief   时钟配置
  ******************************************************************************
  * @attention
  *
  ******************************************************************************
 */

/* Includes ------------------------------------------------------------------*/
#include "clocks_and_modes.h"


/**
  * @brief SOSC时钟配置
  * @param void
  * @reval void
  * @attention
  * SOSCDIV1_CLK = SOSCDIV2_CLK = 8MHz
  */
static void SOSC_Init_8MHz(void)
{
	SCG->SOSCDIV = MY_SOSC_DIV1_AND_DIV2;	/* SOSCDIV1 = 1  SOSCDIV2 = 1 */

	SCG->SOSCCFG = MY_SOSCCFG; /* EREFS = 1:选择振荡器为参考时钟 */
	                           /* HGO = 0:振荡器为低增益模式 */
							   /* RANGE = 2:振荡器为高速模式 晶振频率在8-40之间 */
	while(SCG->SOSCCSR & MY_SOSCCSR_LK); /* 等待寄存器可以写入  */
	SCG->SOSCCSR = 0x00000001; /* OSC时钟使能 */
							   /* OSC时钟监控器不使能 */
							   /* 如果使能监控器 监控器检测到错误触发中断 */
	while(!(SCG->SOSCCSR & MY_SOSCCSR_SOSCVLD)); /* 等待SOSC时钟有效 */
}

/**
  * @brief PLL时钟配置
  * @param void
  * @reval void
  * @attention
  * SPLLDIV1_CLK = 80MHz
  * SPLLDIV2_CLK = 40MHz
  */
static void SPLL_Init_160MHz(void)
{
	while(SCG->SPLLCSR & MY_SPLLCSR_LK); /* 等待CSR寄存器可以写入 */
	SCG->SPLLCSR = 0x00000000; /* 复位CSR寄存器 */
	SCG->SPLLDIV = MY_SPLLDIV_SPLLDIV; /* SPLLDIV1 = 1,SPLLDIV1_CLK = 80MHz */
									   /* SPLLDIV2 = 4,SPLLDIV2_CLK = 40MHz */
	SCG->SPLLCFG = MY_SPLLCFG; /* SPLL时钟源为SOSC */
	                           /* SPLL_PRDIV = 1 */
	                           /* PLL_MULT = 32 */
	                           /* SPLL_CLK = 10 / 1 * 32 / 2 = 160Hz */
	while(SCG->SPLLCSR & MY_SPLLCSR_LK); /* 等待CSR寄存器可以写入 */
	SCG->SPLLCSR = 0x00000001; /* OSC时钟使能 */
							   /* PLL时钟监控器不使能 */
							   /* 如果使能监控器 监控器检测到错误触发中断 */
	while(!(SCG->SPLLCSR & MY_SPLLCSR_SPLLVLD)); /* 等待PLL时钟有效 */
}

/**
  * @brief 系统模式时钟配置
  * @param void
  * @reval void
  * @attention
  * SYSCLK = CORECLK = 80MHz
  * BUS_CLK = 40MHz
  * FLASH_CLK = 26.7MHz
  */
static void NormalRUNmode_80MHz(void)
{
	SCG->RCCR = MY_RCCR_SCS_SPLL       /* SPLL作为系统时钟源 */
			    |MY_RCCR_DIVCORE_DIV2  /* SYSCLK = CORECLK = 80MHz */
			    |MY_RCCR_DIVBUS_DIV2   /* BUS_CLK = 40MHz */
				|MY_RCCR_DIVSLOW_DIV3; /* FLASH_CLK = 26.7MHz */
	while((SCG->CSR & MY_CSR_SCS_SPLL) != MY_CSR_SCS_SPLL); /* 等待SPLL作为系统时钟源*/
}

/**
  * @brief 系统时钟配置
  * @param void
  * @reval void
  */
void My_Sysclock_Config(void)
{
	SOSC_Init_8MHz(); /* SOSC配置为8MHz */
	SPLL_Init_160MHz(); /*SPLL输出配置为160MHz */
	NormalRUNmode_80MHz(); /* RUN模式80MHz */
}

#ifndef CLOCKS_AND_MODES_H
#define CLOCKS_AND_MODES_H

/* Includes ----------------------------------------------------------------------------*/
#include "S32K144.h"

/* 宏定义  ------------------------------------------------------------------------------*/

/* SOSCDIV寄存器相关数据定义 */
#define MY_SOSCDIV_SOSCDIV1_1 ((uint32_t)0x00000001)
#define MY_SOSCDIV_SOSCDIV2_1 ((uint32_t)0x00000100)
#define MY_SOSC_DIV1_AND_DIV2 (MY_SOSCDIV_SOSCDIV1_1 | MY_SOSCDIV_SOSCDIV2_1)

/* SOSCCFG寄存器相关数据定义 */
#define MY_SOSCCFG_EREFS ((uint32_t)0x00000004)
#define MY_SOSCCFG_HGO   ((uint32_t)0x00000000)
#define MY_SOSCCFG_RANGE ((uint32_t)0x00000030)
#define MY_SOSCCFG       (MY_SOSCCFG_EREFS | MY_SOSCCFG_HGO | MY_SOSCCFG_RANGE)

/* SOSCCSR寄存器相关数据定义 */
#define MY_SOSCCSR_LK        ((uint32_t)0x00800000)
#define MY_SOSCCSR_SOSCVLD   ((uint32_t)0x01000000)

/* SPLLCSR寄存器相关数据定义 */
#define MY_SPLLCSR_LK        ((uint32_t)0x00800000)
#define MY_SPLLCSR_SPLLVLD   (((uint32_t)0x01)<<24)

/* SPLLDIV寄存器相关数据定义 */
#define MY_SPLLDIV_SPLLDIV1_2        (((uint32_t)0x02)<<0)
#define MY_SPLLDIV_SPLLDIV2_4        (((uint32_t)0x03)<<8)
#define MY_SPLLDIV_SPLLDIV           (MY_SPLLDIV_SPLLDIV1_2 | MY_SPLLDIV_SPLLDIV2_4)

/* SPLLCFG寄存器相关数据定义 */
#define MY_SPLLCFG_SOURCE     	 ((uint32_t)0x00000000)
#define MY_SPLLCFG_PREDIV     	 ((uint32_t)0x00000000)
#define MY_SPLLCFG_MULT     	 (((uint32_t)0x10)<<16)
#define MY_SPLLCFG               (MY_SPLLCFG_SOURCE | MY_SPLLCFG_PREDIV | MY_SPLLCFG_MULT)

/* RCCR寄存器相关数据定义 */
#define MY_RCCR_SCS_SPLL     	 (((uint32_t)0x06)<<24)
#define MY_RCCR_DIVCORE_DIV2     (((uint32_t)0x01)<<16)
#define MY_RCCR_DIVBUS_DIV2      (((uint32_t)0x01)<<4)
#define MY_RCCR_DIVSLOW_DIV3     (((uint32_t)0x02)<<0)

/* CSR寄存器相关数据定义 */
#define MY_CSR_SCS_SPLL 	(((uint32_t)0x06)<<24)

/* 函数声明  -----------------------------------------------------------------------------*/
void My_Sysclock_Config(void);

#endif

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值