?? f93x_sleepmode_smartclockwake.c
字號:
//-----------------------------------------------------------------------------
//
// Return Value : RTC0DAT
// Parameters : 1) unsigned char reg - address of RTC register to read
//
// This function will read one byte from the specified RTC register.
// Using a register number greater that 0x0F is not permited.
//
//-----------------------------------------------------------------------------
unsigned char RTC_Read (unsigned char reg)
{
reg &= 0x0F; // mask low nibble
RTC0ADR = reg; // pick register
RTC0ADR |= 0x80; // set BUSY bit to read
while ((RTC0ADR & 0x80) == 0x80); // poll on the BUSY bit
return RTC0DAT; // return value
}
//-----------------------------------------------------------------------------
// RTC_Write ()
//-----------------------------------------------------------------------------
//
// Return Value : none
// Parameters : 1) unsigned char reg - address of RTC register to write
// 2) unsigned char value - the value to write to <reg>
//
// This function will Write one byte to the specified RTC register.
// Using a register number greater that 0x0F is not permited.
//-----------------------------------------------------------------------------
void RTC_Write (unsigned char reg, unsigned char value)
{
reg &= 0x0F; // mask low nibble
RTC0ADR = reg; // pick register
RTC0DAT = value; // write data
while ((RTC0ADR & 0x80) == 0x80); // poll on the BUSY bit
}
//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// OSCILLATOR_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// This function initializes the system clock to use the internal precision
// oscillator.
//
//-----------------------------------------------------------------------------
void OSCILLATOR_Init (void)
{
RSTSRC = 0x06; // Enable missing clock detector and
// leave VDD Monitor enabled.
CLKSEL = 0x04; // Select low power internal osc.
// divided by 1 as the system clock
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// This function configures the crossbar and ports pins.
//
// P0.2 digital open-drain Switch 2
// P0.3 digital open-drain Switch 3
// P1.5 digital push-pull Red LED
// P1.6 digital push-pull Yellow LED
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
P0MDIN |= 0x0C; // P0.2, P0.3 are digital
P1MDIN |= 0x60; // P1.5, P1.6 are digital
P0MDOUT &= ~0x0C; // P0.2, P0.3 are open-drain
P1MDOUT |= 0x60; // P1.5, P1.6 are push-pull
P0 |= 0x0C; // Set P0.2, P0.3 latches to '1'
XBR2 = 0x40; // Enable crossbar and enable
// weak pull-ups
}
//-----------------------------------------------------------------------------
// RTC_Init ()
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// This function will initialize the smaRTClock.
//
//-----------------------------------------------------------------------------
void RTC_Init (void)
{
unsigned char i;
UU32 alarm_interval;
unsigned char CLKSEL_SAVE = CLKSEL;
RTC0KEY = 0xA5; // Unlock the smaRTClock interface
RTC0KEY = 0xF1;
RTC_Write (RTC0XCN, 0xC0); // Enable Automatic Gain Control
// and configure the smaRTClock
// oscillator for crystal mode
RTC_Write (RTC0XCF, 0x83); // Enable Automatic Load Capacitiance
// stepping and set the desired
// load capacitance to 4.5pF plus
// the stray PCB capacitance
RTC_Write (RTC0CN, 0x80); // Enable smaRTClock oscillator
//----------------------------------
// Wait for smaRTClock to start
//----------------------------------
CLKSEL = 0x74; // Switch to 156 kHz low power
// internal oscillator
// Wait > 2 ms
for (i=0xFF;i!=0;i--);
// Wait for smaRTClock valid
while ((RTC_Read (RTC0XCN) & 0x10)== 0x00);
// Wait for Load Capacitance Ready
while ((RTC_Read (RTC0XCF) & 0x40)== 0x00);
//----------------------------------
// smaRTClock has been started
//----------------------------------
RTC_Write (RTC0CN, 0xC0); // Enable missing smaRTClock detector
// and leave smaRTClock oscillator
// enabled.
// Wait > 2 ms
for (i=0xFF;i!=0;i--);
PMU0CF = 0x20; // Clear PMU wake-up source flags
CLKSEL = CLKSEL_SAVE; // Restore system clock
while(!(CLKSEL & 0x80)); // Poll CLKRDY
//----------------------------------
// Set the smaRTClock Alarm
//----------------------------------
// Calculate the alarm interval in smaRTClock ticks
alarm_interval.U32 = ((RTCCLK * WAKE_INTERVAL) / 1000L);
// Copy the alarm interval to the alarm registers
RTC_Write (ALARM0, alarm_interval.U8[b0]); // Least significant byte
RTC_Write (ALARM1, alarm_interval.U8[b1]);
RTC_Write (ALARM2, alarm_interval.U8[b2]);
RTC_Write (ALARM3, alarm_interval.U8[b3]); // Most significant byte
// Enable the smaRTClock timer and alarm with auto-reset
RTC_Write (RTC0CN, 0xDC);
}
//-----------------------------------------------------------------------------
// Timer2_Init
//-----------------------------------------------------------------------------
//
// Configure Timer2 to 16-bit auto-reload and generate an interrupt at
// interval specified by <counts> using SYSCLK/48 as its time base.
//
void Timer2_Init (int counts)
{
TMR2CN = 0x00; // Stop Timer2; Clear TF2;
// use SYSCLK/12 as timebase
CKCON &= ~0x60; // Timer2 clocked based on T2XCLK;
TMR2RL = -counts; // Init reload values
TMR2 = TMR2RL; // initalize timer to reload value
ET2 = 1; // enable Timer2 interrupts
TR2 = 1; // start Timer2
}
//-----------------------------------------------------------------------------
// Interrupt Service Routines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Timer2_ISR
//-----------------------------------------------------------------------------
// This routine changes the state of the LED whenever Timer2 overflows.
//
INTERRUPT(Timer2_ISR, INTERRUPT_TIMER2)
{
TF2H = 0; // clear Timer2 interrupt flag
RED_LED = !RED_LED; // change state of LEDs
}
//-----------------------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -