⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rccu.c

📁 STR71X ARM 启动代码, 与网上的大多数移植代码有些不一样
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                                      
**                                          
**                               杭州央海软件科技有限公司
**
**                                 http://www.osmcu.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; //返回内部时钟频率值
}

#endif //EN_ARM_RCCU > 0

/****************************************end of file*******************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -