完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
RCC(Reset Clock Controller)复位与时钟控制器
这个在STM32中起到一个举足轻重的作用,所有的外设都由时钟来控制。通过控制时钟的开关、速度来控制外设的开关、运行速度来控制整体功耗。特别是对手持式设备、利用电池供电的设备都对功耗要求比较高。 一、时钟系统与内部结构 四个驱动单元 Cortex-M3内核ICode(地址)总线(I-bus).DCode(数据)总线(D-bus)。和系统总线(S-bus) GP-DMA(通用DMA) 三个被动单元 内部SRAM 内部闪存存储器 AHB到APB的桥(AHB2APBx),它连接所有的APB设备,APB2的时钟比APB1快。 简析: 首先,输入 OSC_OUT/OSC_IN,这是一路晶振,OSC32_IN/OSC32_OUT,第二路晶振,我们先看上面这一路,上面这一路是外部时钟(HSE OSC),外部时钟进来,也可先除以2(二分频)进来,进来之后又是一个选择开关,这个选择开关还有一路,HSI RC(内部时钟RC振荡器),内部时钟也可以直接进入后方,可以看到内部时钟是8Mhz,不管是内部时钟还是外部时钟,往后进入 PLL (锁相环),锁相环起一个倍频器的作用,输出一个倍频之后的 PLLCLK,又遇到一个选择开关,这个选择开关还有一路输入 ,HSE OSC(外部晶振)直接过来的,所以一共有三个时钟,可以通过设置选择某一路过来,过来之后得到一个SYSCLK(系统时钟),系统时钟往后可以为 AHB总线提供时钟源,AHB Prescaler 是一个预分频器,再往后分三路,第一路跑到 CPU 内核(内核用,72Mhz);第二路走到 APB1,提供给 APB1 控制的这些外设(最高36Mhz),如果这里还要用到通用定时器,这里还有一个 Multiplier(乘法器),目的是使定时器的时钟更快;第三路到 APB2,类似于 APB1,最高速度快一些,另外还有一个 ADC,由于ADC不需要太快的速度,所以还需要经过分频(ADC Prescaler);PLL 有一路没有走后方,直接下来供给 USB 外设使用,频率为48MHz(这个频率比较特殊,所以单独拉出来一路) 另外一路:OSC32_IN/OSC32_OUT,接的是外部 32.768KHz的晶振,简写成OSC32,为什么是32.768KHz ? 因为这个频率可以产生精确的秒信号(暂不深究)。这个晶振信号进来,经过 LSE OSC (外部低速时钟),进来一个32.768KHz的波,另外下方有一个低速的内部RC振荡器,大概40KHz,同时都进入后方的选择开关,这个选择开关的第三路输入是由上方提供的,三路输入,经选择开关选择,提供RTC时钟(实时时钟),当32.768这一路失效,可以选择另外两路,也能提供相对精确的时钟。 时钟监视系统 CSS:监视 HSE OSC 时钟,这个外部时钟会提供给 CPU 使用,当检测到HSE OSC 失效,则立即切换至 HSI RC MCO接口:芯片上有一个专门的引脚叫MCO,可以通过选择开关来选择,可以通过示波器测量 SYSCLK、HSI、HSE、PLLCLK各个波形,根据脉冲波形来判断时钟是否正常。除此之外,也可以通过这个接口给其他器件充当晶振。即既能作为内部诊断,也能为外部提供晶振,并且提供晶振的时候还有多种选择。 为什么要这么多时钟?内部时钟?外部时钟? 有内部高速(HSI RC)、外部高速(HSE DSC)、外部低速(LSE DSC)、内部低速(LSI RC),首先高速、低速满足的外设是不一样的,比如低速满足 RTC 时钟和看门狗,至于外部内部,是当外部失效的时候也可以使用内部的振荡器,可以工作,只不过接了外部的晶振,时钟更加精确而已 时钟源 时钟是STM32的脉搏,是驱动源。使用任何一个外设都必须打开相应的时钟。这样的好处就是,如果不使用一个外设的时候,就把它的时钟关掉,从而可以降低系统的功耗,达到节能,实现低功耗的效果。 STM32的时钟可以由以下4个时钟源提供: 1、 HSI:高速内部时钟信号stm32单片机内带的时钟(8M频率)精度较差 2、 HSE:高速外部时钟信号精度高来源(1)HSE外部晶体/陶瓷谐振器(晶振)(2)HSE用户外部时钟 3、 LSE:低速外部晶体32.768kHz主要提供一个精确的时钟源一般作为RTC时钟使用 4、 LSI:低速内部时钟,主要提供给看门狗 stm32将时钟信号(例如HSE)经过分频或倍频(PLL)后,得到系统时钟,系统时钟经过分频,产生外设所使用的时钟。 RCC 程序流程 设罝时钟流程: 1、 将RCC寄存器重新设罝为默认值 RCC_Delnit 2、 打开夕卜部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON); 3、 等待外部髙速时钟晶振工作 HSEStartUpStatus = RCC_WaitForHSEStartUp(); 4、 设置AHB时钟 RCC_HCLKConfig; 5、 设罝高速APB时钟 RCC_PCLK2Config; 6、 设置低速速APB时钟 RCC_PCLK1Config 7、 设置PLL RCC_PLLConfig 8、 打开PLL RCC_PLLCmd(ENABLE); 9、 等待PLL工作 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET) 10、设置系统时钟 RCC_SYSCLKConfig 11、判断是否PLL是系统时钟 while[RCC_GetSYSCLKSource() != 0x08) 12、打开要使用的外设时钟 RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd () 代码 void RCC_Configuration(void) { //=============================== 使用内部RC晶振 =================================== /* RCC_HSICmd(ENABLE);//使能内部高速晶振 ; RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);//选择内部高速时钟作为系统时钟SYSCLOCK=8MHZ RCC_HCLKConfig(RCC_SYSCLK_Div1);//选择HCLK时钟源为系统时钟SYYSCLOCK RCC_PCLK1Config(RCC_HCLK_Div4);//APB1时钟为2M RCC_PCLK2Config(RCC_HCLK_Div4);//APB2时钟为2M RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);//使能APB2外设GPIOB时钟 */ //==========================使用外部RC晶振======================================== RCC_DeInit(); //初始化为缺省状态 RCC_HSEConfig(RCC_HSE_ON); //高速时钟使能 while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待高速时钟使能就绪 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer FLASH_SetLatency(FLASH_Latency_2); // Flash 2 wait state RCC_HCLKConfig(RCC_SYSCLK_Div1); // HCLK = SYSCLK RCC_PCLK2Config(RCC_HCLK_Div1); // PCLK2 = HCLK RCC_PCLK1Config(RCC_HCLK_Div2); // PCLK1 = HCLK/2 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // PLLCLK = 8MHz * 9 = 72 MHz RCC_PLLCmd(ENABLE); // Enable PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); // Wait till PLL is ready RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Select PLL as system clock source while(RCC_GetSYSCLKSource() != 0x08); // Wait till PLL is used as system clock source //==================================================================================== RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能APB2外设GPIOC时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); // Enable TIM2, TIM3 and TIM4 clocks ,可删掉 } //以下具体函数的设置是参照寄存器手册配置的 /******************************************************************************* * Function Name : RCC_DeInit * Description : Resets the RCC clock configuration to the default reset state. * Input : None * Output : None * Return : None * 功能 : 将外设RCC寄存器重设为缺省值 ; *******************************************************************************/ void RCC_DeInit(void) { /* Set HSION bit */ RCC-》CR |= (u32)0x00000001; /* Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], ADCPRE[1:0] and MCO[2:0] bits */ RCC-》CFGR &= (u32)0xF8FF0000; /* Reset HSEON, CSSON and PLLON bits */ RCC-》CR &= (u32)0xFEF6FFFF; /* Reset HSEBYP bit */ RCC-》CR &= (u32)0xFFFBFFFF; /* Reset PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE bits */ RCC-》CFGR &= (u32)0xFF80FFFF; /* Disable all interrupts */ RCC-》CIR = 0x00000000; } /******************************************************************************* * Function Name : RCC_HSEConfig * Description : Configures the External High Speed oscillator (HSE)。 * HSE can not be stopped if it is used directly or through the * PLL as system clock. * Input : - RCC_HSE: specifies the new state of the HSE. * This parameter can be one of the following values: * - RCC_HSE_OFF: HSE oscillator OFF * - RCC_HSE_ON: HSE oscillator ON * - RCC_HSE_Bypass: HSE oscillator bypassed with external * clock * Output : None * Return : None * 功能 : 设置外设高速晶振(HSE) *******************************************************************************/ void RCC_HSEConfig(u32 RCC_HSE) { /* Check the parameters */ assert_param(IS_RCC_HSE(RCC_HSE)); /* Reset HSEON and HSEBYP bits before configuring the HSE ------------------*/ /* Reset HSEON bit */ RCC-》CR &= CR_HSEON_Reset; /* Reset HSEBYP bit */ RCC-》CR &= CR_HSEBYP_Reset; /* Configure HSE (RCC_HSE_OFF is already covered by the code section above) */ switch(RCC_HSE) { case RCC_HSE_ON: /* Set HSEON bit */ RCC-》CR |= CR_HSEON_Set; break; case RCC_HSE_Bypass: /* Set HSEBYP and HSEON bits */ RCC-》CR |= CR_HSEBYP_Set | CR_HSEON_Set; break; default: break; } } /******************************************************************************* * Function Name : RCC_GetFlagStatus * Description : Checks whether the specified RCC flag is set or not. * Input : - RCC_FLAG: specifies the flag to check. * This parameter can be one of the following values: * - RCC_FLAG_HSIRDY: HSI oscillator clock ready * - RCC_FLAG_HSERDY: HSE oscillator clock ready * - RCC_FLAG_PLLRDY: PLL clock ready * - RCC_FLAG_LSERDY: LSE oscillator clock ready * - RCC_FLAG_LSIRDY: LSI oscillator clock ready * - RCC_FLAG_PINRST: Pin reset * - RCC_FLAG_PORRST: POR/PDR reset * - RCC_FLAG_SFTRST: Software reset * - RCC_FLAG_IWDGRST: Independent Watchdog reset * - RCC_FLAG_WWDGRST: Window Watchdog reset * - RCC_FLAG_LPWRRST: Low Power reset * Output : None * Return : The new state of RCC_FLAG (SET or RESET)。 * 功能 : 检查指定的RCC标志位设置与否 ; *******************************************************************************/ FlagStatus RCC_GetFlagStatus(u8 RCC_FLAG) { u32 tmp = 0; u32 statusreg = 0; FlagStatus bitstatus = RESET; /* Check the parameters */ assert_param(IS_RCC_FLAG(RCC_FLAG)); /* Get the RCC register index */ tmp = RCC_FLAG 》》 5; if (tmp == 1) /* The flag to check is in CR register */ { statusreg = RCC-》CR; } else if (tmp == 2) /* The flag to check is in BDCR register */ { statusreg = RCC-》BDCR; } else /* The flag to check is in CSR register */ { statusreg = RCC-》CSR; } /* Get the flag position */ tmp = RCC_FLAG & FLAG_Mask; if ((statusreg & ((u32)1 《《 tmp)) != (u32)RESET) { bitstatus = SET; } else { bitstatus = RESET; } /* Return the flag status */ return bitstatus; } /******************************************************************************* * Function Name : FLASH_PrefetchBufferCmd * Description : Enables or disables the Prefetch Buffer. * Input : - FLASH_PrefetchBuffer: specifies the Prefetch buffer status. * This parameter can be one of the following values: * - FLASH_PrefetchBuffer_Enable: FLASH Prefetch Buffer Enable * - FLASH_PrefetchBuffer_Disable: FLASH Prefetch Buffer Disable * Output : None * Return : None * 功能 : 使能或者失能预取指缓存 ; *******************************************************************************/ void FLASH_PrefetchBufferCmd(u32 FLASH_PrefetchBuffer) { /* Check the parameters */ assert_param(IS_FLASH_PREFETCHBUFFER_STATE(FLASH_PrefetchBuffer)); /* Enable or disable the Prefetch Buffer */ FLASH-》ACR &= ACR_PRFTBE_Mask; FLASH-》ACR |= FLASH_PrefetchBuffer; } /******************************************************************************* * Function Name : FLASH_SetLatency * Description : Sets the code latency value. * Input : - FLASH_Latency: specifies the FLASH Latency value. * This parameter can be one of the following values: * - FLASH_Latency_0: FLASH Zero Latency cycle * - FLASH_Latency_1: FLASH One Latency cycle * - FLASH_Latency_2: FLASH Two Latency cycles * Output : None * Return : None * 功能 : 设置代码延时值 ; *******************************************************************************/ void FLASH_SetLatency(u32 FLASH_Latency) { /* Check the parameters */ assert_param(IS_FLASH_LATENCY(FLASH_Latency)); /* Sets the Latency value */ FLASH-》ACR &= ACR_LATENCY_Mask; FLASH-》ACR |= FLASH_Latency; } /******************************************************************************* * Function Name : RCC_HCLKConfig * Description : Configures the AHB clock (HCLK)。 * Input : - RCC_SYSCLK: defines the AHB clock divider. This clock is * derived from the system clock (SYSCLK)。 * This parameter can be one of the following values: * - 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 * Output : None * Return : None * 功能 : 设置AHB时钟(HCLK); *******************************************************************************/ 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 */ tmpreg &= CFGR_HPRE_Reset_Mask; /* Set HPRE[3:0] bits according to RCC_SYSCLK value */ tmpreg |= RCC_SYSCLK; /* Store the new value */ RCC-》CFGR = tmpreg; } /******************************************************************************* * Function Name : RCC_PCLK2Config * Description : Configures the High Speed APB clock (PCLK2)。 * Input : - RCC_HCLK: defines the APB2 clock divider. This clock is * derived from the AHB clock (HCLK)。 * This parameter can be one of the following values: * - RCC_HCLK_Div1: APB2 clock = HCLK * - RCC_HCLK_Div2: APB2 clock = HCLK/2 * - RCC_HCLK_Div4: APB2 clock = HCLK/4 * - RCC_HCLK_Div8: APB2 clock = HCLK/8 * - RCC_HCLK_Div16: APB2 clock = HCLK/16 * Output : None * Return : None * 功能 : 设置高速AHB时钟(PCLK2); *******************************************************************************/ 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 */ tmpreg &= CFGR_PPRE2_Reset_Mask; /* Set PPRE2[2:0] bits according to RCC_HCLK value */ tmpreg |= RCC_HCLK 《《 3; /* Store the new value */ RCC-》CFGR = tmpreg; } /******************************************************************************* * Function Name : RCC_PCLK1Config * Description : Configures the Low Speed APB clock (PCLK1)。 * Input : - RCC_HCLK: defines the APB1 clock divider. This clock is * derived from the AHB clock (HCLK)。 * This parameter can be one of the following values: * - 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 * Output : None * Return : None * 功能 : 设置低速AHB时钟(PCLK1) ; *******************************************************************************/ 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 */ tmpreg &= CFGR_PPRE1_Reset_Mask; /* Set PPRE1[2:0] bits according to RCC_HCLK value */ tmpreg |= RCC_HCLK; /* Store the new value */ RCC-》CFGR = tmpreg; } /******************************************************************************* * Function Name : RCC_PLLConfig * Description : Configures the PLL clock source and multiplication factor. * This function must be used only when the PLL is disabled. * Input : - RCC_PLLSource: specifies the PLL entry clock source. * This parameter can be one of the following values: * - RCC_PLLSource_HSI_Div2: HSI oscillator clock divided * by 2 selected as PLL clock entry * - RCC_PLLSource_HSE_Div1: HSE oscillator clock selected * as PLL clock entry * - RCC_PLLSource_HSE_Div2: HSE oscillator clock divided * by 2 selected as PLL clock entry * - RCC_PLLMul: specifies the PLL multiplication factor. * This parameter can be RCC_PLLMul_x where x:[2,16] * Output : None * Return : None * 功能 : 设置PLL时钟源及倍频系数 ; *******************************************************************************/ void RCC_PLLConfig(u32 RCC_PLLSource, u32 RCC_PLLMul) { u32 tmpreg = 0; /* Check the parameters */ assert_param(IS_RCC_PLL_SOURCE(RCC_PLLSource)); assert_param(IS_RCC_PLL_MUL(RCC_PLLMul)); tmpreg = RCC-》CFGR; /* Clear PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */ tmpreg &= CFGR_PLL_Mask; /* Set the PLL configuration bits */ tmpreg |= RCC_PLLSource | RCC_PLLMul; /* Store the new value */ RCC-》CFGR = tmpreg; } /******************************************************************************* * Function Name : RCC_PLLCmd * Description : Enables or disables the PLL. * The PLL can not be disabled if it is used as system clock. * Input : - NewState: new state of the PLL. * This parameter can be: ENABLE or DISABLE. * Output : None * Return : None * 功能 : 使能或者失能PLL ; *******************************************************************************/ void RCC_PLLCmd(FunctionalState NewState) { /* Check the parameters */ assert_param(IS_FUNCTIONAL_STATE(NewState)); *(vu32 *) CR_PLLON_BB = (u32)NewState; } /******************************************************************************* * Function Name : RCC_GetFlagStatus * Description : Checks whether the specified RCC flag is set or not. * Input : - RCC_FLAG: specifies the flag to check. * This parameter can be one of the following values: * - RCC_FLAG_HSIRDY: HSI oscillator clock ready * - RCC_FLAG_HSERDY: HSE oscillator clock ready * - RCC_FLAG_PLLRDY: PLL clock ready * - RCC_FLAG_LSERDY: LSE oscillator clock ready * - RCC_FLAG_LSIRDY: LSI oscillator clock ready * - RCC_FLAG_PINRST: Pin reset * - RCC_FLAG_PORRST: POR/PDR reset * - RCC_FLAG_SFTRST: Software reset * - RCC_FLAG_IWDGRST: Independent Watchdog reset * - RCC_FLAG_WWDGRST: Window Watchdog reset * - RCC_FLAG_LPWRRST: Low Power reset * Output : None * Return : The new state of RCC_FLAG (SET or RESET)。 * 功能 : 检查指定的RCC标志位设置与否 ; *******************************************************************************/ FlagStatus RCC_GetFlagStatus(u8 RCC_FLAG) { u32 tmp = 0; u32 statusreg = 0; FlagStatus bitstatus = RESET; /* Check the parameters */ assert_param(IS_RCC_FLAG(RCC_FLAG)); /* Get the RCC register index */ tmp = RCC_FLAG 》》 5; if (tmp == 1) /* The flag to check is in CR register */ { statusreg = RCC-》CR; } else if (tmp == 2) /* The flag to check is in BDCR register */ { statusreg = RCC-》BDCR; } else /* The flag to check is in CSR register */ { statusreg = RCC-》CSR; } /* Get the flag position */ tmp = RCC_FLAG & FLAG_Mask; if ((statusreg & ((u32)1 《《 tmp)) != (u32)RESET) { bitstatus = SET; } else { bitstatus = RESET; } /* Return the flag status */ return bitstatus; } /******************************************************************************* * Function Name : RCC_SYSCLKConfig * Description : Configures the system clock (SYSCLK)。 * Input : - RCC_SYSCLKSource: specifies the clock source used as system * clock. This parameter can be one of the following values: * - RCC_SYSCLKSource_HSI: HSI selected as system clock * - RCC_SYSCLKSource_HSE: HSE selected as system clock * - RCC_SYSCLKSource_PLLCLK: PLL selected as system clock * Output : None * Return : None * 功能 : 设置系统时钟(SYSCLK); *******************************************************************************/ void RCC_SYSCLKConfig(u32 RCC_SYSCLKSource) { u32 tmpreg = 0; /* Check the parameters */ assert_param(IS_RCC_SYSCLK_SOURCE(RCC_SYSCLKSource)); tmpreg = RCC-》CFGR; /* Clear SW[1:0] bits */ tmpreg &= CFGR_SW_Mask; /* Set SW[1:0] bits according to RCC_SYSCLKSource value */ tmpreg |= RCC_SYSCLKSource; /* Store the new value */ RCC-》CFGR = tmpreg; } /******************************************************************************* * Function Name : RCC_GetSYSCLKSource * Description : Returns the clock source used as system clock. * Input : None * Output : None * Return : The clock source used as system clock. The returned value can * be one of the following: * - 0x00: HSI used as system clock * - 0x04: HSE used as system clock * - 0x08: PLL used as system clock * 功能 : 返回用作系统时钟的时钟源 ; *******************************************************************************/ u8 RCC_GetSYSCLKSource(void) { return ((u8)(RCC-》CFGR & CFGR_SWS_Mask)); } /******************************************************************************* * 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_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1, * RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1, * RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3, * RCC_APB2Periph_ALL * - NewState: new state of the specified peripheral clock. * This parameter can be: ENABLE or DISABLE. * Output : None * Return : None * 功能 : 使能或者失能APB2外设时钟 ; *******************************************************************************/ void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph, FunctionalState NewState) { /* Check the parameters */ assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); assert_param(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: * - RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4, * RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7, * RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3, * RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, * RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2, * RCC_APB1Periph_USB, RCC_APB1Periph_CAN, RCC_APB1Periph_BKP, * RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_ALL * - NewState: new state of the specified peripheral clock. * This parameter can be: ENABLE or DISABLE. * Output : None * Return : None * 功能 : 使能或者失能APB1外设时钟 ; *******************************************************************************/ void RCC_APB1PeriphClockCmd(u32 RCC_APB1Periph, FunctionalState NewState) { /* Check the parameters */ assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { RCC-》APB1ENR |= RCC_APB1Periph; } else { RCC-》APB1ENR &= ~RCC_APB1Periph; } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1760 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1613 浏览 1 评论
1058 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
721 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1670 浏览 2 评论
1932浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
724浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
564浏览 3评论
591浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
549浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 19:35 , Processed in 0.949797 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号