📄 f36x_oscillator_crystal.c
字号:
//-----------------------------------------------------------------------------
// F36x_Oscillator_Crystal.c
//-----------------------------------------------------------------------------
// Copyright 2006 Silicon Laboratories, Inc.
// http://www.silabs.com
//
// Program Description:
//
// This program demonstrates how to configure the oscillator for use with an
// external quartz crystal.
//
//
// How To Test:
//
// 1) Ensure that a quartz crystal, 10Meg resistor, and 33pF loading capacitors
// are installed.
// 1) Define the input external crystal frequency using <Crystal_Clock>
// 2) Compile and download code to a 'F36x device.
// 3) Run the code:
// - the test will blink an LED at a frequency based on the External
// Crystal frequency
// - the 'F36x will also output the SYSCLK to a port pin (P0.0) for
// observation
//
//
// FID: 36X000017
// Target: C8051F36x
// Tool chain: Keil C51 7.50 / Keil EVAL C51
// Command Line: None
//
// Release 1.0
// -Initial Revision (FB / TP)
// -25 OCT 2006
//
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <C8051F360.h> // SFR declarations
//-----------------------------------------------------------------------------
// External Oscillator Crystal Frequency Selection
//-----------------------------------------------------------------------------
//
// Please initialize the following constant to the crystal frequency
//
#define Crystal_Clock 22118400L // External Crystal oscillator
// frequency (Hz)
// NOTE: This value will determine the
// XFCN bits in ExtCrystalOsc_Init ()
// Timer2 using SYSCLK/12 as its time base
// Timer2 counts 65536 SYSCLKs per Timer2 interrupt
// LED target flash rate = 10 Hz
//
// If Crystal_Clock is too slow to divide into a number of counts,
// <count> will always remain 0.
#define LED_interrupt_count Crystal_Clock/12/65536/10
//-----------------------------------------------------------------------------
// 16-bit Register Definitions for the 'F36x
//-----------------------------------------------------------------------------
sfr16 TMR2RL = 0xCA; // Timer2 reload value
sfr16 TMR2 = 0xCC; // Timer2 counter
//-----------------------------------------------------------------------------
// Global Variables
//-----------------------------------------------------------------------------
sbit LED = P3^2; // LED='1' means ON
//-----------------------------------------------------------------------------
// Function Prototypes
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void ExtCrystalOsc_Init (void);
void Port_Init (void);
void Timer2_Init (void);
//-----------------------------------------------------------------------------
// main() Routine
//-----------------------------------------------------------------------------
void main (void)
{
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer
// enable)
Port_Init (); // Initialize crossbar and GPIO
SYSCLK_Init (); // Initialize system clock to 24.5MHz
ExtCrystalOsc_Init (); // Initialize for and switch to the
// external Crystal oscillator
Timer2_Init (); // Init Timer2 to generate
// interrupts for the LED.
EA = 1; // Enable global interrupts
SFRPAGE = LEGACY_PAGE;
while (1) {}; // Loop forever
} // End of main()
//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// SYSCLK_Init ()
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// This routine initializes the system clock to use the internal 24.5 MHz
// oscillator as its clock source. Also enables missing clock detector reset.
//
void SYSCLK_Init (void)
{
unsigned char SFRPAGE_save = SFRPAGE; // Save the current SFRPAGE
SFRPAGE = CONFIG_PAGE; // Switch to the necessary SFRPAGE
OSCICN |= 0x03; // Configure internal oscillator for
// its highest frequency (16 MHz)
RSTSRC = 0x04; // Enable missing clock detector
SFRPAGE = SFRPAGE_save; // Restore the SFRPAGE
}
//-----------------------------------------------------------------------------
// ExtCrystalOsc_Init ()
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// This routine initializes for and switches to the External Crystal
// Oscillator.
//
void ExtCrystalOsc_Init (void)
{
unsigned int i;
unsigned char SFRPAGE_save = SFRPAGE; // Save the current SFRPAGE
SFRPAGE = CONFIG_PAGE; // Switch to the necessary SFRPAGE
// Set the appropriate XFCN bits for the crystal frequency
//
// XFCN Crystal (XOSCMD = 11x)
// 000 f <= 32 kHz
// 001 32 kHz < f <= 84 kHz
// 010 84 kHz < f <= 225 kHz
// 011 225 kHz < f <= 590 kHz
// 100 590 kHz < f <= 1.5 MHz
// 101 1.5 MHz < f <= 4 MHz
// 110 4 MHz < f <= 10 MHz
// 111 10 MHz < f <= 30 MHz
#if (Crystal_Clock <= 32000)
#define XFCN 0
#elif (Crystal_Clock <= 84000L)
#define XFCN 1
#elif (Crystal_Clock <= 225000L)
#define XFCN 2
#elif (Crystal_Clock <= 590000L)
#define XFCN 3
#elif (Crystal_Clock <= 1500000L)
#define XFCN 4
#elif (Crystal_Clock <= 4000000L)
#define XFCN 5
#elif (Crystal_Clock <= 10000000L)
#define XFCN 6
#elif (Crystal_Clock <= 30000000L)
#define XFCN 7
#else
#error "Defined Crystal Frequency outside allowable range!"
#define XFCN 0
#endif
// Step 1. Enable the external oscillator.
OSCXCN = 0x60; // External Oscillator is an external
// crystal (no divide by 2 stage)
OSCXCN |= XFCN;
// Step 2. Wait at least 1 ms.
for (i = 12250; i > 0; i--); // At 24.5 MHz, 1 ms = 24500 SYSCLKs
// DJNZ = 2 SYSCLKs
// Step 3. Poll for XTLVLD =>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -