📄 stm32f10x_rcc.c
字号:
/*******************************************************************************
* 函数名称: 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 + -