关于系统时钟初始化函数“void Stm32_Clock_Init(u8 PLL)

来源:互联网 发布:mac客户端网游 编辑:程序博客网 时间:2024/06/06 16:34
void Stm32_Clock_Init(u8 PLL)
{
unsigned char temp=0;   
MYRCC_DeInit();//问题1:这个初始化函数有什么用?STM32上电自动复位吗?在led交替闪烁程序里我把这句注释掉也是可行的  
  RCC->CR|=0x00010000;  
while(!(RCC->CR>>17));
RCC->CFGR=0X00000400; 
PLL-=2;
RCC->CFGR|=PLL<<18;  
RCC->CFGR|=1<<16;
FLASH->ACR|=0x32;//问题2:这个是怎么实现延时2个周期的?  

RCC->CR|=0x01000000;
while(!(RCC->CR>>25));
RCC->CFGR|=0x00000002;
while(temp!=0x02)    
{   
temp=RCC->CFGR>>2;
temp&=0x03;
}    
}    
其中:
void MYRCC_DeInit(void)
{
  RCC->APB1RSTR = 0x00000000;
RCC->APB2RSTR = 0x00000000; //问题3:这两句写1跟写0有什么区别?写0无作用,写1复位外设。我们用IO口时不是应该复位端口吗?怎么还是置0?
 
  RCC->AHBENR = 0x00000014; 
  RCC->APB2ENR = 0x00000000;   
  RCC->APB1ENR = 0x00000000;   
//RCC->CR |= 0x00000001;    //问题4:这句可以注释掉吧?我是这样想的:STM32上电后内部时钟工作,开始执行第一条代码,在外部时钟未工作之前都是内部时钟在起作用,等PLL作为系统时钟设置成功后,也就是“void Stm32_Clock_Init(u8 PLL);”函数里的这个循环
        while(temp!=0x02)    
{   
temp=RCC->CFGR>>2;
temp&=0x03;
}    
成功后切换到外部时钟,这样对吗?


 
RCC->CFGR &= 0xF8FF0000;   
RCC->CR &= 0xFEF6FFFF;   
RCC->CR &= 0xFFFBFFFF;    
RCC->CFGR &= 0xFF80FFFF; 
RCC->CIR = 0x00000000;   
 
#ifdef  VECT_TAB_RAM
MY_NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x1000);
#else   
MY_NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
#endif
}



--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



1,这个就是复位一些外设,不加影响也不大,因为你按复位键,就会对这些外设寄存器进行复位的。
2,这个硬件设计好了的,至于为什么,你得问ST设计芯片的人了。 
3,这里是复位结束,其实在前面应该加多2句,设置为1,的比较好点。
4,是可以去掉。





0 0