学前班
最后登录1970-1-1
在线时间 小时
注册时间2018-4-20
|
楼主 |
发表于 2018-4-21 11:25:07
|
显示全部楼层
那就有劳了,不管是屏蔽超频代码还是修改分频因子,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 */
|
|