RCC_CFGR寄存器地址 0x初始化后值为0x00000000,RCC->CFGR & RCC_CFGR_SWS那这个有什么意义

STM32单片机时钟修改_百度知道
STM32单片机时钟修改
#define HSE_VALUE
((uint32_t))
RCC-&CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
RCC-&CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6);
我把晶振修改了,怎么系统没变...
我有更好的答案
做如下检查:第一,如果你用的是Systeminit....且是用的库,就是XXXX.lib,那么,你就不必修改了,因为库已经写死8M.第二,如果你是用的仿真,那么要修改Keil的配置,Keil默认配置是8M,你下载到Flash里不受Keil配置的影响,但是如果你软件仿真,是受Keil的影响 建议:如果你的外晶振不是8M的,不要调用SystemInit函数来初始化你的时钟,自己写比较好.
采纳率:68%
来自团队:
为您推荐:
其他类似问题
您可能关注的内容
stm32的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。函数原型如下: void RCC_RTCCLKConfig(u32 RCC_RTCCLKSource) {
/* Check the parameters */
assert_param(IS_RCC_RTCCLK_SOURCE(RCC_RTCCLKSource));
/* Select the RTC clock source */
RCC->BDCR |= RCC_RTCCLKS } 15.2.19 函数RCC_RTCCLKCmd
Table 368. 函数RCC_RTCCLKCmd
函数名 RCC_RTCCLKCmd 函数原形 void RCC_RTCCLKCmd(FunctionalState NewState)
功能描述 使能或失能RTC时钟 NewState:RTC时钟的新状态 输入参数 参数取值:ENABLE 或 DISABLE 输出参数 无 返回值 无 先决条件 该函数只有在通过函数RCC_RTCCLKConfig选择RTC时钟后,才能调用 被调用函数 无 例:
/* Enable the RTC clock */
RCC_RTCCLKCmd(ENABLE);
函数原型如下: void RCC_RTCCLKCmd(FunctionalState NewState) {
/* Check the parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));
*(vu32 *) BDCR_RTCEN_BB = (u32)NewS//BDCR_RTCEN_BB的地址:0xC }
15.2.20 函数RCC_GetClocksFreq
Table 369. 函数 RCC_GetClocksFreq 函数名 RCC_GetClocksFreq 函数原形 void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
功能描述 返回不同片上时钟的频率 RCC_Clocks:指向结构RCC_ClocksTypeDef的指针,包含了各个时钟的频率 输入参数 参阅Section:RCC_Clocks查阅更多该参数允许取值范围 输出参数 无 返回值 无 先决条件 无 被调用函数 无
RCC_ClocksTypeDef structure
RCC_ClocksTypeDef定义于文件“sm32f10x_rcc.h:
typedef struct
u32 SYSCLK_F
u32 HCLK_F
u32 PCLK1_F
u32 PCLK2_F
u32 ADCCLK_F }RCC_ClocksTypeD
1.SYSCLK_Frequency:该成员返回SYSCLK的频率/Hz,HSI、HSE、PLLCLK 2.HCLK_Frequency:该成员返回HCLK的频率/Hz,AHB 3.PCLK1_Frequency:该成员返回PCLK1 的频率/Hz,APB1 4.PCLK2_Frequency:该成员返回PCLK2 的频率/Hz,APB2 5.ADCCLK_Frequency:该成员返回ADCCLK的频率/Hz,ADCCLK 结构体实现如下: /* Get the frequencies of different on chip clocks */
void RCC_GetClocksFreq(RCC_ClocksTypeDef*
RCC_Clocks) {
u32 tmp = 0, pllmull = 0, pllsource = 0, presc = 0;
/* Get SYSCLK source -------------------------------------------------------*/
tmp = RCC->CFGR & CFGR_SWS_M//#define CFGR_SWS_Mask
((u32) 0xC)
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_V //#define HSI_Value
((u32)8000000)
case 0x04:
/* HSE used as system clock */
RCC_Clocks->SYSCLK_Frequency = HSE_V// #define HSE_Value
((u32)8000000)
case 0x08:
/* PLL used as system clock */
/* Get PLL clock source and multiplication factor ----------------------*/
pllmull = RCC->CFGR & CFGR_PLLMull_M// #define CFGR_PLLMull_Mask ((u32)0x003C 0000)//读倍频系数
pllmull = ( pllmull >> 18) + 2;
//CFGR. PLLMUL[3:0]在bit21-18,倍频系数pllmull+2=实际倍频数。(定义-实际 的关系)
pllsource = RCC->CFGR & CFGR_PLLSRC_M// #define CFGR_PLLSRC_Mask
//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) *//HSI/2
else//pllsource==0x
{/* 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) *
RCC_Clocks->SYSCLK_Frequency = HSE_Value * //判断Bit17是否为0?-> HSE
RCC_Clocks->SYSCLK_Frequency = HSI_V
/* Compute HCLK, PCLK1, PCLK2 and ADCCLK clocks frequencies ----------------*/
/* Get HCLK prescaler */
tmp = RCC->CFGR & CFGR_HPRE_Set_M//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 >>//AHB由SYSCLK分频获得
/* Get PCLK1 prescaler */
tmp = RCC->CFGR & CFGR_PPRE1_Set_M //Bit10-8―APB1
tmp = tmp >> 8;
presc = APBAHBPrescTable[tmp];
/* PCLK1 clock frequency */
RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> //APB1由AHB分频获得
/* Get PCLK2 prescaler */
tmp = RCC->CFGR & CFGR_PPRE2_Set_M //Bit13-11―APB2
tmp = tmp >> 11;
presc = APBAHBPrescTable[tmp];
/* PCLK2 clock frequency */
RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> //APB2由AHB分频获得
/* Get ADCCLK prescaler */
tmp = RCC->CFGR & CFGR_ADCPRE_Set_M//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 / } 备注:查取所有的频率,然后供后续函数调用其中任何一个.
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)0x) bit0 RCC_AHBPeriph_DMA2 DMA2时钟 ((u32)0x) bit1 RCC_AHBPeriph_SRAM SRAM时钟 ((u32)0x) bit3 RCC_AHBPeriph_FLITF FLITF时钟 ((u32)0x) bit5/FlashInterface RCC_AHBPeriph_CRC CRC时钟 ((u32)0x) bit6 RCC_AHBPeriph_FSMC FSMC时钟 ((u32)0x) bit8 RCC_AHBPeriph_SDIO SDIO时钟 ((u32)0x) 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_AHBP
RCC->AHBENR &= ~RCC_AHBP
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时钟 0x
RCC_APB2Periph_GPIOA GPIOA时钟 0x
RCC_APB2Periph_GPIOB GPIOB时钟 0x
RCC_APB2Periph_GPIOC GPIOC时钟 0x
RCC_APB2Periph_GPIOD GPIOD时钟 0x
RCC_APB2Periph_GPIOE GPIOE时钟 0x
RCC_APB2Periph_GPIOF GPIOE时钟 0x
RCC_APB2Periph_GPIOG GPIOE时钟 0x
RCC_APB2Periph_ADC1 ADC1时钟 0x
RCC_APB2Periph_ADC2 ADC2时钟 0x
RCC_APB2Periph_TIM1 TIM1时钟 0x
RCC_APB2Periph_SPI1 SPI1时钟 0x
RCC_APB2Periph_TIM8 TIM8 0x
RCC_APB2Periph_USART1 USART1时钟 0x
RCC_APB2Periph_ADC3 ADC3时钟 0x
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_APB2P
RCC->APB2ENR &= ~RCC_APB2P
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时钟 0x RCC_APB1Periph_TIM3 TIM3时钟 0x RCC_APB1Periph_TIM4 TIM4时钟 0x RCC_APB1Periph_TIM5 TIM4时钟 0x RCC_APB1Periph_TIM6 TIM4时钟 0x RCC_APB1Periph_TIM7 TIM4时钟 0x RCC_APB1Periph_WWDG WWDG时钟 0x RCC_APB1Periph_SPI2 SPI2时钟 0x RCC_APB1Periph_SPI3 SPI3时钟 0x RCC_APB1Periph_USART2 USART2时钟 0x RCC_APB1Periph_USART3 USART3时钟 0x RCC_APB1Periph_UART4 UART4时钟 0x RCC_APB1Periph_UART5 UART5时钟 0x RCC_APB1Periph_I2C1 I2C1时钟 0x RCC_APB1Periph_I2C2 I2C2时钟 0x RCC_APB1Periph_USB USB时钟 0x RCC_APB1Periph_CAN CAN时钟 0x RCC_APB1Periph_BKP BKP时钟 0x RCC_APB1Periph_PWR PWR时钟 0x RCC_APB1Periph_DAC DAC时钟 0x 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_APB1P
RCC->APB1ENR &= ~RCC_APB1P
} } 返回值 先决条件 被调用函数 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
输出参数 无 返回值 无 先决条件 无 被调用函数 无 例:}

我要回帖

更多关于 m0如何初始化寄存器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信