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