本帖最后由 javasy 于 2012-5-22 07:32 编辑
我使用的是062,在切换外部时钟时程序一直停在了检查外部晶振处(下面程序加下划线一句),换过晶振、片子、电容等,用示波器看晶振脚上确定没起振。
哪位朋友遇到过这种情况,请指点一下,谢谢!
程序如下:
#include <c8051f060.h>
/************************************/
#define Crystal_Clock 12000000
/************************************/
void SYSCLK_Init (void);
void SYSCLK_ExtOsc_Init (void);
/************************************/
//----------------------------------------/
// 内部时钟设置
void SYSCLK_Init (void)
{
OSCICN = 0x83;
RSTSRC = 0x04; // Enable missing clock detector
}
//----------------------------------------/
// 外部时钟初始化
void SYSCLK_ExtOsc_Init (void)
{
unsigned int i;
#if (Crystal_Clock <= 32000)
#define XFCN 0
#elif (Crystal_Clock <= 84000)
#define XFCN 1
#elif (Crystal_Clock <= 225000)
#define XFCN 2
#elif (Crystal_Clock <= 590000)
#define XFCN 3
#elif (Crystal_Clock <= 1500000)
#define XFCN 4
#elif (Crystal_Clock <= 4000000)
#define XFCN 5
#elif (Crystal_Clock <= 10000000)
#define XFCN 6
#elif (Crystal_Clock <= 30000000)
#define XFCN 7
#else
#error "Defined Crystal Frequency outside allowable range!"
#define XFCN 0
#endif
OSCXCN = 0x60;
OSCXCN |= XFCN;
for (i = 13000; i > 0; i--); // 24.5MHz, 1ms=24500 SYSCLKs DJNZ=2 SYSCLKs
while (!(OSCXCN & 0x80));
CLKSEL = 0x01; // 禁止内部振荡器;
return;
}
/*****************************************/
// 主 程 序
void main (void)
{
WDTCN = 0xDE; // Disable watchdog timer
WDTCN = 0xAD;
SYSCLK_Init();
SYSCLK_ExtOsc_Init ();
while(1);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我用的是060,不过是有源晶振。
我已经试过了也不行,之前用的是33pF,后来改到22,15都不行。
void main (void)
{
WDTCN = 0xDE; // Disable watchdog timer
WDTCN = 0xAD;
SYSCLK_ExtOsc_Init ();
SYSCLK_Init();
while(1);
}
将时钟设置子程序更改一下位置,貌似外部时钟还未初始化时,已经开启了时钟检测功能。
使用一下官方的测试程序,确认不是硬件的问题再说!
一周热门 更多>