?? f500_timer0_16bittimer.c
字號:
//-----------------------------------------------------------------------------
// F500_Timer0_16bitTimer.c
//-----------------------------------------------------------------------------
// Copyright (C) 2008 Silicon Laboratories, Inc.
// http://www.silabs.com
//
// Program Description:
//
// This program flashes the green LED on the C8051F500 target board. The
// LED blink frequency is set using the #define BLINK_RATE
//
//
// How To Test:
//
// 1) Download code to the 'F500 target board
// 2) Ensure that the P1.3 pins are shorted together on the J19 header
// 3) Run the program. If the LED flashes at the specified blink rate, the
// program is working
//
//
// Target: C8051F500 (Side A of a C8051F500-TB)
// Tool chain: Keil C51 8.0 / Keil EVAL C51 / SDCC
// Command Line: None
//
// Release 1.1 / 11 JUN 2008 (ADT)
// -Edited Formatting
//
// Release 1.0 / 18 APR 2008 (GP)
// -Initial Revision
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <compiler_defs.h>
#include <C8051F500_defs.h> // SFR declarations
//-----------------------------------------------------------------------------
// Global Constants
//-----------------------------------------------------------------------------
#define SYSCLK 24000000/8 // SYSCLK frequency in Hz
#define BLINK_RATE 10 // How often to toggle the LED per sec.
// Minimum value is 1
// Reload value for Timer0 assuming a 1:48 scaling factor for Timer0 clock
#define TIMER0_RL_HIGH (0xFFFF -((SYSCLK/48/BLINK_RATE >> 8) & 0x00FF))
#define TIMER0_RL_LOW (0xFFFF -(SYSCLK/48/BLINK_RATE & 0x00FF))
//-----------------------------------------------------------------------------
// Pin Definitions
//-----------------------------------------------------------------------------
SBIT (LED, SFR_P1, 3); // LED==1 means ON
//-----------------------------------------------------------------------------
// Function Prototypes
//-----------------------------------------------------------------------------
void OSCILLATOR_Init (void);
void PORT_Init (void);
void TIMER0_Init (void);
INTERRUPT_PROTO (TIMER0_ISR, INTERRUPT_TIMER0);
//-----------------------------------------------------------------------------
// main() Routine
//-----------------------------------------------------------------------------
void main (void)
{
SFRPAGE = ACTIVE_PAGE; // Set SFRPAGE for PCA0MD
PCA0MD &= ~0x40; // Disable the watchdog timer
OSCILLATOR_Init (); // Configure system clock
PORT_Init (); // Initialize crossbar
TIMER0_Init (); // Initialize Timer0
EA = 1; // Enable global interrupts
while (1); // Spin forever
}
//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// OSCILLATOR_Init
//-----------------------------------------------------------------------------
//
// Return Value: None
// Parameters: None
//
// Configure the internal oscillator to maximum internal frequency / 8, which
// is 3 MHz
//
//-----------------------------------------------------------------------------
void OSCILLATOR_Init (void)
{
U8 SFRPAGE_save = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
OSCICN = 0x84;
SFRPAGE = SFRPAGE_save;
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Return Value: None
// Parameters: None
//
// Configure the Crossbar and GPIO ports.
//
// P1.3 - digital push-pull LED
//
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
U8 SFRPAGE_save = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
P1MDOUT |= 0x08; // Enable LED as a push-pull output
P1SKIP |= 0x08; // Skip the LED pin on the crossbar
XBR2 = 0x40; // Enable crossbar and weak pull-ups
SFRPAGE = SFRPAGE_save;
}
//-----------------------------------------------------------------------------
// TIMER0_Init
//-----------------------------------------------------------------------------
//
// Return Value: None
// Parameters: None
//
// Configure Timer0 to 16-bit Timer mode and generate an interrupt
// every TIMER0_RL Timer0 cycles using SYSCLK/48 as the Timer0 time base.
//
//-----------------------------------------------------------------------------
void TIMER0_Init(void)
{
// No need to set SFRPAGE as all registers accessed in this function
// are available on all pages
TH0 = TIMER0_RL_HIGH; // Init Timer0 High register
TL0 = TIMER0_RL_LOW; // Init Timer0 Low register
TMOD = 0x01; // Timer0 in 16-bit mode
CKCON = 0x02; // Timer0 uses a 1:48 prescaler
ET0 = 1; // Timer0 interrupt enabled
TCON = 0x10; // Timer0 ON
}
//-----------------------------------------------------------------------------
// Interrupt Service Routines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// TIMER0_ISR
//-----------------------------------------------------------------------------
//
// Process the Timer0 interrupt and toggle the LED
//
//-----------------------------------------------------------------------------
INTERRUPT (TIMER0_ISR, INTERRUPT_TIMER0)
{
LED = !LED; // Toggle the LED
TH0 = TIMER0_RL_HIGH; // Reinitialize Timer0 High register
TL0 = TIMER0_RL_LOW; // Reinitialize Timer0 Low register
}
//-----------------------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -