⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 system.c

📁 这是nrf24lu1的无线鼠标源代码,应用平台是keil c
💻 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 + -