📄 stm32f10x_rcc.c
字号:
tmpreg |= RCC_PLLSource | RCC_PLLMul;
/* 存储新值 */
RCC->CFGR = tmpreg;
}
/**
* @简述 使能或失能 PLL.
* @注解 如果 PLL 作为系统时钟,则它不能停止.
* @参数 NewState: PLL 的新状态. 这个参数可以取: ENABLE 或 DISABLE.
* @返回 没有
*/
void RCC_PLLCmd(FunctionalState NewState)
{
/* 检查参数 */
assert_param(IS_FUNCTIONAL_STATE(NewState));
*(__IO uint32_t *) CR_PLLON_BB = (uint32_t)NewState;
}
#ifdef STM32F10X_CL
/**
* @简述 配置 PREDIV1 分频参数.
* @注解
* - 这个函数仅仅应用在 PLL 被禁止的时候.
* - 这个函数仅仅应用在 STM32 互联系列微处理器.
* @参数 RCC_PREDIV1_Source: 指定 PREDIV1 时钟源.
* 这个参数可以取下列值中的一个:
* RCC_PREDIV1_Source_HSE: HSE 作为 PREDIV1 时钟
* RCC_PREDIV1_Source_PLL2: PLL2 作为 PREDIV1 时钟
* @参数 RCC_PREDIV1_Div: 选定 PREDIV1 分频系数.
* 这个参数 RCC_PREDIV1_Divx 中 x可以取:[1,16]
* @返回 没有
*/
void RCC_PREDIV1Config(uint32_t RCC_PREDIV1_Source, uint32_t RCC_PREDIV1_Div)
{
uint32_t tmpreg = 0;
/* 检查参数 */
assert_param(IS_RCC_PREDIV1_SOURCE(RCC_PREDIV1_Source));
assert_param(IS_RCC_PREDIV1(RCC_PREDIV1_Div));
tmpreg = RCC->CFGR2;
/* 清 PREDIV1[3:0] 和 PREDIV1SRC 位 */
tmpreg &= ~(CFGR2_PREDIV1 | CFGR2_PREDIV1SRC);
/* Set the PREDIV1 clock source and division factor */
tmpreg |= RCC_PREDIV1_Source | RCC_PREDIV1_Div ;
/* 存储新值 */
RCC->CFGR2 = tmpreg;
}
/**
* @简述 配置 PREDIV2 分频参数.
* @注解
* - 这个函数仅仅应用在 PLL2,PLL3 被禁止的时候.
* - 这个函数仅仅应用在 STM32 互联系列微处理器.
* @参数 RCC_PREDIV2_Div: 选定 PREDIV2 分频系数.
* 这个参数 RCC_PREDIV2_Divx 中 x可以取:[1,16]
* @返回 没有
*/
void RCC_PREDIV2Config(uint32_t RCC_PREDIV2_Div)
{
uint32_t tmpreg = 0;
/* Check the parameters */
assert_param(IS_RCC_PREDIV2(RCC_PREDIV2_Div));
tmpreg = RCC->CFGR2;
/* Clear PREDIV2[3:0] bits */
tmpreg &= ~CFGR2_PREDIV2;
/* Set the PREDIV2 division factor */
tmpreg |= RCC_PREDIV2_Div;
/* Store the new value */
RCC->CFGR2 = tmpreg;
}
/**
* @简述 配置 PLL2 倍频系数.
* @注解
* - 这个函数仅仅应用在 PLL2 被禁止的时候.
* - 这个函数仅仅应用在 STM32 互联系列微处理器.
* @参数 RCC_PLL2Mul: 指定 PLL2 倍频系数.
* 这个参数 RCC_PLL2Mul_x 中 x可以取:{[8,14], 16, 20}
* @返回 没有
*/
void RCC_PLL2Config(uint32_t RCC_PLL2Mul)
{
uint32_t tmpreg = 0;
/* 检查参数 */
assert_param(IS_RCC_PLL2_MUL(RCC_PLL2Mul));
tmpreg = RCC->CFGR2;
/* 清 PLL2Mul[3:0] 位 */
tmpreg &= ~CFGR2_PLL2MUL;
/* 设置 PLL2 配置位 */
tmpreg |= RCC_PLL2Mul;
/* 存储参数 */
RCC->CFGR2 = tmpreg;
}
/**
* @简述 使能或失能 PLL2.
* @注解
* - 如果 PLL2 被用做系统时钟,它就不能被禁止
* (i.e.它被用作 PLL 时钟输入源,就是说被用作系统时钟).
* - 这个函数仅仅应用在 STM32 互联系列微处理器.
* @参数 NewState: PLL2 新的状态. 这个参数可以取: ENABLE 或 DISABLE.
* @返回 没有
*/
void RCC_PLL2Cmd(FunctionalState NewState)
{
/* 检查参数 */
assert_param(IS_FUNCTIONAL_STATE(NewState));
*(__IO uint32_t *) CR_PLL2ON_BB = (uint32_t)NewState;
}
/**
* @简述 配置 PLL3 倍频系数.
* @注解
* - 这个函数仅仅应用在 PLL3 被禁止的时候.
* - 这个函数仅仅应用在 STM32 互联系列微处理器.
* @参数 RCC_PLL3Mul: 指定 PLL3 倍频系数.
* 这个参数 RCC_PLL3Mul_x 中 x可以取:{[8,14], 16, 20}
* @返回 没有
*/
void RCC_PLL3Config(uint32_t RCC_PLL3Mul)
{
uint32_t tmpreg = 0;
/* 检查参数 */
assert_param(IS_RCC_PLL3_MUL(RCC_PLL3Mul));
tmpreg = RCC->CFGR2;
/* 清 PLL3Mul[3:0] 位 */
tmpreg &= ~CFGR2_PLL3MUL;
/* 设置 PLL3 配置位 */
tmpreg |= RCC_PLL3Mul;
/* 存储新值 */
RCC->CFGR2 = tmpreg;
}
/**
* @简述 使能或失能 PLL3.
* @注解 这个函数仅仅应用在 STM32 互联系列微处理器.
* @参数 NewState: PLL3 新的状态. 这个参数可以取: ENABLE 或 DISABLE.
* @返回 没有
*/
void RCC_PLL3Cmd(FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));
*(__IO uint32_t *) CR_PLL3ON_BB = (uint32_t)NewState;
}
#endif /* STM32F10X_CL */
/**
* @简述 配置系统时钟 (SYSCLK).
* @参数 RCC_SYSCLKSource: 指定作为系统时钟的时钟源.
* 这个参数可以选择下列中的一个:
* RCC_SYSCLKSource_HSI: 选定 HSI 作为系统时钟
* RCC_SYSCLKSource_HSE: 选定 HSE 作为系统时钟
* RCC_SYSCLKSource_PLLCLK:选定 PLL 作为系统时钟
* @返回 没有
*/
void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource)
{
uint32_t tmpreg = 0;
/* 检查参数 */
assert_param(IS_RCC_SYSCLK_SOURCE(RCC_SYSCLKSource));
tmpreg = RCC->CFGR;
/* 清 SW[1:0] 位 */
tmpreg &= CFGR_SW_Mask;
/* 设置 SW[1:0] 位为 RCC_SYSCLKSource 的值 */
tmpreg |= RCC_SYSCLKSource;
/* 存储新值 */
RCC->CFGR = tmpreg;
}
/**
* @简述 获得用作系统时钟的时钟源.
* @参数 没有
* @返回 作为系统时钟的时钟源.
* 这个返回值可以是下列之中的一个:
* 0x00: HSI 被用作系统时钟
* 0x04: HSE 被用作系统时钟
* 0x08: PLL 被用作系统时钟
*/
uint8_t RCC_GetSYSCLKSource(void)
{
return ((uint8_t)(RCC->CFGR & CFGR_SWS_Mask));
}
/**
* @简述 配置 AHB 时钟 (HCLK).
* @参数 RCC_SYSCLK: 定义 AHB 时钟分频. 这个时钟来源于系统时钟
* 这个参数可以取下列值中的一个:
* RCC_SYSCLK_Div1: AHB clock = SYSCLK
* RCC_SYSCLK_Div2: AHB clock = SYSCLK/2
* RCC_SYSCLK_Div4: AHB clock = SYSCLK/4
* RCC_SYSCLK_Div8: AHB clock = SYSCLK/8
* RCC_SYSCLK_Div16: AHB clock = SYSCLK/16
* RCC_SYSCLK_Div64: AHB clock = SYSCLK/64
* RCC_SYSCLK_Div128: AHB clock = SYSCLK/128
* RCC_SYSCLK_Div256: AHB clock = SYSCLK/256
* RCC_SYSCLK_Div512: AHB clock = SYSCLK/512
* @返回 没有
*/
void RCC_HCLKConfig(uint32_t RCC_SYSCLK)
{
uint32_t tmpreg = 0;
/* 检查参数 */
assert_param(IS_RCC_HCLK(RCC_SYSCLK));
tmpreg = RCC->CFGR;
/* 清 HPRE[3:0] 位 */
tmpreg &= CFGR_HPRE_Reset_Mask;
/* 设置 HPRE[3:0] 位为 RCC_SYSCLK 的值 */
tmpreg |= RCC_SYSCLK;
/* 存储新值 */
RCC->CFGR = tmpreg;
}
/**
* @简述 配置低速 APB 时钟 (PCLK1).
* @参数 RCC_HCLK: 配置 APB1 时钟分频. 这个时钟来源于 AHB 时钟 (HCLK).
* 这个参数可以取下列值中的一个:
* RCC_HCLK_Div1: APB1 clock = HCLK
* RCC_HCLK_Div2: APB1 clock = HCLK/2
* RCC_HCLK_Div4: APB1 clock = HCLK/4
* RCC_HCLK_Div8: APB1 clock = HCLK/8
* RCC_HCLK_Div16: APB1 clock = HCLK/16
* @返回 没有
*/
void RCC_PCLK1Config(uint32_t RCC_HCLK)
{
uint32_t tmpreg = 0;
/* 检查参数 */
assert_param(IS_RCC_PCLK(RCC_HCLK));
tmpreg = RCC->CFGR;
/* 清 PPRE1[2:0] 位 */
tmpreg &= CFGR_PPRE1_Reset_Mask;
/* 设置 PPRE1[2:0] 位为 RCC_HCLK 的值 */
tmpreg |= RCC_HCLK;
/* 存储新值 */
RCC->CFGR = tmpreg;
}
/**
* @简述 配置高速 APB 时钟 (PCLK2).
* @参数 RCC_HCLK: 配置 APB2 时钟分频. 这个时钟来源于 AHB 时钟 (HCLK).
* 这个参数可以取下列值中的一个:
* RCC_HCLK_Div1: APB1 clock = HCLK
* RCC_HCLK_Div2: APB1 clock = HCLK/2
* RCC_HCLK_Div4: APB1 clock = HCLK/4
* RCC_HCLK_Div8: APB1 clock = HCLK/8
* RCC_HCLK_Div16: APB1 clock = HCLK/16
* @返回 没有
*/
void RCC_PCLK2Config(uint32_t RCC_HCLK)
{
uint32_t tmpreg = 0;
/* 检查参数 */
assert_param(IS_RCC_PCLK(RCC_HCLK));
tmpreg = RCC->CFGR;
/* 清 PPRE2[2:0] 位 */
tmpreg &= CFGR_PPRE2_Reset_Mask;
/* 设置 PPRE2[2:0] 位为 RCC_HCLK 的值 */
tmpreg |= RCC_HCLK << 3;
/* 存储新值 */
RCC->CFGR = tmpreg;
}
/**
* @简述 使能或失能指定的 RCC 中断.
* @参数 RCC_IT: 待使能或者失能的RCC中断源.
*
* STM32_互联系列微处理器, 这个参数可以取下列值中的一个:
* RCC_IT_LSIRDY: LSI 准备中断
* RCC_IT_LSERDY: LSE 准备中断
* RCC_IT_HSIRDY: HSI 准备中断
* RCC_IT_HSERDY: HSE 准备中断
* RCC_IT_PLLRDY: PLL 准备中断
* RCC_IT_PLL2RDY: PLL2 准备中断
* RCC_IT_PLL3RDY: PLL3 准备中断
*
* 其它_STM32_微处理器, 这个参数可以取下列值中的一个:
* RCC_IT_LSIRDY: LSI 准备中断
* RCC_IT_LSERDY: LSE 准备中断
* RCC_IT_HSIRDY: HSI 准备中断
* RCC_IT_HSERDY: HSE 准备中断
* RCC_IT_PLLRDY: PLL 准备中断
*
* @参数 NewState: RCC 中断新的状态.
* 这个参数可以取: ENABLE 或 DISABLE.
* @返回 没有
*/
void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState)
{
/* 检查参数 */
assert_param(IS_RCC_IT(RCC_IT));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* 执行RCC_CIR[12:8]位的字节存取来使能选择的中断s */
*(__IO uint8_t *) CIR_BYTE2_ADDRESS |= RCC_IT;
}
else
{
/* 执行RCC_CIR[12:8]位的字节存取来禁止选择的中断 */
*(__IO uint8_t *) CIR_BYTE2_ADDRESS &= (uint8_t)~RCC_IT;
}
}
#ifndef STM32F10X_CL
/**
* @简述 配置 USB 时钟 (USBCLK).
* @参数 RCC_USBCLKSource: 指定 USB 的时钟源. 这个时钟来源于 PLL 输出.
* 这个参数可以取下列值中的一个:
* RCC_USBCLKSource_PLLCLK_1Div5: PLL 时钟的1.5分频用作 USB 时钟源
* RCC_USBCLKSource_PLLCLK_Div1: PLL 时钟用作 USB 时钟源
* @返回 没有
*/
void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource)
{
/* 检查参数 */
assert_param(IS_RCC_USBCLK_SOURCE(RCC_USBCLKSource));
*(__IO uint32_t *) CFGR_USBPRE_BB = RCC_USBCLKSource;
}
#else
/**
* @简述 配置 USB OTG FS 时钟 (OTGFSCLK).
* 这个函数仅仅应用在 STM32 互联系列微处理器.
* @参数 RCC_OTGFSCLKSource: 指定 USB OTG FS 时钟源.
* 这个时钟来源于 PLL 的输出.
* 这个参数可以取下列值中的一个:
* RCC_OTGFSCLKSource_PLLVCO_Div3: PLL VCO clock divided by 2 selected as USB OTG FS clock source
* RCC_OTGFSCLKSource_PLLVCO_Div2: PLL VCO clock divided by 2 selected as USB OTG FS clock source
* @返回 没有
*/
void RCC_OTGFSCLKConfig(uint32_t RCC_OTGFSCLKSource)
{
/* 检查参数 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -