[mw_shl_code=c,true]int main(void)
{
unsigned char temp=0;
RCC->APB2ENR|=1<<3;//GPIOB时钟使能
RCC->APB2ENR|=1<<9;//ADC1时钟使能
GPIOB->CRL&=0xFFFFF0F0;//PB0 模拟输入
GPIOB->CRL|=0X00000303;//PB2 推挽输出 50Mhz
//系统时钟初始化
RCC->CR|=0x00010000; //外部8M时钟使能 HSE=ON
while(!(RCC->CR>>17));//等待外部时钟就绪 HSERDY 1=就绪
RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
RCC->CFGR|=(9-2)<<18;//PLL倍频系数 0111=9倍
RCC->CFGR|=1<<16;//PLL输入时钟源
RCC->CR|=1<<24;//PLL倍频启动 ON
while(!(RCC->CR>>25));//等待PLL时钟就绪 PLLRDY 1=就绪
RCC->CFGR|=0x00000002;//SW 选择PLL输出作为系统时钟
while(temp!=0x02)
{
temp=RCC->CFGR>>2;//SWS[1:0] 系统时钟切换状态
temp&=0x03;//10=PLL时钟
}
GPIOB->ODR|=1<<2;
}[/mw_shl_code]
我刚开始学,所以直接在主函数里写,参考的是例程中sys.c的Stm32_Clock_Init(u8 PLL)函数。
stm32的IO口推挽输出如果不给它置1的话 初始状态应该是0吧?
我发现这个程序没办法给PB.2置1,经过一句句屏蔽,发现时钟初始化的最后一步
[mw_shl_code=c,true]RCC->CFGR|=0x00000002;//SW 选择PLL输出作为系统时钟
while(temp!=0x02)
{
temp=RCC->CFGR>>2;//SWS[1:0] 系统时钟切换状态
temp&=0x03;//10=PLL时钟
}[/mw_shl_code]
如果我屏蔽掉这部分,PB.2可以置1;不屏蔽,PB.2一直为0,我不知道是不是这部分进入了死循环?
|