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

📄 stm32f10x_rcc.c

📁 stm32f10xx的中文译文例程
💻 C
📖 第 1 页 / 共 3 页
字号:
/*******************************************************************************
* 函数名称: RCC_HCLKConfig
* 功能描述: 配置AHB时钟(HCLK).
* 输入参数: RCC_HCLK:定义了AHB时钟.这个时钟是从系统时钟(SYSCLK)得到的.
*                    这个参数可以是下面的值之一:
*                       - RCC_SYSCLK_Div1: AHB时钟等于SYSCLK
*                       - RCC_SYSCLK_Div2: AHB时钟等于SYSCLK/2
*                       - RCC_SYSCLK_Div4: AHB时钟等于SYSCLK/4
*                       - RCC_SYSCLK_Div8: AHB时钟等于SYSCLK/8
*                       - RCC_SYSCLK_Div16: AHB时钟等于SYSCLK/16
*                       - RCC_SYSCLK_Div64: AHB时钟等于SYSCLK/64
*                       - RCC_SYSCLK_Div128: AHB时钟等于SYSCLK128
*                       - RCC_SYSCLK_Div256: AHB时钟等于SYSCLK/256
*                       - RCC_SYSCLK_Div512: AHB时钟等于SYSCLK/512
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void RCC_HCLKConfig(u32 RCC_SYSCLK)
{
  u32 tmpreg = 0;

  /* Check the parameters [检查参数]*/
  assert_param(IS_RCC_HCLK(RCC_SYSCLK));

  tmpreg = RCC->CFGR;

  /* Clear HPRE[3:0] bits [清HPRE[3:0]位]*/
  tmpreg &= CFGR_HPRE_Reset_Mask;

  /* Set HPRE[3:0] bits according to RCC_SYSCLK value [依照RCC_SYSCLK的值设置HPRE[3:0]位]*/
  tmpreg |= RCC_SYSCLK;

  /* Store the new value [保存新的值]*/
  RCC->CFGR = tmpreg;
}

/*******************************************************************************
* 函数名称: RCC_PCLK1Config
* 功能描述: 配置低速APB时钟(PCLK1).
* 输入参数: RCC_PCLK1:定义APB1时钟.这个时钟是从AHB时钟得到的(HCLK).
*                    这个参数可以是下面的值之一:
*                       - RCC_HCLK_Div1: APB1时钟等于HCLK
*                       - RCC_HCLK_Div2: APB1时钟等于HCLK/2
*                       - RCC_HCLK_Div4: APB1时钟等于HCLK/4
*                       - RCC_HCLK_Div8: APB1时钟等于HCLK/8
*                       - RCC_HCLK_Div16: APB1时钟等于HCLK/16
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void RCC_PCLK1Config(u32 RCC_HCLK)
{
  u32 tmpreg = 0;

  /* Check the parameters [检查参数]*/
  assert_param(IS_RCC_PCLK(RCC_HCLK));

  tmpreg = RCC->CFGR;

  /* Clear PPRE1[2:0] bits [清PPRE1[2:0]位]*/
  tmpreg &= CFGR_PPRE1_Reset_Mask;

  /* Set PPRE1[2:0] bits according to RCC_HCLK value [依照RCC_HCLK的值设置PPRE1[2:0]位]*/
  tmpreg |= RCC_HCLK;

  /* Store the new value [保存新的值]*/
  RCC->CFGR = tmpreg;
}

/*******************************************************************************
* 函数名称: RCC_PCLK2Config
* 功能描述: 配置APB时钟(PCLK2).
* 输入参数: RCC_PCLK2:定义APB2时钟.这个时钟是从AHB时钟得到的(HCLK).
*                    这个参数可以是下面的值之一:
*                       - RCC_HCLK_Div1: APB2时钟等于HCLK
*                       - RCC_HCLK_Div2: APB2时钟等于HCLK/2
*                       - RCC_HCLK_Div4: APB2时钟等于HCLK/4
*                       - RCC_HCLK_Div8: APB2时钟等于HCLK/8
*                       - RCC_HCLK_Div16: APB2时钟等于HCLK/16
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void RCC_PCLK2Config(u32 RCC_HCLK)
{
  u32 tmpreg = 0;

  /* Check the parameters [检查参数]*/
  assert_param(IS_RCC_PCLK(RCC_HCLK));

  tmpreg = RCC->CFGR;

  /* Clear PPRE2[2:0] bits [清PPRE2[2:0]位]*/
  tmpreg &= CFGR_PPRE2_Reset_Mask;

  /* Set PPRE2[2:0] bits according to RCC_HCLK value [依照RCC_HCLK的值设置PPRE2[2:0]位]*/
  tmpreg |= RCC_HCLK << 3;

  /* Store the new value [保存新的值]*/
  RCC->CFGR = tmpreg;
}

/*******************************************************************************
* 函数名称: RCC_ITConfig
* 功能描述: 使能或关闭特定的RCC中断.
* 输入参数: (1)RCC_IT:指定要使能或要关闭的RCC中断源.
*                    这个参数可以是下面任意值的组合:
*                       - RCC_IT_LSIRDY: LSI就绪中断
*                       - RCC_IT_LSERDY: LSE就绪中断
*                       - RCC_IT_HSIRDY: HSI就绪中断
*                       - RCC_IT_HSERDY: HSE就绪中断
*                       - RCC_IT_PLLRDY: PLL就绪中断
*           (2)NewState:指定的RCC中断的新状态.这个参数可以是:ENABLE或DISABLE
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void RCC_ITConfig(u8 RCC_IT, FunctionalState NewState)
{
  /* Check the parameters [检查参数]*/
  assert_param(IS_RCC_IT(RCC_IT));
  assert_param(IS_FUNCTIONAL_STATE(NewState));

  if (NewState != DISABLE)
  {
    /* Perform Byte access to RCC_CIR[12:8] bits to enable the selected interrupts [执行RCC_CIR[12:8]位的字节存取来使能选择的中断]*/
    *(vu8 *) CIR_BYTE2_ADDRESS |= RCC_IT;
  }
  else
  {
    /* Perform Byte access to RCC_CIR[12:8] bits to disable the selected interrupts [执行RCC_CIR[12:8]位的字节存取来禁止选择的中断]*/
    *(vu8 *) CIR_BYTE2_ADDRESS &= (u8)~RCC_IT;
  }
}

/*******************************************************************************
* 函数名称: RCC_USBCLKConfig
* 功能描述: 配置USB时钟(USBCLK).
* 输入参数: RCC_USBCLKSource:指定USB时钟源,这个时钟来源于PLL输出.
*                    这个参数可以是下面的值之一:
*                       - RCC_USBCLKSource_PLLCLK_1Div5: USB时钟源等于选定的PLL时钟的1.5分频
*                       - RCC_USBCLKSource_PLLCLK_Div1: USB时钟源等于选定的PLL时钟
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void RCC_USBCLKConfig(u32 RCC_USBCLKSource)
{
  /* Check the parameters [检查参数]*/
  assert_param(IS_RCC_USBCLK_SOURCE(RCC_USBCLKSource));

  *(vu32 *) CFGR_USBPRE_BB = RCC_USBCLKSource;
}

/*******************************************************************************
* 函数名称: RCC_ADCCLKConfig
* 功能描述: 配置ADC时钟(ADCCKL).
* 输入参数: RCC_ADCCLK:定义了ADC时钟.这个时钟来自APB2时钟(PCLK2).
*                    这个参数可以是下面的值之一:
*                       - RCC_PCLK2_Div2: ADC时钟等于PCLK2/2
*                       - RCC_PCLK2_Div4: ADC时钟等于PCLK2/4
*                       - RCC_PCLK2_Div6: ADC时钟等于PCLK2/6
*                       - RCC_PCLK2_Div8: ADC时钟等于PCLK2/8
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void RCC_ADCCLKConfig(u32 RCC_PCLK2)
{
  u32 tmpreg = 0;

  /* Check the parameters [检查参数]*/
  assert_param(IS_RCC_ADCCLK(RCC_PCLK2));

  tmpreg = RCC->CFGR;

  /* Clear ADCPRE[1:0] bits [清ADCPRE[1:0]位]*/
  tmpreg &= CFGR_ADCPRE_Reset_Mask;

  /* Set ADCPRE[1:0] bits according to RCC_PCLK2 value [依照RCC_PCLK2的值设置ADCPRE[1:0]位]*/
  tmpreg |= RCC_PCLK2;

  /* Store the new value [保存新的值]*/
  RCC->CFGR = tmpreg;
}

/*******************************************************************************
* 函数名称: RCC_LSEConfig
* 功能描述: 配置外部低速振荡器(LSE).
* 输入参数: RCC_LSE:LSE的新状态。
*                    这个参数可以是下面的值之一:
*                       - RCC_LSE_OFF: LSE振荡器关闭
*                       - RCC_LSE_ON: LSE振荡器开启
*                       - RCC_LSE_Bypass: 带有外部时钟的LSE振荡器
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void RCC_LSEConfig(u8 RCC_LSE)
{
  /* Check the parameters [检查参数]*/
  assert_param(IS_RCC_LSE(RCC_LSE));

  /* Reset LSEON and LSEBYP bits before configuring the LSE [在配置LSE之前复位LSEON和LSEBYP]*/
  /* Reset LSEON bit [复位LSEON]*/
  *(vu8 *) BDCR_ADDRESS = RCC_LSE_OFF;

  /* Reset LSEBYP bit [复位LSEBYP]*/
  *(vu8 *) BDCR_ADDRESS = RCC_LSE_OFF;

  /* Configure LSE (RCC_LSE_OFF is already covered by the code section above) [配置LSE(RCC_LSE_OFF已经被部分代码上隐藏)]*/
  switch(RCC_LSE)
  {
    case RCC_LSE_ON:
      /* Set LSEON bit [置位LSEON]*/
      *(vu8 *) BDCR_ADDRESS = RCC_LSE_ON;
      break;
      
    case RCC_LSE_Bypass:
      /* Set LSEBYP and LSEON bits [置位LSEBYP和LSEON]*/
      *(vu8 *) BDCR_ADDRESS = RCC_LSE_Bypass | RCC_LSE_ON;
      break;            
      
    default:
      break;      
  }
}

/*******************************************************************************
* 函数名称: RCC_LSICmd
* 功能描述: 使能或关闭内部低速振荡器(LSI).
*                  如果IWDG运行,则LSI不能被禁止。
* 输入参数: NewState:LSI的新状态。这个参数的值可以是:ENABLE或DISABLE
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void RCC_LSICmd(FunctionalState NewState)
{
  /* Check the parameters [检查参数]*/
  assert_param(IS_FUNCTIONAL_STATE(NewState));

  *(vu32 *) CSR_LSION_BB = (u32)NewState;
}

/*******************************************************************************
* 函数名称: RCC_RTCCLKConfig
* 功能描述: 配置RTC时钟(RTCCLK).
*                  只要选择了RTC时钟,RTC时钟就不能改变直到备份域复位.
* 输入参数: RCC_RTCCLKSource:RTC时钟源.
*                    这个参数可以是下面的值之一:
*                       - RCC_RTCCLKSource_LSE: 选择LSE作为RTC时钟
*                       - RCC_RTCCLKSource_LSI: 选择LSI作为RTC时钟
*                       - RCC_RTCCLKSource_HSE_Div128: 选择HSE时钟的128分频作为RTC时钟
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void RCC_RTCCLKConfig(u32 RCC_RTCCLKSource)
{
  /* Check the parameters [检查参数]*/
  assert_param(IS_RCC_RTCCLK_SOURCE(RCC_RTCCLKSource));

  /* Select the RTC clock source [选择RTC时钟源]*/
  RCC->BDCR |= RCC_RTCCLKSource;
}

/*******************************************************************************
* 函数名称: RCC_RTCCLKCmd
* 功能描述: 使能或关闭RTC时钟.
*                  仅当使用RCC_RTCCLKConfig函数选择RTC时钟后,才使用这个函数.
* 输入参数: NewState:.RTC时钟的新状态.这个参数可以是:ENABLE或DISABLE.
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void RCC_RTCCLKCmd(FunctionalState NewState)
{
  /* Check the parameters [检查参数]*/
  assert_param(IS_FUNCTIONAL_STATE(NewState));

  *(vu32 *) BDCR_RTCEN_BB = (u32)NewState;
}

/*******************************************************************************
* 函数名称: RCC_GetClocksFreq
* 功能描述: 返回片上时钟的不同频率.
* 输入参数: RCC_Clocks:指向包括时钟频率的RCC_ClocksTypeDef结构的指针。
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
{
  u32 tmp = 0, pllmull = 0, pllsource = 0, presc = 0;

  /* Get SYSCLK source [取得系统时钟源]*/
  tmp = RCC->CFGR & CFGR_SWS_Mask;

  switch (tmp)
  {
    case 0x00:  /* HSI used as system clock [HSI作为系统时钟]*/
      RCC_Clocks->SYSCLK_Frequency = HSI_Value;
      break;

    case 0x04:  /* HSE used as system clock [HSE作为系统时钟]*/
      RCC_Clocks->SYSCLK_Frequency = HSE_Value;
      break;

    case 0x08:  /* PLL used as system clock [PLL作为系统时钟]*/
      /* Get PLL clock source and multiplication factor [取得PLL的时钟源和倍增因数]-*/
      pllmull = RCC->CFGR & CFGR_PLLMull_Mask;
      pllmull = ( pllmull >> 18) + 2;

      pllsource = RCC->CFGR & CFGR_PLLSRC_Mask;

      if (pllsource == 0x00)
      {/* HSI oscillator clock divided by 2 selected as PLL clock entry [选择HSI振荡器时钟除以2作为PLL的时钟输入]*/
        RCC_Clocks->SYSCLK_Frequency = (HSI_Value >> 1) * pllmull;
      }
      else
      {/* HSE selected as PLL clock entry [选择HSE作为PLL的时钟输入]*/

        if ((RCC->CFGR & CFGR_PLLXTPRE_Mask) != (u32)RESET)
        {/* HSE oscillator clock divided by 2 [HSE振荡器时钟除以2]**/

          RCC_Clocks->SYSCLK_Frequency = (HSE_Value >> 1) * pllmull;
        }
        else
        {
          RCC_Clocks->SYSCLK_Frequency = HSE_Value * pllmull;
        }
      }
      break;

    default:
      RCC_Clocks->SYSCLK_Frequency = HSI_Value;
      break;
  }

  /* Compute HCLK, PCLK1, PCLK2 and ADCCLK clocks frequencies [计算HCLK, PCLK1, PCLK2和ADCCLK时钟频率]*/
  /* Get HCLK prescaler */
  tmp = RCC->CFGR & CFGR_HPRE_Set_Mask;
  tmp = tmp >> 4;
  presc = APBAHBPrescTable[tmp];

  /* HCLK clock frequency [HCLK的时钟频率]*/
  RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc;

  /* Get PCLK1 prescaler [计算HCLK1的预分频]*/
  tmp = RCC->CFGR & CFGR_PPRE1_Set_Mask;
  tmp = tmp >> 8;
  presc = APBAHBPrescTable[tmp];

  /* PCLK1 clock frequency [PCLK1的时钟频率]*/
  RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc;

  /* Get PCLK2 prescaler [取得PCLK2的预分频]*/
  tmp = RCC->CFGR & CFGR_PPRE2_Set_Mask;
  tmp = tmp >> 11;
  presc = APBAHBPrescTable[tmp];

  /* PCLK2 clock frequency [PCLK2的时钟频率]*/
  RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc;

  /* Get ADCCLK prescaler [取得ADCCLK的预分频]*/
  tmp = RCC->CFGR & CFGR_ADCPRE_Set_Mask;

⌨️ 快捷键说明

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