📄 f32x_clock_multiplier.c
字号:
//-----------------------------------------------------------------------------
// F32x_Clock_Multiplier.c
//-----------------------------------------------------------------------------
// Copyright 2006 Silicon Laboratories, Inc.
// http://www.silabs.com
//
// Program Description:
//
// This example demonstrates how to initialize and switch to the C8051F32x
// Clock Multiplier.
// - Pinout:
// P2.0 -> SW
//
// P2.2 -> LED
//
// P3.0 -> C2D (debug interface)
//
// all other port pins unused
//
// How To Test:
//
// 1) Download code to a 'F32x device.
// 2) Verify that the P2.2 -> P2.2_LED is in place on the J3 header.
// 3) Run the code:
// - the test will blink an LED at a frequency based on the SYSCLK
// - press the switch on P2.0 to switch the SYSCLK between the internal
// oscillator (12 MHz) and the Clock Multiplier/2 (24 MHz).
//
//
// FID: 32X000052
// Target: C8051F32x
// Tool chain: Keil C51 7.50 / Keil EVAL C51
// Command Line: None
//
// Release 1.0
// -Initial Revision (TP)
// -24 MAY 2006
//
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <C8051F320.h> // SFR declarations
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define init_SYSCLK 12000000 // Initial SYSCLK setting = IntOsc
sfr16 TMR2RL = 0xCA; // Timer2 reload value
sfr16 TMR2 = 0xCC; // Timer2 counter
sbit LED = P2^2; // LED='1' means ON
sbit SW = P2^0; // SW='0' means switch pressed
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void CLKMUL_Init (void);
void Port_Init (void);
void Timer2_Init (void);
void Timer2_ISR (void);
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
//
// Main routine performs all configuration tasks, then loops forever polling on
// the SW switch and switching the CLKSEL register between the Internal
// Oscillator and the Clock Multiplier/2.
//
//-----------------------------------------------------------------------------
void main (void)
{
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer
// enable)
SYSCLK_Init (); // Initialize system clock to 12MHz
CLKMUL_Init (); // Initialize the Clock Multiplier
Port_Init (); // Initialize crossbar and GPIO
Timer2_Init (); // Init Timer2 to generate
// interrupts for the LED.
// When the SYSCLK is switched to
// the Clock Multiplier output, the
// interrupts will be at 2x the rate.
EA = 1; // Enable global interrupts
while (1) { // Spin forever
while (SW != 0); // Wait until the switch is pressed
CLKSEL = 0x02; // Switch SYSCLK to the CLKMUL output
// LED now blinking at 2x the rate
while (SW == 0); // Wait until the switch is released
while (SW != 0); // Wait until the switch is pressed
CLKSEL = 0x00; // Switch SYSCLK to the IntOsc output
// LED now blinking at the original
// rate
while (SW == 0); // Wait until the switch is released
}
}
//-----------------------------------------------------------------------------
// Initialization Routines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// SYSCLK_Init ()
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// This routine initializes the system clock to use the internal 12 MHz
// oscillator as its clock source. Also enables missing clock detector reset.
//
//-----------------------------------------------------------------------------
void SYSCLK_Init (void)
{
OSCICN = 0x83; // Configure internal oscillator for
// its highest frequency (12 MHz)
RSTSRC = 0x04; // Enable missing clock detector
}
//-----------------------------------------------------------------------------
// CLKMUL_Init ()
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// This routine initializes the Clock Multiplier using the Internal Oscillator
// as the source.
//
//-----------------------------------------------------------------------------
void CLKMUL_Init (void)
{
char i;
CLKMUL = 0x00; // Reset the Multiplier by writing 0x00
// to register CLKMUL.
CLKMUL |= 0x00; // Select the Multiplier input source
// via the MULSEL bits.
// '00'b = Internal Oscillator
CLKMUL |= 0x80; // Enable the Multiplier with the MULEN
// bit (CLKMUL | = 0x80).
for (i = 35; i > 0; i--); // Delay for >5 祍.
// At 12 MHz SYSCLK ~ 80 ns, so 5 us is
// 61 SYSCLK counts. DJNZ = 2 clocks.
CLKMUL |= 0xC0; // Initialize the Multiplier with the
// MULINIT bit (CLKMUL | = 0xC0).
while ((CLKMUL & 0x20) != 0x20); // Poll for MULRDY =>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -