这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 高山刘水6 ARM DIY进程贴 关于配置时钟的几个疑问

共3条 1/1 1 跳转至

高山刘水6 ARM DIY进程贴 关于配置时钟的几个疑问

菜鸟
2012-04-06 18:53:46     打赏

在配置时钟的编程过程中,程序中我有几点不太明白。希望各路高手指点指点。提前谢了!

疑问1:  
   程序中红色是进行分频的,可改变分频数对灯闪烁的频率没有影响,注释掉这两行程序对灯的闪烁情况也没影响(这两行程序像是多余的)。借了一块开发板给的例程也是这样。为什么?

疑问2:不对时钟进行配置程序也可以执行。默认时钟是内部时钟吗?

疑问3:看了几个版本的例程,都同时配置了pclk1和pclk2时钟。在不用pclk1时钟时,能不能不配置。



void SetSysClockTo72()            //pll时钟设置函数
{
 RCC_DeInit();     //RCC寄存器初始化
 RCC_HSEConfig(RCC_HSE_ON);    //打开外部时钟
// HSEStartUpStatus=RCC_WaitForHSEStartUp();
    HSEStartUpStatus=RCC_WaitForHSEStartUp();
 if(HSEStartUpStatus==SUCCESS)          //如果外部时钟启动成功就执行初始化
 {
  FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  //打开flash缓冲区
  FLASH_SetLatency(FLASH_Latency_2);     //配置flash延时周期
  RCC_HCLKConfig(RCC_SYSCLK_Div1);    //配置hclk时钟
  RCC_PCLK2Config(RCC_HCLK_Div1);     //配置pclk2时钟
  RCC_PCLK1Config(RCC_HCLK_Div2);
        //配置pclk1时钟 系统时钟2分频为36M
   
  RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);   //配置pll时钟为8*9=72M
  RCC_PLLCmd(ENABLE);   //打开pll时钟
  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)   //如果未启动成功则执行这个空循环
  {
  }
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);    //选择pll作为系统时钟
  while(RCC_GetSYSCLKSource()!=0x08)  //等待pll作为系统时钟
  {
  }
 
 }
  else    //如果未启动成功
  {
   while(1)
   {
   }
  }
}

 




关键词: 高山     刘水     进程     关于     配置     时钟     几个     疑问    

菜鸟
2012-04-06 21:11:37     打赏
2楼

完整的程序代码

#include "stm32f10x.h"


ErrorStatus HSEStartUpStatus;
void SetSysClockTo72(void);     //声明pll时钟设置
void RCC_Configuration(void);   //声明时钟初始化函数
void GPIO_Configuration(void);   //声明io口初始化函数
void delay(int);     //声明延时函数
GPIO_InitTypeDef GPIO_InitStructure;  //声明gpio的结构


int main(void)
{


 RCC_Configuration();   //初始化时钟
 GPIO_Configuration();   //初始化io口

 

  while (1)
  {
   
  GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_SET);   //置位第一个灯
  delay(20);
  GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_RESET);    //复位第一个灯
  delay(20);
  GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_SET);
  delay(20);
  GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET);
  delay(20);

  GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET);
  delay(20);
  GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET);
  delay(20);
  GPIO_WriteBit(GPIOB,GPIO_Pin_1,Bit_SET);
  delay(20);
  GPIO_WriteBit(GPIOB,GPIO_Pin_1,Bit_RESET);
  delay(20);  

  }
}

void GPIO_Configuration(void)   //io初始化函数
{
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_4;//选择io口的第一和四位
 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1 | GPIO_Pin_4; 
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;    //时钟速度为50M
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;      //设置为端口输出模式
 GPIO_Init(GPIOA,&GPIO_InitStructure);         //用以上几个参数初始化PA口
// GPIO_Init(GPIOA, &GPIO_InitStructure);
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;//选择io口的第0和1位
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;    //时钟速度为50M
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;      //设置为端口输出模式
 GPIO_Init(GPIOB,&GPIO_InitStructure);         //用以上几个参数初始化PB口
 

 
}
void RCC_Configuration(void)     //时钟初始化函数
{
  SetSysClockTo72();
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);

}

void SetSysClockTo72()            //pll时钟设置函数
{
 RCC_DeInit();     //RCC寄存器初始化
 RCC_HSEConfig(RCC_HSE_ON);    //打开外部时钟
// HSEStartUpStatus=RCC_WaitForHSEStartUp();
    HSEStartUpStatus=RCC_WaitForHSEStartUp();
 if(HSEStartUpStatus==SUCCESS)          //如果外部时钟启动成功就执行初始化
 {
  FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  //打开flash缓冲区
  FLASH_SetLatency(FLASH_Latency_2);     //配置flash延时周期
  RCC_HCLKConfig(RCC_SYSCLK_Div4);    //配置hclk时钟
  RCC_PCLK2Config(RCC_HCLK_Div1);     //配置pclk2时钟
  RCC_PCLK1Config(RCC_HCLK_Div2);        //配置pclk1时钟 系统时钟2分频为36M
   
  RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);   //配置pll时钟为8*9=72M
  RCC_PLLCmd(ENABLE);   //打开pll时钟
  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)   //如果未启动成功则执行这个空循环
  {
  }
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);    //选择pll作为系统时钟
  while(RCC_GetSYSCLKSource()!=0x08)  //等待pll作为系统时钟
  {
  }
 
 }
  else    //如果未启动成功
  {
   while(1)
   {
   }
  }
}


void delay(int k)
{
 int i,j;
 for(i=0;i<50000;i++)
  for(j=0;j<k;j++);
}
 
#ifdef  USE_FULL_ASSERT


void assert_failed(uint8_t* file, uint32_t line)
{

  while (1)
  {
  }
}
#endif

 


高工
2012-04-06 23:48:19     打赏
3楼
开始上程序了,不错,支持

共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]