📄 rccu.c
字号:
/****************************************Copyright (c)**************************************************
**
**
** 杭州央海软件科技有限公司
**
** http://www.armgcc.com
**
**--------------文件信息--------------------------------------------------------------------------------
** 文 件 名: rccu.c
** 创 建 人: 罗辉联
** 创建日期: 2006年5月10日
** 描 述: 该文件提供所有的RCCU软件操作功能
**
**--------------历史版本--------------------------------------------------------------------------------
** 创 建 人: 罗辉联
** 版 本: V1.0
** 日 期: 2006年5月10日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "rccu.h"
#if EN_ARM_RCCU > 0 //决定是否编译该文件
/******************************************* 全局变量定义 ***********************************************/
/******************************************* 局部函数声明 ***********************************************/
/*********************************************************************************************************
;** 函数名称: RCCU_PLL1Config
;** 功能描述: 配置 PLL1的 DIV 和 MUL 系数
;**
;** 参 数: new_mul:(RCCU_MUL_12, RCCU_MUL_16, RCCU_MUL_20, RCCU_MUL_28)
;** new_div:(RCCU_DIV_1, RCCU_DIV_2, RCCU_DIV_3, RCCU_DIV_4, RCCU_DIV_5, RCCU_DIV_6, RCCU_DIV_7)
;**
;** 返 回 值: 无
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void RCCU_PLL1Config(RCCU_PLL_MUL_T new_mul, RCCU_PLL_DIV_T new_div )
{
volatile UWORD32 temp = ( RCCU_PLL1CR & ~RCCU_MX_MASK ) | ( new_mul << RCCU_MX_INDEX );
RCCU_PLL1CR = ( temp & ~RCCU_DX_MASK ) | new_div | 0x40;
}
/*********************************************************************************************************
;** 函数名称: RCCU_PLL2Config
;** 功能描述: 配置 PLL2的 div 和 mul 系数
;**
;** 参 数: new_mul:(RCCU_MUL_12, RCCU_MUL_16, RCCU_MUL_20, RCCU_MUL_28)
;** new_div:(RCCU_DIV_1, RCCU_DIV_2, RCCU_DIV_3, RCCU_DIV_4, RCCU_DIV_5, RCCU_DIV_6, RCCU_DIV_7)
;**
;** 返 回 值: 无
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void RCCU_PLL2Config (RCCU_PLL_MUL_T new_mul, RCCU_PLL_DIV_T new_div)
{
volatile UWORD32 temp =(PCU_PLL2CR & ~RCCU_MX_MASK) | ( new_div << RCCU_MX_INDEX );
PCU_PLL2CR = ( temp & ~RCCU_DX_MASK ) | ( new_div | RCCU_FREEN_MASK );
}
/*********************************************************************************************************
;** 函数名称: RCCU_RCLKConfig
;** 功能描述: 选择RCLK的时钟源
;**
;** 参 数: new_clock:(RCCU_PLL1_OUTPU, RCCU_CLOCK2_16, RCCU_CLOCK2, RCCU_RTC_CLOCK)
;**
;** 返 回 值: 无
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void RCCU_RCLKConfig(RCCU_RCLK_CLOCKS_T new_clock)
{
switch (new_clock)
{
case RCCU_CLOCK2:
{
RCCU_CFR &= ~RCCU_CSU_CKSEL_MASK; //Resets the CSU_Cksel bit in clk_flag
RCCU_CFR |= RCCU_CK2_16_MASK; //Set the CK2_16 Bit in the CFR
RCCU_CCR &= ~RCCU_CKAF_SEL_MASK; //Deselect The CKAF
RCCU_PLL1CR=((RCCU_PLL1CR & ~RCCU_DX_MASK)|0x00000003) & ~RCCU_FREEN_MASK; //switch off the PLL1
break;
}
case RCCU_CLOCK2_16:
{
RCCU_CFR &= ~RCCU_CK2_16_MASK; //ReSet the CK2_16 Bit in the CFR
RCCU_CCR &= ~RCCU_CKAF_SEL_MASK; //Deselect The CKAF
RCCU_PLL1CR=((RCCU_PLL1CR & ~RCCU_DX_MASK)|0x00000003) & ~RCCU_FREEN_MASK; //switch off the PLL1
break;
}
case RCCU_PLL1_OUTPUT:
{
RCCU_CFR = RCCU_CFR | RCCU_CK2_16_MASK;//Set the CK2_16 Bit in the CFR
// Waits the PLL1 to lock if DX bits are different from '111',If all DX bit are set the PLL lock flag in meaningless
if (( RCCU_PLL1CR & 0x0007 ) != 7)
while(!(RCCU_CFR & RCCU_LOCK_MASK));
RCCU_CCR &= ~RCCU_CKAF_SEL_MASK; // Deselect The CKAF
RCCU_CFR |= RCCU_CSU_CKSEL_MASK; // Select The CSU_CKSEL
break;
}
case RCCU_RTC_CLOCK:
{
RCCU_CCR |= 0x04;
break;
}
}
}
/*********************************************************************************************************
;** 函数名称: RCCU_RCLKObtain
;** 功能描述: 获取系统PCLK选择的时钟源
;**
;** 参 数: 无
;**
;** 返 回 值: RCCU_RTC_CLOCK RCCU_CLOCK2_16 RCCU_PLL1_OUTPUT RCCU_CLOCK2
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
RCCU_RCLK_CLOCKS_T RCCU_RCLKObtain ( void )
{
if ((RCCU_CCR & 0x04)==0x04)
return RCCU_RTC_CLOCK;
else if ((RCCU_CFR & RCCU_CK2_16_MASK)==0)
return RCCU_CLOCK2_16;
else if (RCCU_CFR & RCCU_CSU_CKSEL_MASK)
return RCCU_PLL1_OUTPUT;
else
return RCCU_CLOCK2;
}
/*********************************************************************************************************
;** 函数名称: RCCU_USBCLKObtain
;** 功能描述: 获取USB选择的时钟源
;**
;** 参 数: 无
;**
;** 返 回 值: RCCU_USBCK RCCU_PLL2_OUTPUT
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
RCCU_USB_CLOCKS_T RCCU_USBCLKObtain (void)
{
if ((PCU_PLL2CR & RCCU_USBEN_MASK ) >> RCCU_USBEN_INDEX == 1 )
return RCCU_PLL2_OUTPUT;
else
return RCCU_USBCK;
}
/*********************************************************************************************************
;** 函数名称: RCCU_AnyClockObtain
;** 功能描述: 获得任何内部时钟频率
;**
;** 参 数: internal_clk:(RCCU_CLK2, RCCU_RCLK, RCCU_MCLK, RCCU_PCLK, RCCU_FCLK)
;**
;** 返 回 值: 无
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD32 RCCU_AnyClockObtain(RCCU_ClOCKS_T internal_clk)
{
volatile UWORD32 temp;
volatile UWORD8 div, mul;
RCCU_RCLK_CLOCKS_T current_RCLK;
temp = (RCCU_CKDIV2StatusObtain() == SET )?RCCU_MAIN_OSC/2 : RCCU_MAIN_OSC;
if(internal_clk == RCCU_CLK2 )
{
div = 1;
mul = 1;
}
else
{
current_RCLK = RCCU_RCLKObtain();
switch (current_RCLK )
{
case RCCU_CLOCK2_16:
div = 16;
mul = 1;
break;
case RCCU_CLOCK2:
div = 1;
mul = 1;
break;
case RCCU_PLL1_OUTPUT:
{
mul=(RCCU_PLL1CR & RCCU_MX_MASK ) >> RCCU_MX_INDEX;
switch (mul)
{
case 0: mul = 20; break;
case 1: mul = 12; break;
case 2: mul = 28; break;
case 3: mul = 16; break;
}
div = ( RCCU_PLL1CR & RCCU_DX_MASK) + 1;
break;
}
case RCCU_RTC_CLOCK :
mul = 1;
div = 1;
temp = RCCU_RTC_OSC;
break;
}
}
switch (internal_clk)
{
case RCCU_MCLK :{div <<= PCU_MDIVR & RCCU_FACT_MASK; break;}
case RCCU_PCLK :{div <<=(PCU_PDIVR & RCCU_FACT2_MASK) >> RCCU_FACT2_INDEX; break;}
case RCCU_FCLK :{div <<= PCU_PDIVR & 0x3; break;}
}
return (temp * mul) / div; //返回内部时钟频率值
}
/*********************************************************************************************************
;** 函数名称: RCCU_NormalMode
;** 功能描述: 设置系统为正常模式一般用在从系统的其他模式切换到正常模式
;**
;** 参 数: 无
;**
;** 返 回 值: 无
;**
;** 作 者: 罗辉联
;** 日 期: 2006年10月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void RCCU_NormalMode(void)
{
RCCU_PLL1CR = 0x07;
RCCU_RCLKConfig(RCCU_PLL1_OUTPUT);
}
#endif //EN_ARM_RCCU > 0
/****************************************end of file*******************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -