|
不知道版主有没有耐心看我的RCC程序?
RCC->CR = RCC->CR | RCC_CR_HSION; //使能HSI
RCC->CR = RCC->CR | RCC_CR_HSITRIM; //HSI的频率校正
while((RCC->CR & RCC_CR_HSIRDY) != RCC_CR_HSIRDY); //等待HSI准备好
if(SysClk>8000000)
{
temp=SysClk/(8000000/2); //
// if(temp>2)temp=temp-2;
// RCC->CFGR = RCC->CFGR | (temp<<18); //设置PLL的倍数
RCC->CFGR = RCC->CFGR | RCC_PLLMul_12;
RCC->CFGR = RCC->CFGR | RCC_PLLSource_HSI_Div2; //选择HSI为PLL的输入
RCC->CR = RCC->CR | RCC_CR_PLLON; //使能PLL
while((RCC->CR & RCC_CR_PLLRDY) != RCC_CR_PLLRDY);//等待PLL准备好
RCC->CFGR = RCC->CFGR | 2; //选择PLL作为系统时钟
}
else
{
RCC->CFGR = RCC->CFGR | RCC_SYSCLKSource_HSI; //选择HSI作为系统时钟
}
倍数设置11程序正常执行,设置12倍就没有反应了;由于从MCO引脚看不到时钟输出,我是这样判断系统时钟的:
#define SysTick_Delay 1 //系统定时器n毫秒定时
#define SysTickClkSource 1 //1:SysTick使用AHB(HCLK)时钟做时钟源,0:SysTick使用AHB(HCLK)时钟8分频后做时钟源
void InitSysTick(void)
{
if(SysTickClkSource) //系统定时器采用AHB时钟做时钟源
{
SysTick->CTRL |= SysTick_CLKSource_HCLK;
SysTick->LOAD = SysTick_Delay*SysClk/1000;
}
else //AHB时钟8分频后做系统定时器时钟源
{
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
SysTick->LOAD = SysTick_Delay*SysClk/8/1000;
}
SysTick_CounterCmd(SysTick_Counter_Enable); //使能系统定时器
SysTick->CTRL |= 0x02; //使能系统定时器中断
}
在系统定时器中断函数
void SysTick_Handler(void)
{
if(SysTick->CTRL && 0x100);
WDI=!WDI;
// if(WdiCnt++>300){WDI=!WDI;WdiCnt=0;}
SysTickCnt++;
}
测量WDI信号频率,当我修改PLL倍数时把
#define SysClk 48000000 //当选择HSI为时钟源的时候系统时钟最大为64M
也改为期望的时钟值,那么PLL输出正确的话,WDI应该是500Hz(526Hz)左右。
不知道版主对此有何看法?谢谢!
当我选择HSE的时候结果是一样的,只是选择HSE做PLL的源PLL的输出精度非常高,WDI信号就是500Hz。 |
|