本帖最后由 yzzly 于 2010-8-25 11:24 编辑  
 
不知道香版有没有耐心看我的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。
 |