STM32F401的RCC时钟配置

需要使用STM32F401的大内存特性,买了1批STM32F401CCU6. QFN48封装的。随便翻了一下PDF,第一感觉和F103的48脚封装差不太多,于是将F103的板子改了个QFN48的封装就打样了。。。

收到板子后,直接焊上F401,我用的是8M晶振,调试,发现频率上不去。最高能稳定在60M左右,在64M偶尔能工作。

在main.c中的RCC配置:

(因为SystemInit的配置较低,能跑起来,需要重新配置时钟在72M,文档说最高能84M)

void RCC_MyConfig(void)
{
    RCC_DeInit();                                                              //@1
    RCC_HSEConfig(RCC_HSE_ON);                                   //打开外部时钟
    
    if(RCC_WaitForHSEStartUp() == SUCCESS)                  //等待外部时钟成功启动
    {
 			
        RCC_HCLKConfig(RCC_SYSCLK_Div1);                          //HCLK(AHB)时钟为系统时钟1分频
        
        RCC_PCLK1Config(RCC_HCLK_Div8);                            //PCLK(APB1)时钟为HCLK时钟8分频
        RCC_PCLK2Config(RCC_HCLK_Div2);                            //PCLK(APB2)时钟为HCLK时钟2分频
  
        
        RCC_PLLConfig(RCC_PLLSource_HSE, 8, 288, 4, 6);     //PLL时钟配置,外部晶振为8MHz,系统配置为8/8*336/4 =84MHz usb=336/7=48
        
        RCC_PLLCmd(ENABLE);                                               //开启PLL时钟,并等待PLL时钟准备好
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);      //选择PLL时钟为系统时钟
       
        while(RCC_GetSYSCLKSource() != 0x08);                      //Wait till PLL is used as system clock source
    }
}

上述代码无论如何无法启动,将RCC_HCLKConfig(RCC_SYSCLK_Div1);  改为DIV2可以启动,但主频慢多了,通过调整倍频,发现最高可以稳定跑到60M上下。于是不解。

问供应商,说芯片肯定是原装的。

于是各种加电容,改善电源,方法都用遍了,还是不行,正准备放弃时,浏览文档突然发现:

这不是我画的PB11吗,哪里去了?看一看VCAP_1是什么?

到这里才恍然大悟,原来PB11在48脚的IC中是不存在的,取而代之的是pwr regulator这个功能脚,赶紧找个106的电容焊上,启动,一切都安静了。。。

 

### STM32F401 内部时钟频率及相关配置 STM32F4系列微控制器提供了多种时钟源,包括高速外部晶振 (HSE)、高速内部 RC 振荡器 (HSI)、低速外部晶振 (LSE) 和低速内部 RC 振荡器 (LSI)[^2]。对于 STM32F401 微控制器,默认情况下 HSI 是启用的,并作为系统时钟的主要来源之一。 #### 默认时钟源及其频率 - **HSI**: 高速内部 RC 振荡器默认运行在 16 MHz 的频率下。 - **HSE**: 如果使用外部晶体,则其典型值通常为 8 MHz 或更高,具体取决于应用需求和硬件设计[^1]。 - **PLL**: 相位锁定环路可以从 HSI 或 HSE 提供的基础频率生成更高的工作频率。通过调整倍频因子,可以得到高达几百兆赫兹的工作频率(受限于 MCU 的最大支持频率)。例如,在某些配置中,可以通过 PLL 将基础频率提升至约 84 MHz 或其他指定值[^5]。 当利用 STM32CubeMX 工具进行项目创建时,可以在图形界面轻松完成这些参数的设置过程[^3]。此外,为了确保外设正常运作,需注意查阅官方文档中的时钟树结构图来了解各个模块的具体时钟路径以及可能存在的门控机制^。 关于如何修改系统时钟频率,可通过编辑驱动程序内的初始化部分实现。这涉及定位到负责系统时钟初始化的函数并对其进行适当调整。 ```c // 示例代码展示如何改变系统时钟频率 void SystemClock_Config(void){ RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /** Initializes the CPU, AHB and APB buses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } } ``` 此段代码展示了基于 HSE 设置新的系统时钟频率的方法,其中包含了对 PLL 参数的选择以达成目标频率的要求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

csaaa2005

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值