用配置寄存器编写的流水灯,LED接在G14上。没有设置RCC时钟的时候能够实现LED亮灭。添加了void Stm32_Clock_Init(u8 PLL)这个后灯就不亮了。怀疑是void Stm32_Clock_Init(u8 PLL)函数中的语句有哪一句执行不通过,然后我添加了一句GPIOG->ODR|=1<<14;来判断是哪一句不能执行!最后发现是 RCC->CFGR|=0x00000002; 不执行 求解释
#include <stm32f10x_map.h>
#include <stm32f10x_nvic.h>
u8 fac_us=0;//us延时倍乘数
u16 fac_ms=0;//ms延时倍乘数,在ucos下,代表每个节拍的ms数
//初始化延迟函数
//当使用ucos的时候,此函数会初始化ucos的时钟节拍
//SYSTICK的时钟固定为HCLK时钟的1/8
//SYSCLK:系统时钟
void delay_init(u8 SYSCLK)
{
SysTick->CTRL&=~(1<<2); //SYSTICK使用外部时钟源
fac_us=SYSCLK/8; //不论是否使用ucos,fac_us都需要使用
fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数
}
//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=0x01 ; //Systick使能 开始倒数
do
{
temp=SysTick->CTRL;
}
while((temp&0x01)&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
void Stm32_Clock_Init(u8 PLL)
{
unsigned char temp=0;
RCC->CR|=0x00010000; //外部高速时钟使能HSEO
//GPIOG->ODR|=1<<14;
while(!(RCC->CR>>17));//等待外部时钟就绪
// GPIOG->ODR|=1<<14;
RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
//GPIOG->ODR|=1<<14;
PLL-=2;//抵消2个单位
RCC->CFGR|=PLL<<18; //设置PLL值 2~16
//GPIOG->ODR|=1<<14;
RCC->CFGR|=1<<16; //PLLSRC ON
//GPIOG->ODR|=1<<14;
RCC->CR|=0x01000000; //PLLON
//GPIOG->ODR|=1<<14;
while(!(RCC->CR>>25));//等待PLL锁定
//GPIOG->ODR|=1<<14;
RCC->CFGR|=0x00000002;//PLL作为系统时钟
(发现这一句执行不过去,G14上面的灯不会亮)
GPIOG->ODR|=1<<14;
while(temp!=0x02) //等待PLL作为系统时钟设置成功
{
temp=RCC->CFGR>>2;
temp&=0x03;
}
}
void LED_Init(void)
{
RCC->APB2ENR|=1<<8;
GPIOG->CRH&=0XF0FFFFFF;
GPIOG->CRH|=0X03000000;
}
int main(void)
{ LED_Init();
Stm32_Clock_Init(9);
delay_init(72); //延时初始化
while(1)
{
GPIOG->BSRR=0x4000;
delay_ms(500);
GPIOG->BRR=0x4000;
delay_ms(500);
}
}
|