1、时钟配置

 

 

 1 /*CPU跑72M的时候,各个系统的速度
 2 频率定义函数:SystemInit()*/
 3 const uint32_t SystemFrequency = SYSCLK_FREQ_72MHz;//硬件频率72M    
 4    
 5 const uint32_t SystemFrequency_SysClk =SYSCLK_FREQ_72MHz;//系统时钟   
 6    
 7 const uint32_t SystemFrequency_AHBClk = SYSCLK_FREQ_72MHz;//AHB总线频率    
 8   
 9  const uint32_t SystemFrequency_APB1Clk = (SYSCLK_FREQ_72MHz/2);
10 //APB1总线   
11 const uint32_t SystemFrequency_APB2Clk = SYSCLK_FREQ_72MHz;//APB2总线频率
12 
13 
14 
15 
16 /*如果频率不是72M(最高是80M),如果需要修改频率的话,可以如下:*/
17 void RCC_HSE_Configuration(void) //HSE作为PLL时钟,PLL作为SYSCLK 
18 
19 { 
20   RCC_DeInit(); //将外设RCC寄存器重设为缺省值 
21   RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE) HSE晶振打开(ON)  
22   if(RCC_WaitForHSEStartUp() == SUCCESS) //等待HSE起振,  SUCCESS:HSE晶振稳定且就绪  
23   { 
24   
25     RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK)RCC_SYSCLK_Div1——AHB时钟 = 系统时 
26    
27     RCC_PCLK2Config(RCC_HCLK_Div1); //设置高速AHB时钟(PCLK2)RCC_HCLK_Div1——APB2时钟 = HCLK     
28    
29     RCC_PCLK1Config(RCC_HCLK_Div2); //设置低速AHB时钟(PCLK1)RCC_HCLK_Div2——APB1时钟 = HCLK  
30     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);//设置PLL时钟源及倍频系数  
31    
32     RCC_PLLCmd(ENABLE); //使能PLL  
33   
34     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ;//检查指定的RCC标志位(PLL准备好标志)设置与否
35    
36     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //设置系统时钟(SYSCLK)    
37     while(RCC_GetSYSCLKSource() != 0x08); //0x08:PLL作为系统时钟      
38   
39    }
40 
41 }
42  
View Code

 

自定义系统时钟:

1、代码

 1 /*main.c*/
 2 
 3 #include"pbdata.h"//调用自定义公共函数库
 4 
 5 void RCC_Configuration(void);//系统时钟初始化函数声明
 6 void GPIO_Configuration(void);//GPIO初始化函数声明
 7 
 8 int main(void)//void不能void定义主函数
 9 {
10     RCC_Configuration();    //系统时钟初始化
11     
12     RCC_HSE_Configuration();//系统时钟初始化,自定义
13     
14     
15     
16     GPIO_Configuration();//端口初始化
17     
18 
19 /*进入GPIO处理*/
20   while(1)
21   {
22     GPIO_SetBits(GPIOB,GPIO_Pin_5);//指定端口设置为高电平
23     
24     delay_ms(1000);//1s,delay,公共函数库中自己定义,现在因为修改了系统时钟,所以为2s
25  
26     GPIO_ResetBits(GPIOB,GPIO_Pin_5);//指定端口设置低电平
27 
28     delay_ms(1000);//1s,delay,公共函数库中自己定义,现在因为修改了系统时钟,所以为2s
29   }
30 }
31     
32     
33     void RCC_Configuration(void)//系统时钟高初始化函数
34   {
35         
36     SystemInit();//系统初始化
37     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//对应GPIO时钟使能
38     }
39     
40     
41     void GPIO_Configuration(void)//GPIO初始化函数
42   {
43     GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO设置的结构体变量 
44 
45         /*结构体变量赋值*/
46       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;////引脚配置
47       GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置频率
48       GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
49         
50          /*对应的GPIO初始化*/
51       GPIO_Init(GPIOB,&GPIO_InitStructure);
52   }
53     
54 
55     
56 
57     
58     
59     
View Code
 1 /*pbdata.c*/
 2 
 3 #include"pbdata.h"
 4 
 5 
 6 u8 dt=0;
 7 
 8 void delay(u32 nCount)
 9 {
10   for(;nCount!=0;nCount--);
11 }
12 
13 
14 
15 
16 /*微秒级别延时*/
17 void delay_us(u32 nus)
18 {
19     u32 temp;
20     SysTick->LOAD = 9*nus;//载入初值,72M/8=9M,也就是1/9us,9*1/9us,所以是执行9次
21     SysTick->VAL=0X00;//清空计数器,清空后,就自动设置自己设定的计数器的值
22     SysTick->CTRL=0X01;//使能,减到零动作(不发生中断),采用外部时钟
23     
24     do
25     {
26           temp=SysTick->CTRL;//标志位,等到一直减到0
27          }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
28     
29     SysTick->CTRL=0x00; //关闭计数器
30     SysTick->VAL =0X00; //清空计数器
31 }
32 
33 
34 
35 /*毫秒级别延时*/
36 void delay_ms(u16 nms)
37 {
38     u32 temp;
39     SysTick->LOAD = 9000*nms;//载入初值,72M/8=9M,也就是1/9us,9*1/9us,所以是执行9000次
40     SysTick->VAL=0X00;//清空计数器,清空后,就自动设置自己设定的计数器的值
41     SysTick->CTRL=0X01;//使能,减到零动作(不发生中断),采用外部时钟
42     
43     do
44     {
45           temp=SysTick->CTRL;//标志位,等到一直减到0
46          }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
47     
48     SysTick->CTRL=0x00; //关闭计数器
49     SysTick->VAL =0X00; //清空计数器
50 }
51 
52 
53 /*自己定义时钟频率函数*/
54 void RCC_HSE_Configuration(void) //HSE作为PLL时钟,PLL作为SYSCLK 
55 { 
56    RCC_DeInit(); /*将外设RCC寄存器重设为缺省值 */ 
57    RCC_HSEConfig(RCC_HSE_ON);      /*设置外部高速晶振(HSE) HSE晶振打开(ON)*/ 
58 
59    if(RCC_WaitForHSEStartUp() == SUCCESS) {  /*等待HSE起振,  SUCCESS:HSE晶振稳定且就绪*/  
60 
61    RCC_HCLKConfig(RCC_SYSCLK_Div1);/*设置AHB时钟(HCLK)RCC_SYSCLK_Div1——AHB时钟 = 系统时*/  
62    RCC_PCLK2Config(RCC_HCLK_Div1); /*设置高速AHB时钟(PCLK2)RCC_HCLK_Div1——APB2时钟 = HCLK*/     
63    RCC_PCLK1Config(RCC_HCLK_Div2); /*设置低速AHB时钟(PCLK1)RCC_HCLK_Div2——APB1时钟 = HCLK / 2*/      
64 
65    RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9);/*设置PLL时钟源及倍频系数,外部晶振8M, 现在1分频,9倍频,频率=8/1*9=72M*/    
66    RCC_PLLCmd(ENABLE);      /*使能PLL */ 
67    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ; /*检查指定的RCC标志位(PLL准备好标志)设置与否*/ 
68     
69    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  /*设置系统时钟(SYSCLK) */  
70    while(RCC_GetSYSCLKSource() != 0x08);     /*0x08:PLL作为系统时钟 */        
71  } 
72 } 
View Code
 1 /*pbdata.h*/
 2 
 3 #ifndef _pbdata_H
 4 #define _pbdata_H
 5 
 6 #include"stm32f10x.h"
 7 
 8 /*自定义全局变量*/
 9 extern u8 dt;
10 
11 /*自定义函数*/
12 void delay(u32 nCount);
13 void delay_us(u32 nus);
14 void delay_ms(u16 nms);
15 void RCC_HSE_Configuration(void);
16 #endif
View Code

 

2、例程下载

http://download.csdn.net/detail/a1181803348/8737739

posted @ 2015-05-24 16:34  如风轻逸  阅读(316)  评论(0编辑  收藏  举报