当前位置:首页 > STM32F10x - RCC - 图文
{
u32 tmp = 0, pllmull = 0, pllsource = 0, presc = 0;
/* Get SYSCLK source -------------------------------------------------------*/ tmp = RCC->CFGR & CFGR_SWS_Mask;//#define CFGR_SWS_Mask ((u32) 0x0000 000C)
switch (tmp)// RCC_CFGR.SWS[1:0]状态定义:00(HSI做系统时钟),01(HSE),10(PLL),11(不可用) {
case 0x00: /* HSI used as system clock */
RCC_Clocks->SYSCLK_Frequency = HSI_Value; //#define HSI_Value ((u32)8000000) break;
case 0x04: /* HSE used as system clock */
RCC_Clocks->SYSCLK_Frequency = HSE_Value;// #define HSE_Value ((u32)8000000) break;
case 0x08: /* PLL used as system clock */
/* Get PLL clock source and multiplication factor ----------------------*/
pllmull = RCC->CFGR & CFGR_PLLMull_Mask;// #define CFGR_PLLMull_Mask ((u32)0x003C 0000)//读倍频系数 pllmull = ( pllmull >> 18) + 2;
//CFGR. PLLMUL[3:0]在bit21-18,倍频系数pllmull+2=实际倍频数。(定义-实际 的关系)
pllsource = RCC->CFGR & CFGR_PLLSRC_Mask;// #define CFGR_PLLSRC_Mask ((u32)0x0001 0000)
//bit16:0--HSI/2; 1--(HSE(bit17=0) 或 HSE/2(bit17=1))
if (pllsource == 0x00)
{/* HSI oscillator clock divided by 2 selected as PLL clock entry */ RCC_Clocks->SYSCLK_Frequency = (HSI_Value >> 1) * pllmull;//HSI/2 }
else//pllsource==0x0001 0000
{/* HSE selected as PLL clock entry */
if ((RCC->CFGR & CFGR_PLLXTPRE_Mask) != (u32)RESET)//判断Bit17是否为1??HSE/2 {/* HSE oscillator clock divided by 2 */
RCC_Clocks->SYSCLK_Frequency = (HSE_Value >> 1) * pllmull; } else {
RCC_Clocks->SYSCLK_Frequency = HSE_Value * pllmull; //判断Bit17是否为0?-> HSE } }
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;//Bit7-4 tmp = tmp >> 4;
presc = APBAHBPrescTable[tmp];
//static uc8 APBAHBPrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9};
//前8个数字对应APB2、APB1(三位分频值,首位为0不分频),后8个数字对应AHB(四位分频值,首位位0不分频)。 //AHB无32分频
/* HCLK clock frequency */
RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc;//AHB由SYSCLK分频获得
/* Get PCLK1 prescaler */
tmp = RCC->CFGR & CFGR_PPRE1_Set_Mask; //Bit10-8—APB1 tmp = tmp >> 8;
presc = APBAHBPrescTable[tmp];
/* PCLK1 clock frequency */
RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc; //APB1由AHB分频获得
/* Get PCLK2 prescaler */
tmp = RCC->CFGR & CFGR_PPRE2_Set_Mask; //Bit13-11—APB2 tmp = tmp >> 11;
presc = APBAHBPrescTable[tmp];
/* PCLK2 clock frequency */
RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc; //APB2由AHB分频获得
/* Get ADCCLK prescaler */
tmp = RCC->CFGR & CFGR_ADCPRE_Set_Mask;//bit15-14 tmp = tmp >> 14;
presc = ADCPrescTable[tmp]; //static uc8 ADCPrescTable[4] = {2, 4, 6, 8};
/* ADCCLK clock frequency */
RCC_Clocks->ADCCLK_Frequency = RCC_Clocks->PCLK2_Frequency / presc; }
备注:查取所有的频率,然后供后续函数调用其中任何一个.
15.2.21 函数RCC_AHBPeriphClockCmd
Table 370. 函数RCC_AHBPeriphClockCmd 函数名 RCC_AHBPeriphClockCmd void RCC_AHBPeriphClockCmd(u32 RCC_AHBPeriph, 函数原形 FunctionalState NewState) 功能描述 使能或失能 AHB外设时钟 RCC_AHBPeriph:门控AHB外设时钟 输入参数 1 参阅Section:RCC_AHBPeriph查阅更多该参数允许取值范围 NewState:指定外设时钟的新状态 输入参数 2 参数取值:ENABLE 或 DISABLE 输出参数 无 返回值 无 先决条件 无 被调用函数 无 RCC_AHBPeriph:该参数被门控的AHB外设时钟,可以取下表的一个或者多个取值的组合作为该参数的值。 Table 371. RCC_AHBPeriph值(1) RCC_AHBPeriph 描述 #define值 备注 RCC_AHBPeriph_DMA DMA时钟 RCC_AHBPeriph_SRAM SRAM时钟 RCC_AHBPeriph_FLITF FLITF时钟 Flashinterface 1.SRAM和FLITF时钟只能在睡眠(SLEEP)模式下被失能。 参数RCC_AHBPeriph的值 描述/RCC_AHBENR #define值 备注 RCC_AHBPeriph_DMA1 DMA1时钟 ((u32)0x00000001) bit0 RCC_AHBPeriph_DMA2 DMA2时钟 ((u32)0x00000002) bit1 RCC_AHBPeriph_SRAM SRAM时钟 ((u32)0x00000004) bit3 RCC_AHBPeriph_FLITF FLITF时钟 ((u32)0x00000010) bit5/FlashInterface RCC_AHBPeriph_CRC CRC时钟 ((u32)0x00000040) bit6 RCC_AHBPeriph_FSMC FSMC时钟 ((u32)0x00000100) bit8 RCC_AHBPeriph_SDIO SDIO时钟 ((u32)0x00000400) bit10 例:
/* Enable DMA clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA,ENABLE); 函数原型如下:
void RCC_AHBPeriphClockCmd(u32 RCC_AHBPeriph, FunctionalState NewState) {
/* Check the parameters */
assert_param(IS_RCC_AHB_PERIPH(RCC_AHBPeriph));
// #define IS_RCC_AHB_PERIPH(PERIPH) ((((PERIPH) & 0xFFFFFAA8) == 0x00) && ((PERIPH) != 0x00)) assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE) { RCC->AHBENR |= RCC_AHBPeriph; } else { RCC->AHBENR &= ~RCC_AHBPeriph; } }
15.2.22 函数RCC_APB2PeriphClockCmd
Table 372. 函数RCC_APB2PeriphClockCmd 函数名 RCC_APB2PeriphClockCmd void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph, FunctionalState NewState) 功能描述 使能或失能 APB2外设时钟 RCC_APB2Periph:门控APB2外设时钟 输入参数 1 参阅Section:RCC_APB2Periph 查阅更多该参数允许取值范围 NewState:指定外设时钟的新状态 输入参数 2 参数取值:ENABLE或 DISABLE 输出参数 无 返回值 无 先决条件 无 被调用函数 无 RCC_APB2Periph:该参数被门控的APB2外设时钟,可以取下表的一个或者多个取值的组合作为该参数的值。 Table 373. RCC_AHB2Periph 值 参数RCC_AHB2Periph的值 描述 #define值 备注 RCC_APB2Periph_AFIO 功能复用IO时钟 0x00000001 RCC_APB2Periph_GPIOA GPIOA时钟 0x00000004 RCC_APB2Periph_GPIOB GPIOB时钟 0x00000008 RCC_APB2Periph_GPIOC GPIOC时钟 0x00000010 RCC_APB2Periph_GPIOD GPIOD时钟 0x00000020 RCC_APB2Periph_GPIOE GPIOE时钟 0x00000040 RCC_APB2Periph_GPIOF GPIOE时钟 0x00000080 RCC_APB2Periph_GPIOG GPIOE时钟 0x00000100 RCC_APB2Periph_ADC1 ADC1时钟 0x00000200 RCC_APB2Periph_ADC2 ADC2时钟 0x00000400 RCC_APB2Periph_TIM1 TIM1时钟 0x00000800 RCC_APB2Periph_SPI1 SPI1时钟 0x00001000 RCC_APB2Periph_TIM8 TIM8 0x00002000 RCC_APB2Periph_USART1 USART1时钟 0x00004000 RCC_APB2Periph_ADC3 ADC3时钟 0x00008000 RCC_APB2Periph_ALL 全部APB2外设时钟 0x0000FFFD 例: 函数原形 /* Enable GPIOA, GPIOB and SPI1 clocks */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_SPI1, ENABLE); 函数原型如下:
void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph, FunctionalState NewState) {
/* Check the parameters */
assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
// #define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFFF0002) == 0x00) && ((PERIPH) != 0x00)) assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE) { RCC->APB2ENR |= RCC_APB2Periph; } else { RCC->APB2ENR &= ~RCC_APB2Periph; } }
15.2.23 函数RCC_APB1PeriphClockCmd
Table 374. 函数RCC_APB1PeriphClockCmd 函数名 RCC_APB1PeriphClockCmd void RCC_APB1PeriphClockCmd(u32 RCC_APB1Periph, 函数原形 FunctionalState NewState) 功能描述 使能或失能 APB1外设时钟 RCC_APB1Periph:门控APB1外设时钟 输入参数 1 参阅Section:RCC_APB1Periph查阅更多该参数允许取值范围 NewState:指定外设时钟的新状态 输入参数 2 参数取值:ENABLE 或 DISABLE 输出参数 无 无 无 无 RCC_APB1Periph:该参数被门控的APB1外设时钟,可以取下表的一个或者多个取值的组合作为该参数的值。 Table 375. RCC_AHB1Periph值 RCC_AHB1Periph 描述 #define值/对应位号 RCC_APB1Periph_TIM2 TIM2时钟 0x00000001 RCC_APB1Periph_TIM3 TIM3时钟 0x00000002 RCC_APB1Periph_TIM4 TIM4时钟 0x00000004 RCC_APB1Periph_TIM5 TIM4时钟 0x00000008 RCC_APB1Periph_TIM6 TIM4时钟 0x00000010 RCC_APB1Periph_TIM7 TIM4时钟 0x00000020 RCC_APB1Periph_WWDG WWDG时钟 0x00000800 RCC_APB1Periph_SPI2 SPI2时钟 0x00004000 RCC_APB1Periph_SPI3 SPI3时钟 0x00008000 RCC_APB1Periph_USART2 USART2时钟 0x00020000 RCC_APB1Periph_USART3 USART3时钟 0x00040000 RCC_APB1Periph_UART4 UART4时钟 0x00080000 RCC_APB1Periph_UART5 UART5时钟 0x00100000 RCC_APB1Periph_I2C1 I2C1时钟 0x00200000 RCC_APB1Periph_I2C2 I2C2时钟 0x00400000 RCC_APB1Periph_USB USB时钟 0x00800000 RCC_APB1Periph_CAN CAN时钟 0x02000000 RCC_APB1Periph_BKP BKP时钟 0x08000000 RCC_APB1Periph_PWR PWR时钟 0x10000000 RCC_APB1Periph_DAC DAC时钟 0x20000000 RCC_APB1Periph_ALL 全部APB1外设时钟 0x3AFEC83F 例: /* Enable BKP and PWR clocks */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR, ENABLE); 函数原型如下:
void RCC_APB1PeriphClockCmd(u32 RCC_APB1Periph, FunctionalState NewState) {
/* Check the parameters */
assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
//#define IS_RCC_APB1_PERIPH(PERIPH) ((((PERIPH) & 0xC50137C0) == 0x00) && ((PERIPH) != 0x00)) assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE) { RCC->APB1ENR |= RCC_APB1Periph; } else { RCC->APB1ENR &= ~RCC_APB1Periph; } }
返回值 先决条件 被调用函数 15.2.24 函数RCC_APB2PeriphResetCmd
Table 376. 函数RCC_APB2PeriphResetCmd 函数名 RCC_APB2PeriphResetCmd void RCC_APB2PeriphResetCmd(u32 RCC_APB2Periph, 函数原形 FunctionalState NewState) 功能描述 强制或释放高速APB(APB2)外设复位 RCC_APB2Periph: APB2外设复位 输入参数 1 参阅Section:RCC_APB2Periph查阅更多该参数允许取值范围 NewState:指定APB2 外设复位的新状态 输入参数 2 参数取值:ENABLE或 DISABLE 输出参数 无 返回值 无 先决条件 无 被调用函数 无 例:
共分享92篇相关文档