野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12805|回复: 3

野火挑战者视频教程的超频章节中指导的程序有误!!!

[复制链接]
发表于 2018-4-21 00:10:24 | 显示全部楼层 |阅读模式

野火STM32F429挑战者视频教程的超频章节中《15-RCC(第3节)—使用HSE配置系统函数(超频使用)》指导的程序有误,按照野火的视频讲解写出的代码不管用不用超频代码,结果LED灯的闪烁频率都是一样的。
起初以为是我写的代码有误,打开野火光盘源代码逐条逐条检查没有找到问题,最后直接把光盘里的源代码写进芯片,结果不管用不用超频代码LED灯的闪烁频率和我写的是一样的现象,猜测野火这一章节中写的代码有错误!

附上源码麻烦帮忙找出错误的原因,谢谢!

第14章 配置HSE系统时钟函数(超频).rar (701.44 KB, 下载次数: 7)

回复

使用道具 举报

发表于 2018-4-21 08:56:04 | 显示全部楼层
把系统各个时钟打印出来看看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-21 11:25:07 | 显示全部楼层
随风 发表于 2018-4-21 08:56
把系统各个时钟打印出来看看

那就有劳了,不管是屏蔽超频代码还是修改分频因子,LED灯的亮灭速度没有任何的变化,实在是纠结中,不把问题搞明白了就不好继续学习去了!!!



main.c函数代码

  • #include "stm32f4xx.h"  
  • #include "bsp_led.h"  
  • #include "bsp_rccclkconfig.h"  
  •   
  • void Delay( __IO uint32_t nCount )  /* 简单的延时函数 */  
  • {  
  •     for( ; nCount != 0; nCount-- );  
  • }  
  •   
  • int main(void)  
  • {  
  • /** 程序来到main函数之前,启动文件:statup_stm32f10x_hd.s已经调用
  •   * SystemInit()函数把系统时钟初始化为72MHz
  •   * SystemInit()在system_stm32f10x.c中定义
  •   * 如果用户想修改系统时钟,可自行编写程序修改
  •   * 重新设置系统时钟,这时候可以选择使用HSE还是HSI
  •   */  
  •     HSE_SetSysClock( 25, 432, 2, 9 );   /* 把系统默认时钟180M初始化为216M */  
  •     LED_GPIO_Config();  /* LED GPIO 初始化 */  
  •       
  •     /* 配合示波器检测输出的时钟源频率 */  
  •     MCO1_GPIO_Config(); /* MCO1 GPIO 初始化 */  
  •     MCO2_GPIO_Config(); /* MCO2 GPIO 初始化 */  
  •     RCC_MCO1Config(RCC_MCO1Source_PLLCLK, RCC_MCO2Div_1);   /* MCO1输出PLLCLK,第1个形参选择时钟源,第2个形参选择分频因子 */  
  •     RCC_MCO2Config(RCC_MCO2Source_SYSCLK, RCC_MCO2Div_1);   /* MCO1输出SYSCLK,第1个形参选择时钟源,第2个形参选择分频因子 */  
  •       
  •     while(1)  
  •     {  
  •         LED1( ON );     /* 亮 */  
  •         Delay(0x8FFFFF);  
  •         LED1( OFF );    /* 灭 */  
  •         Delay(0x8FFFFF);  
  •     }  
  • }  




bsp_rccclkconfig.c函数代码

  • #include "bsp_rccclkconfig.h"  
  •   
  • /**  m(M)取值范围:库函数描述为0 ~ 63;参考手册描述为2 ~ 63
  •   *  n(N)取值范围:192 ~ 432
  •   *  p(P)取值范围:2、4、6、8
  •   *  q(Q)取值范围:2 ~ 15
  •   * 系统时钟的公式:SYSCLK =(HSE÷M)×N÷P HSE:无源晶振频率
  •   *                      =(25÷25)×432÷2=216M(最高超频为216M)
  •   * 函数调用最高频率参数设置:HSE_SetSysClk( 25, 432, 2, 9 );
  •   */  
  • void HSE_SetSysClock(uint32_t m, uint32_t n, uint32_t p, uint32_t q)    /* 定义m,n,p,q将分频因子M,N,P,Q当形参传入函数(有关这4个形参的描述在参考手册6.3.2节) */  
  • {  
  •     __IO uint32_t HSEStartUpStatus = 0; /* 定义一个变量并初始化为0,然后用来读取RCC_WaitForHSEStartUp函数返回的值 */  
  •   
  • /*--------------------------------使能外部的时钟晶振HSE-----------------------------------*/  
  • /*---在rcc.h头文件找到 RCC_HSEConfig 宏按F12找到它的原型,描述:配置外部高速振荡器(HSE)----*/  
  •   
  •     /* 使能HSE,开启外部晶振,HSE=25MHz */  
  •     RCC_HSEConfig(RCC_HSE_ON);  /* 它的形参可以为(RCC_HSE_OFF:不使用HSE;RCC_HSE_ON:使用HSE;RCC_HSE_Bypass:使用旁路(有源)振荡器) */  
  •       
  •     /* 等待HSE就绪 */  
  •     HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* 该函数返回值(SUCCESS:HSE启动已经稳定;ERROR:HSE启动失败 */  
  •       
  •     /* 判断 RCC_WaitForHSEStartUp 启动稳定后配置电源调节器,配置总线时钟的分频因子,配置主PLL的时钟源与分频因子 */  
  •     if( HSEStartUpStatus == SUCCESS )  
  •     {  
  •         /* 选择电源调节器输出为模式1 */  
  •         /* 使能电源接口时钟 */  
  •     RCC->APB1ENR |= RCC_APB1ENR_PWREN;  
  •     PWR->CR |= PWR_CR_VOS;  
  •          
  •         /* 配置总线时钟的分频因子 */  
  •         RCC_HCLKConfig(RCC_SYSCLK_Div1);    /* 配置AHB总线时钟(HCLK)分频因子为1分频 */  
  •         RCC_PCLK2Config(RCC_HCLK_Div2);     /* 配置APB2高速总线时钟(PCLK2)分频因子为2分频(PCLK2最高为180M÷2分频=90M) */  
  •         RCC_PCLK1Config(RCC_HCLK_Div4);     /* 配置APB1低速总线时钟(PCLK1)分频因子为4分频(PCLK1最高为180M÷4分频=45M) */  
  •          
  •         /* 配置主锁相环(PLL)的时钟源与分频因子 */  
  •         /* 时钟源可设置为(RCC_PLLSource_HSI:内部时钟HSI;RCC_PLLSource_HSE:外部时钟HSE) */  
  •         RCC_PLLConfig(RCC_PLLSource_HSE, m, n, p, q);  
  •          
  •         /* 使能主锁相环(PLL),当PLLRDY标志被软件置位表明PLL启动稳定,并且可以作为系统时钟源 */  
  •         /* 注意:如果主PLL用作系统时钟源,则不能被禁用 */  
  •         /* 注意:主PLL在进入停止和待机模式时被硬件禁用 */  
  •         RCC_PLLCmd(ENABLE); /* 该函数只能设置(ENABLE:启用;DISABLE:禁用) */  
  •          
  •         /* 获取PLLRDY标志的状态 */  
  •         /* 在rcc.h头文件最后位置Interrupts and flags management functions(中断和标志管理功能)中找到该标志位函数 */  
  •         /* 主PLL准备就绪后由软件置位并将PLLRDY中断标志位清零,该函数可返回2个值(如果成功则返回值为SET,不成功则返回值为RESET) */  
  •         while ( RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET )       /* 主PLL的标志位为 RCC_FLAG_PLLRDY  */  
  •         {  
  •             /* 通过while循环判断PLL是否就绪,当准备就绪后返回SET,while就为假并跳出while循环,否则执行这个空函数等待就绪 */  
  •         }  
  •          
  •         /* 打开Over-drive模式,目的是达到更高的频率 180 Mhz */  
  •     PWR->CR |= PWR_CR_ODEN;  
  •     while((PWR->CSR & PWR_CSR_ODRDY) == 0)  
  •     {  
  •     }  
  •     PWR->CR |= PWR_CR_ODSWEN;  
  •     while((PWR->CSR & PWR_CSR_ODSWRDY) == 0)  
  •     {  
  •     }  
  •          
  •     /* 配置 Flash 欲取指,指令缓存,数据缓存和等待周期 */  
  •     FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_LATENCY_5WS;  
  •          
  •         /* 选择系统时钟的来源 */  
  •         RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  /* 该函数有4个形参,我们选择RCC_SYSCLKSource_PLLCLK作为系统时钟源 */  
  •          
  •         /* 读取时钟的切换状态位,确保PLLCLK被选为系统时钟 */  
  •         while ( RCC_GetSYSCLKSource() != 0x08 )     /* 返回值有4个,当返回值为0x08表示PLL用作系统时钟  */  
  •         {  
  •             /* 通过while循环判断PLL是否作为系统时钟,当返回0x08,while就为假并跳出while循环,否则执行这个空函数等待就绪 */  
  •         }  
  •     }  
  •     else  
  •     {  
  •         /* HSE启动失败,用户在这里添加纠错代码 */   
  •         while (1)  
  •         {  
  •               
  •         }  
  •     }  
  • }  
  •   
  •   
  • /*----------------------------------监控系统时钟输出--------------------------------------*/  
  • /* MCO1 PA8 GPIO 初始化 */  
  • void MCO1_GPIO_Config(void)  
  • {  
  •     GPIO_InitTypeDef    GPIO_InitStructure;  
  •     RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA, ENABLE );  
  •       
  •     /* MCO1 GPIO 配置 */  
  •     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;  
  •     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  
  •     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  
  •     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  
  •     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  
  •     GPIO_Init( GPIOA, &GPIO_InitStructure );  
  • }  
  •   
  • /* MCO2 PA9 GPIO 初始化 */  
  • void MCO2_GPIO_Config(void)  
  • {  
  •     GPIO_InitTypeDef    GPIO_InitStructure;  
  •     RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOC, ENABLE );  
  •       
  •     /* MCO2 GPIO 配置 */  
  •     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  
  •     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  
  •     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  
  •     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  
  •     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  
  •     GPIO_Init( GPIOC, &GPIO_InitStructure );  
  • }  
  • /*----------------------------------------------------------------------------------------*/  





bsp_rccclkconfig.h定义代码
  • #ifndef __BSP_RCCCLKCONFIG_H  
  • #define __BSP_RCCCLKCONFIG_H  
  •   
  • #include "stm32f4xx_rcc.h"  
  •   
  • void HSE_SetSysClock(uint32_t m, uint32_t n, uint32_t p, uint32_t q);  
  • void MCO1_GPIO_Config(void);  
  • void MCO2_GPIO_Config(void);  
  •   
  • #endif  /* __BSP_RCCCLKCONFIG_H */  






bsp_led.c函数代码

  • #include "bsp_led.h"  
  •   
  • void LED_GPIO_Config(void)  
  • {  
  •     GPIO_InitTypeDef    GPIO_InitStruct;  
  •       
  •     RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOH, ENABLE );  
  •       
  •     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;  
  •     GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;  
  •     GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;  
  •     GPIO_InitStruct.GPIO_Speed = GPIO_Fast_Speed;  
  •       
  •     GPIO_InitStruct.GPIO_Pin = LED_R_GPIO_PIN;  
  •     GPIO_SetBits( LED_R_GPIO_PORT, LED_R_GPIO_PIN );  
  •     GPIO_Init( LED_R_GPIO_PORT, &GPIO_InitStruct );  
  • }  




bsp_led.h定义代码

  • #ifndef __BSP_LED_H  
  • #define __BSP_LED_H  
  •   
  • #include "stm32f4xx_gpio.h"  
  • #include "stm32f4xx_rcc.h"  
  •   
  • #define LED_R_GPIO_PIN      GPIO_Pin_10  
  • #define LED_R_GPIO_PORT     GPIOH  
  • #define LED_R_GPIO_CLK      RCC_AHB1Periph_GPIOH  
  •   
  • #define LED_G_GPIO_PIN      GPIO_Pin_11  
  • #define LED_G_GPIO_PORT     GPIOH  
  • #define LED_G_GPIO_CLK      RCC_AHB1Periph_GPIOH  
  •   
  • #define LED_B_GPIO_PIN      GPIO_Pin_12  
  • #define LED_B_GPIO_PORT     GPIOH  
  • #define LED_B_GPIO_CLK      RCC_AHB1Periph_GPIOH  
  •   
  • /** 控制LED亮灭的宏
  •   * LED低电平亮:设置ON=0,OFF=1
  •   * 若LED高电平亮:把宏设置成ON=1,OFF=0即可
  •   */  
  • #define ON  0  
  • #define OFF 1  
  •   
  • /* 带参宏,可以项内联函数一样使用 */  
  • #define LED1(a) if (a)  \  
  •         GPIO_SetBits(LED_R_GPIO_PORT, LED_R_GPIO_PIN);\  
  •         else    \  
  •         GPIO_ResetBits(LED_R_GPIO_PORT, LED_R_GPIO_PIN)  
  •                      
  • #define LED2(a) if (a)  \  
  •         GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);\  
  •         else    \  
  •         GPIO_ResetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN)  
  •                      
  • #define LED3(a) if (a)  \  
  •         GPIO_SetBits(LED_B_GPIO_PORT, LED_B_GPIO_PIN);\  
  •         else    \  
  •         GPIO_ResetBits(LED_B_GPIO_PORT, LED_B_GPIO_PIN)  
  •   
  • void LED_GPIO_Config(void);  
  •   
  • #endif  /* __BSP_LED_H */  



回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-22 21:10:45 | 显示全部楼层
找到问题了,火哥讲HSE超频的时候没有写RCC初始化函数
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 16:47 , Processed in 0.038692 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表