使用C8051F时晶振不起振,请有经验的朋友赐教。

2020-01-27 11:18发布

本帖最后由 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);
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
Spunky
1楼-- · 2020-01-27 11:43
 精彩回答 2  元偷偷看……
68336016
2楼-- · 2020-01-27 15:39
帮顶。
我用的是060,不过是有源晶振。
javasy
3楼-- · 2020-01-27 18:42
Spunky 发表于 2012-5-22 00:33
将起荡电容改小,用15p试试

我已经试过了也不行,之前用的是33pF,后来改到22,15都不行。
techbaby
4楼-- · 2020-01-28 00:05
//   主 程 序
void main (void)
{
  WDTCN = 0xDE;                            // Disable watchdog timer
  WDTCN = 0xAD;
SYSCLK_ExtOsc_Init ();
  SYSCLK_Init();

  while(1);
}
将时钟设置子程序更改一下位置,貌似外部时钟还未初始化时,已经开启了时钟检测功能。
techbaby
5楼-- · 2020-01-28 06:01
https://www.amobbs.com/forum.php?mod=attachment&aid=MTk0NTB8OTZjYWJiZDk3Yjg3ZWNlNDY1YzNkNTJlYjIwNTE0M2Z8MTU3OTkzNDY2Nw%3D%3D&request=yes&_f=.rar

使用一下官方的测试程序,确认不是硬件的问题再说!
ibmx311
6楼-- · 2020-01-28 10:10
 精彩回答 2  元偷偷看……

一周热门 更多>