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
}
|