#include "stm32f10x_lib.h"
//采用HSI作为驱动时钟源
void HSI_SYSTEM_CLOCK( void )
{
//开启HSI,关闭HSE,CSS
RCC->CR = 0x00000000;//RCC_CR 初始化 ,有点多余,初始化就是0x83
RCC->CFGR = 0X00000000;//RCC_CFGR 初始化
RCC->CR |= 0X01;//开启HSION
while(RCC->CR&(u32)(1<<2));//相当于RCC_CR的HSIRDY = 1时跳出。(u32)1<<2 = 0...0000 0010;
//****PLLSRC配置要在PLLON之前配置******
RCC->CFGR &= 0<<16;//PLLSRC = 0 HSI/2 作为PLL输入时钟源
//****刻意的写这个配置成0 主要是位了体现配置过程。
RCC->CR |= 1<<24;//PLLON =1
while(RCC->CR & (u32)(1<<25));//等待PLLRDY = 1;
//配置PLL。9倍频,4*9=26Mhz。注意:PLLSRC必须在PLL关闭的情况下才能配置
//由于我们配置的是HSI/2 就是0 初始化就是0 所以这里没有改变,此程序存在风险
//RCC->CFGR |= (u32)(0x07<<18);//PLLMUL = 0111 ;9倍频
RCC->CFGR |= 1<<18;//3倍频
RCC->CFGR |= 1<<1;//SW[1:0] 10 PLL 作为系统时钟
}
void HSE_SYSTEM_CLOCK(void)
{
//开启HSE,关闭HSI,CSS
RCC->CR = 0x00000000;//RCC_CR 初始化
RCC->CR |= 1<<16;//开启HSEON
while(RCC->CR&(u32)(1<<17));//相当于RCC_CR的HSERDY = 1时跳出。(u32)1<<17 = 0...0000 0010.....;
RCC->CFGR &=~(u32)(1<<17);
RCC->CFGR |=1<<16;//PLLXTPRE = 0;PLLSRC = 1;HSE 作为PLL输入时钟源
RCC->CR |= 1<<24;//PLLON =1
while(RCC->CR & (u32)(1<<25));//等待PLLRDY = 1;
//配置PLL。9倍频,4*9=26Mhz。注意:PLLSRC必须在PLL关闭的情况下才能配置
//由于我们配置的是HSI/2 就是0 初始化就是0 所以这里没有改变,此程序存在风险
RCC->CFGR |= (u32)(0x07<<18);//PLLMUL = 0111 ;9倍频
RCC->CFGR |= 1<<1;//SW[1:0] 10 PLL 作为系统时钟
}
void LED_INIT(void)
{
RCC->APB2ENR = 0X00000000;
RCC->APB2ENR |= (1<<2)|(1<<5);//开启GPIOA,GPIOD设备时钟
//先配置PA8是输出模式 ,输出时一定要注意端口速率问题
GPIOA->CRH = 0x00000000;
GPIOA->CRH = 0x00000002;//输出模式,最大速度2Mhz 推免输出
//配置PD2是输出模式 ,输出时一定要注意端口速率问题
GPIOD->CRL = 0x00000000;
GPIOD->CRL = 0x00000200;//输出模式,最大速度2Mhz 推免输出
}
void delay(u32 time)//不晓得是多长时间啊
{
int i ,j;
for(i=0;i<10000;++i)
for(j=0;j<time;++j);
}
//HSI ->HSE -> LL
void SYSTEM_CLOCK_CHANGE(void)
{
//时钟改变的时候要注意关闭PLL,即PLLON=0;
RCC->CR &=~(u32)(1<<16);//PLLON = 0;
}
int main (void)
{
u8 flag=0;
u32 m=0;
HSI_SYSTEM_CLOCK();
LED_INIT();
while(1)
{
//LED0 闪烁 HSI时钟
if(flag == 0)
{
GPIOA->BSRR |= 1<<8;//PA8 = 1;
delay(10);
GPIOA->BSRR |=(1<<(8+16));
delay(10);
m++;
if(m==100){ flag = 1;m = 0;}//LED灯闪烁一百次
}
//改变时钟,主要是进行了重新配置
if(flag == 1)
{
SYSTEM_CLOCK_CHANGE();
HSE_SYSTEM_CLOCK();
flag = 2;
}
//HSE时钟运行
if(flag == 2)
{
GPIOA->BSRR |= 1<<8;//PA8 = 1;
delay(10);
GPIOA->BSRR |=(1<<(8+16));
delay(10);
m++;
if(m==100) while(1);//led灯闪烁100次结束
}
}
}
我程序中开始使用的是HSI内部时钟,PLL倍频后时钟速度比使用HSE时钟频率低,但是转化后,发现开发板上得LED灯的闪烁频率没有改变,求教。我的思想是在程序中开始配置HSI一个程序,之后配置HSE,两个配置是独立的,各自作为时钟控制都可以工作。之后改变时钟的时候,利用了关闭PLLON,之后再重新配置,不是很明白为什么看到的现象LED灯闪烁频率不变,?或者哪位有更好地方法,还希望指教。
|