//文件名p33clk.h #ifndef _P33CLK_H_ #define _P33CLK_H_ //#include "p33clk.h" #define WDT_ENB _SWDTEN = 1 #define WDT_DIS _SWDTEN = 0 //时钟源选择 #define OSCLK0 0 //FRC #define OSCLK1 1 //带PLL+N分频的FRC #define OSCLK2 2 //HS MS LS 外部时钟 #define OSCLK3 3 //带PLL的HS MS LS 外部时钟 #define OSCLK4 4 //保留 #define OSCLK5 5 //LPRC #define OSCLK6 6 //FRC/16 #define OSCLK7 7 //带N分频的FRC //处理器与CPU时钟分频比 #define DOZEDIV1 (0<<12) #define DOZEDIV2 (1<<12) #define DOZEDIV4 (2<<12) #define DOZEDIV8 (3<<12) #define DOZEDIV16 (4<<12) #define DOZEDIV32 (5<<12) #define DOZEDIV64 (6<<12) #define DOZEDIV128 (7<<12) //------------------------------ //Fosc = (Fin/V_FRCDIV/N1/N2)*M #define V_FRCDIV V_FRCDIV1 //FRC振荡分频系数 #define V_N1 V_N1DIV(2) //x = 2--33 N1 分频系数 #define V_N2 V_N2DIV2 //N2 分频系数 #define V_PLLFBD PLLMF(50) //(x=2--513)PLL 倍频比 //FRC 分频系数 #define V_FRCDIV1 0 #define V_FRCDIV2 1 #define V_FRCDIV4 2 #define V_FRCDIV8 3 #define V_FRCDIV16 4 #define V_FRCDIV32 5 #define V_FRCDIV64 6 #define V_FRCDIV256 7 //N1 #define V_N1DIV(x) (x-2) //N2 #define V_N2DIV2 0 #define V_N2DIV4 1 #define V_N2DIV8 3 //PLL 倍频数 M #define PLLMF(x) (x-2) //================================ extern void Init_Clk(uint16 OsClk) ; #endif //文件名p33clk.c #include "global.h" #include "p33clk.h" //*************************************** // 函数名称:InitClk // 函数功能:初始化时钟 // 入口参数:时钟来源选择 FRC分频 pll倍频比 // 出口参数:无 // 返回值:无 // Fosc = (Fin/V_FRCDIV/N1/N2)*M //*************************************** void Init_Clk(uint16 OsClk) { CLKDIV = 0X0000 ; //处理器与外设时钟比为1:1 _FRCDIV = V_FRCDIV ; //FRC分频系数 _PLLPOST = V_N2 ;//N2 _PLLPRE = V_N1 ;//N1 PLLFBD = V_PLLFBD ;// PLL倍频 OSCTUN = 0X0000 ; //振荡器调节寄存器 默认7.37M REFOCON = 0X0000 ; //参考时钟=系统时钟 OSCCON = 0X0000 ; _OSWEN = 1 ; //请求切换由NOSC指定的时钟 _NOSC = OsClk ; //切换 新的振荡器 while(_OSWEN) ;//等待时钟切换完成 if((_NOSC == OSCLK1) ||(_NOSC == OSCLK3))//带PLL { while(!_LOCK) ;//等待PLL锁定 } REFOCON |= 0X8000 ; //参考时钟输出使能 } //应用实例 -- 时钟初始化 //FRC 系统时钟1分频到CPU PLL倍频50 //Fin = 7.37M Fcpu = Fosc/2 = 46.0625M Init_Clk(OSCLK1) ;