中级会员
 
- 积分
- 374
- 金钱
- 374
- 注册时间
- 2016-4-4
- 在线时间
- 54 小时
|
1金钱
主要是在stsytemInit函数里面,为了方便我重新把时钟配置函数自己写了一遍,下面是源码
- //RCC_PLLSource:PLL时钟源 RCC_PLLSource_HSE、RCC_PLLSource_HSI
- //PLLM:主 PLL和音频PLL输入时钟的分频系数 范围2-63
- //PLLN:倍频系数 范围2-510
- // 小心: 软件必须正确设置这些位,确保 VCO 输出频率介于 192 和 432 MHz 之间。
- // VCO 输出频率 = VCO 输入频率 × PLLN 并且 192 <= PLLN <= 432
- //PLLP:主系统时钟的主 PLL (PLL) 分频系数 范围2、4、6、8
- //PLLQ:主 PLL (PLL) 分频系数,适用于 USB OTG FS 范围2-15
- //使用时确保晶振频率PLLM分频为1MHz即可
- void SysClock_Configuration(uint32_t RCC_PLLSource, uint32_t PLLM)
- {
- __IO uint32_t HSEStatus = 0;
-
- RCC_DeInit();
- if(RCC_PLLSource_HSE == RCC_PLLSource){ //选择外部时钟
- RCC_HSEConfig(RCC_HSE_ON); //打开外部时钟
- if(RCC_WaitForHSEStartUp() == SUCCESS){
- HSEStatus = 1;
- }
- else{
- RCC_HSEConfig(RCC_HSE_OFF); //关闭外部时钟
- RCC_HSICmd(ENABLE);
- }
- }
-
- RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK(AHB)时钟为系统时钟1分频
- RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK(APB1)时钟为HCLK时钟2分频
- RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK(APB2)时钟为HCLK时钟1分频
- if(HSEStatus == 1) {
- //PLL时钟配置,外部晶振为8MHz,系统配置为8/PLLM*PLLN/PLLP
- RCC_PLLConfig(RCC_PLLSource_HSE, PLLM, 336, 4, 7);
- }
- else{
- //PLL时钟配置,内部晶振为16MHz,系统配置为16/16*336/4 =84MHz usb=336/7=48
- RCC_PLLConfig(RCC_PLLSource_HSI, 16, 336, 4, 7);
- }
-
- 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_ClockSecuritySystemCmd(ENABLE); //打开时钟安全系统
- }
复制代码 代码部分可以区分内部和外部晶振。
测试结果是内部时钟是ok的,使用没有问题。外部晶振为8M,当配置外部时钟倍频后的pll作为系统时钟时不对,不论是系统默认的systemInit还是我自己编写的,得到的频率都是不对的。
上图是仿真出来的结果,可以看到主频已经到了262500000,在外设上串口输出的波特率也是不对。请求大神帮助。
单片机型号是STM32401C,手册上说是84M,我也是按照84M那个目标去配置的。附上时钟树,
|
最佳答案
查看完整内容[请看2#楼]
F4库也有对应的函数
stm32f4xx.h 128行 #define HSE_VALUE ((uint32_t)8000000)
system_stm32f4xx.c 371行 #define PLL_M 8
|