📄 system.c
字号:
/* Copyright (c) 2007 Nordic Semiconductor. All Rights Reserved.
*
* The information contained herein is confidential property of Nordic Semiconductor. The use,
* copying, transfer or disclosure of such information is prohibited except by express written
* agreement with Nordic Semiconductor.
*
* $LastChangedRevision: 1854 $
*/
/** @file
* System level functions: Timers, port setup, ...
* @author Runar Kjellhaug
*
*/
#include "hal_nrf.h"
#include "radio.h"
#include "system.h"
#include "cklf.h"
bool device_op_mode; // select between PRX & PTX device
bool rf_wakeup;
uint8_t led_blink=0;
uint8_t wd_ctr=0;
void system_init(void)
{
port_init(0x00, 0x38, 0x00); // P0[2..0] outputs LED1,2,3
cklf_regxc_write(WWCON1,0x000b); // enable wake on P04 0x000b
// debounce:64clk, neg.edge
USBSLP = 0x01; // shut down USB part...save pwr
delay_10ms();
t0_init();
t1_init();
WUIRQ = 1; // wakeup int enabled
EA = 1; // global interrupt enable
device_boot_mess();
device_get_operation_mode(); // check if PTX or PRX...
if(rf_wakeup == true)
{
WUCONF = 0x2F; // enable WU & RFIRQ wakeup sources
}
else
{
WUCONF = 0xEF; // disable RFIRQ wakeup source
}
if(device_op_mode == HAL_NRF_PTX) // if PTX: init watchdog timer
{
TICKDV = 0x03; // set CKLF "TICK" to 125祍...
cklf_regxc_write(WWD, 0x3E80); // wd counter = 16000
// 125祍 * 16000 = 2s timeout
// i.e. start watchdog timer
}
}
void port_init(uint8_t alt, uint8_t dir, uint8_t value)
{
P0ALT = alt;
P0DIR = dir;
P0 = value;
}
void device_get_operation_mode(void)
{
if(B1)
{
device_op_mode = HAL_NRF_PTX; // Released B1 during "boot": enter PTX mode
LED3_OFF(); // LED3 blank, indicates PTX mode
}
else
{
device_op_mode = HAL_NRF_PRX; // Press B1 during "boot" to enter PRX mode
LED3_ON(); // LED3 lit, indicates PRX mode
if(!B3)
{
rf_wakeup = true;
LED2_ON();
}
else
{
rf_wakeup = false;
LED2_OFF();
}
}
}
void t0_init(void)
{
TL0 = 0xe9; // Timer0: ck/12 * 13334 = 10ms timeout
TH0 = 0xcb;
TMOD |= 0x01; // Timer0: Mode 1, 16-bit timer
TF0 = 0; // Timer0: interrupt flag clear
ET0 = 1; // Timer0: interrupt enable
TCON = 0; // Timer0: run control
TR0 = 0; // Timer0: stop timer
}
void t1_init(void)
{
TL1 = 0xe9; // Timer0: ck/12 * 13334 = 10ms timeout
TH1 = 0xcb;
TMOD |= 0x10; // Timer1: Mode 1, 16-bit timer
TF0 = 0; // Timer1: interrupt flag clear
ET1 = 1; // Timer1: interrupt enable
TCON = 0; // Timer1: run control
TR1 = 0; // Timer1: stop timer
}
void device_boot_mess(void)
{
uint8_t ctr;
for(ctr=0;ctr<3;ctr++)
{
LED1_BLINK();
while(led_blink) // wait until LED released...
;
delay_10ms();
LED2_BLINK();
while(led_blink) // wait until LED released...
;
delay_10ms();
LED3_BLINK();
while(led_blink) // wait until LED released...
;
delay_10ms();
LED2_BLINK();
while(led_blink) // wait until LED released...
;
delay_10ms();
LED1_BLINK();
while(led_blink) // wait until LED released...
;
delay_10ms();
}
}
void delay_10ms(void)
{
uint16_t ctr;
for(ctr=0; ctr<15000; ctr++)
;
}
void t0_ov_interrupt(void) interrupt T0_INT_VECT
{
TR0 = 0; // stop timer1
TL0 = 0xE9; // reload timer..
TH0 = 0xCB;
switch(led_blink)
{
case LED1:
LED1_OFF();
break;
case LED2:
LED2_OFF();
break;
case LED3:
LED3_OFF();
break;
}
led_blink = 0;
}
void t1_ov_interrupt(void) interrupt T1_INT_VECT
{
TL1 = 0xE9;
TH1 = 0xCB;
if(++wd_ctr == WD_TIMEOUT)
{
LED3_BLINK();
wd_ctr = 0x00;
}
}
void t2_ov_interrupt(void) interrupt T2_INT_VECT
{
T2CON = 0x00;
}
void wu_interrupt(void) interrupt WU_INT_VECT
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -