📄 stm32f10x_rcc.c
字号:
/* Check the parameters */
assert(IS_RCC_ADCCLK(RCC_ADCCLK));
tmpreg = RCC->CFGR;
/* Clear ADCPRE[15:14] bits */
tmpreg &= CFGR_ADCPRE_Reset_Mask;
/* Set ADCPRE[15:14] bits according to RCC_ADCCLK value */
tmpreg |= RCC_ADCCLK;
/* Store the new value */
RCC->CFGR = tmpreg;
}
/*******************************************************************************
* Function Name : RCC_LSEConfig
* Description : Configures the External Low Speed oscillator (LSE).
* Input : - RCC_LSE: specifies the new state of the LSE.
* This parameter can be one of the following values:
* - RCC_LSE_OFF: LSE oscillator OFF
* - RCC_LSE_ON: LSE oscillator ON
* - RCC_LSE_Bypass: LSE oscillator bypassed with external
* clock
* Output : None
* Return : None
*******************************************************************************/
void RCC_LSEConfig(u32 RCC_LSE)
{
/* Check the parameters */
assert(IS_RCC_LSE(RCC_LSE));
/* Reset LSEON and LSEBYP bits before configuring the LSE ------------------*/
/* Reset LSEON bit */
*(vu8 *) BDCR_BASE = RCC_LSE_OFF;
/* Reset LSEBYP bit */
*(vu8 *) BDCR_BASE = RCC_LSE_Bypass;
/* Configure LSE (RCC_LSE_OFF is already covered by the code section above) */
switch(RCC_LSE)
{
case RCC_LSE_ON:
/* Set LSEON bit */
*(vu8 *) BDCR_BASE = RCC_LSE_ON;
break;
case RCC_LSE_Bypass:
/* Set LSEBYP and LSEON bits */
*(vu8 *) BDCR_BASE = RCC_LSE_Bypass | RCC_LSE_ON;
break;
default:
break;
}
}
/*******************************************************************************
* Function Name : RCC_LSICmd 写入0或1来使能或禁能LSI
* Description : Enables or disables the Internal Low Speed oscillator (LSI).
* LSI can not be disabled if the IWDG is running.
* Input : - NewState: new state of the LSI.
* This parameter can be: ENABLE or DISABLE.
* Output : None
* Return : None
*******************************************************************************/
void RCC_LSICmd(FunctionalState NewState)
{
/* Check the parameters */
assert(IS_FUNCTIONAL_STATE(NewState));
*(vu32 *) CSR_LSION_BB = (u32)NewState;
}
/*******************************************************************************
* Function Name : RCC_RTCCLKConfig
* Description : Configures the RTC clock (RTCCLK).
* Once the RTC clock is selected it can be changed unless the
* Backup domain is reset.
* Input : - RCC_RTCCLKSource: specifies the RTC clock source.
* This parameter can be one of the following values:
* - RCC_RTCCLKSource_LSE: LSE selected as RTC clock
* - RCC_RTCCLKSource_LSI: LSI selected as RTC clock
* - RCC_RTCCLKSource_HSE_Div128: HSE clock divided by 128
* selected as RTC clock
* Output : None
* Return : None
******************************************************************************自己稍有修改*/
void RCC_RTCCLKConfig(u32 RCC_RTCCLKSource)
{
u32 tmpreg = 0;
/* Check the parameters */
assert(IS_RCC_RTCCLK_SOURCE(RCC_RTCCLKSource));
tmpreg = RCC->BDCR;
/* Clear 0 RTCSEL[8:9] */
tmpreg&= RCC_RTCCLKSource_Mask;
/* Select the RTC clock source */
tmpreg|= RCC_RTCCLKSource;
/* Stroe the new value*/
RCC->BDCR=tmpreg;
}
/*******************************************************************************
* Function Name : RCC_RTCCLKCmd 使能或禁能RTC的时钟
* Description : Enables or disables the RTC clock.
* This function must be used only after the RTC clock was
* selected using the RCC_RTCCLKConfig function.
* Input : - NewState: new state of the RTC clock.
* This parameter can be: ENABLE or DISABLE.
* Output : None
* Return : None
*******************************************************************************/
void RCC_RTCCLKCmd(FunctionalState NewState)
{
/* Check the parameters */
assert(IS_FUNCTIONAL_STATE(NewState));
*(vu32 *) BDCR_RTCEN_BB = (u32)NewState;
}
/*******************************************************************************
* Function Name : RCC_GetClocksFreq
* Description : Returns the frequencies of different on chip clocks.
* Input : - RCC_Clocks: pointer to a RCC_ClocksTypeDef structure which
* will hold the clocks frequencies.
* Output : None
* Return : None
*******************************************************************************/
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 */
RCC_Clocks->SYSCLK_Frequency = HSI_Value;
break;
case 0x04: /* HSE used as system clock */
RCC_Clocks->SYSCLK_Frequency = HSE_Value;
break;
case 0x08: /* PLL used as system clock */
/* Get PLL clock source and multiplication factor ----------------------*/
pllmull = RCC->CFGR & CFGR_PLLMull_Mask; /*先得出CFGR中PLL的倍频因子PLLMull[18:21]*/
pllmull = ( pllmull >> 18) + 2; /*将其右移18位,因为0000代表2倍频,所以还要都加2*/
pllsource = RCC->CFGR & CFGR_PLLSRC_Mask; /*得出CFGR中PLLSRC的值(表示选用HSI 2分频或HSE作为PLL时钟输入)*/
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; /*HSI>>1,将HSI 2分频,然后乘上pll倍频因子*/
}
else
{/* HSE selected as PLL clock entry */
if ((RCC->CFGR & CFGR_PLLXTPRE_Mask) != (u32)RESET) /*如果PLLXTPRE该位置1,HSE 2分频*/
{/* HSE oscillator clock divided by 2 */
RCC_Clocks->SYSCLK_Frequency = (HSE_Value >> 1) * pllmull; /*HSI>>1,将HSE 2分频,然后乘上pll倍频因子*/
}
else /*PLLXTPRE置0,HSE不分频*/
{
RCC_Clocks->SYSCLK_Frequency = HSE_Value * pllmull;
}
}
break;
default:
RCC_Clocks->SYSCLK_Frequency = HSI_Value;
break;
}
/* Compute HCLK, PCLK1, PCLK2 and ADCCLK clocks frequencies ----------------*/
/* Get HCLK prescaler */
tmp = RCC->CFGR & CFGR_HPRE_Set_Mask; /*AHB 预分频系数HPRE[4:7]的值放入tmp*/
tmp = tmp >> 4; /* tmp high bits all be set 0,low 4 bits is HPRE[4:7], 0~15 */
presc = APBAHBPrescTable[tmp]; /* HCLK is divided by SYSCLK 分频,该数组代表了分频系数,
前面APBAHBPrescTable[16]定义有问题,应做修改*/
/* HCLK clock frequency presc is 0,1,2,3,4,6,7,8,9 */
RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc; //*左移一位是2分频,移9位是512分频*/
/* Get PCLK1 prescaler */
tmp = RCC->CFGR & CFGR_PPRE1_Set_Mask;
tmp = tmp >> 8;
presc = APBAHBPrescTable2[tmp];/*我重新定义了数组APBAHBPrescTable2[tmp]*/
/* PCLK1 clock frequency */
RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc; /* APB1 PCLK1 is divided by HCLK */
/* Get PCLK2 prescaler */
tmp = RCC->CFGR & CFGR_PPRE2_Set_Mask;
tmp = tmp >> 11;
presc = APBAHBPrescTable2[tmp];/*我重新定义了数组APBAHBPrescTable2[tmp]*/
/* PCLK2 clock frequency */
RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
/* Get ADCCLK prescaler */
tmp = RCC->CFGR & CFGR_ADCPRE_Set_Mask;
tmp = tmp >> 14;
presc = ADCPrescTable[tmp];
/* ADCCLK clock frequency */
RCC_Clocks->ADCCLK_Frequency = RCC_Clocks->PCLK2_Frequency / presc; /*ADCCLK divided by PCLK2 */
}
/*******************************************************************************
* Function Name : RCC_AHBPeriphClockCmd
* Description : Enables or disables the AHB peripheral clock.
* Input : - RCC_AHBPeriph: specifies the AHB peripheral to gates its clock.
* This parameter can be any combination of the following values:
* - RCC_AHBPeriph_DMA
* - RCC_AHBPeriph_SRAM
* - RCC_AHBPeriph_FLITF
* SRAM and FLITF clock can be disabled only during sleep mode.
* - NewState: new state of the specified peripheral clock.
* This parameter can be: ENABLE or DISABLE.
* Output : None
* Return : None
*******************************************************************************/
void RCC_AHBPeriphClockCmd(u32 RCC_AHBPeriph, FunctionalState NewState)
{
/* Check the parameters */
assert(IS_RCC_AHB_PERIPH(RCC_AHBPeriph));
assert(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
RCC->AHBENR |= RCC_AHBPeriph; /*Enable the AHBPeriph*/
}
else
{
RCC->AHBENR &= ~RCC_AHBPeriph; /*Disable the AHBPeriph*/
}
}
/*******************************************************************************
* Function Name : RCC_APB2PeriphClockCmd
* Description : Enables or disables the High Speed APB (APB2) peripheral clock.
* Input : - RCC_APB2Periph: specifies the APB2 peripheral to gates its
* clock.
* This parameter can be any combination of the following values:
* - RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB
* RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE
* RCC_APB2Periph_ADC1, RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1
* RCC_APB2Periph_SPI1, RCC_APB2Periph_USART1, RCC_APB2Periph_ALL
* - NewState: new state of the specified peripheral clock.
* This parameter can be: ENABLE or DISABLE.
* Output : None
* Return : None
*******************************************************************************/
void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph, FunctionalState NewState)
{
/* Check the parameters */
assert(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
assert(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
RCC->APB2ENR |= RCC_APB2Periph;
}
else
{
RCC->APB2ENR &= ~RCC_APB2Periph;
}
}
/*******************************************************************************
* Function Name : RCC_APB1PeriphClockCmd
* Description : Enables or disables the Low Speed APB (APB1) peripheral clock.
* Input : - RCC_APB1Periph: specifies the APB1 peripheral to gates its
* clock.
* This parameter can be any combination of the following values:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -