📄 sleepmodesdemo.c
字号:
/****************************************************************************
*
* MODULE: Sleep Modes Demo - Polling
*
* COMPONENT: $RCSfile: $
*
* VERSION: $Name: $
*
* REVISION: $Revision: $
*
* DATED: $Date: $
*
* STATUS: $State: $
*
* AUTHOR: gpfef
*
* DESCRIPTION:
*
*
* LAST MODIFIED BY: $Author: $
* $Modtime: $
*
****************************************************************************
*
* (c) Copyright 2005 JENNIC Ltd
*
****************************************************************************/
/****************************************************************************/
/*** Include files ***/
/****************************************************************************/
#include "jendefs.h"
#include "AppHardwareApi.h"
#include "Appapi.h"
#include "LedControl.h"
#include "button.h"
#include "Utils.h"
#include "gdb.h"
/****************************************************************************/
/*** Macro Definitions ***/
/****************************************************************************/
#define INTERVAL_IN_32K_PERIODS 160000
//#define FLASH_SLEEP
//#define HIGH_POWER // For JN5139 high power
#define DISABLE_INTS FALSE
#define ENABLE_INTS TRUE
#define FLASH_SLAVE_MASK 1
#define FLASH_SLEEP_CODE 0xb9
#define FLASH_WAKE_CODE 0xab
/****************************************************************************/
/*** Type Definitions ***/
/****************************************************************************/
typedef enum
{
E_NO_SLEEP = 0x00,
E_NO_MEMORY_HOLD,
E_WITH_MEMORY_HOLD,
E_DEEP_SLEEP
}teSleepState;
/****************************************************************************/
/*** Local Function Prototypes ***/
/****************************************************************************/
PRIVATE void vInit(void);
PRIVATE void vInitSystem(void);
PRIVATE void vInitButtonsLeds(void);
PRIVATE void vConfigureWakeSource(bool_t bEnableInts);
PRIVATE void vMain(void);
PRIVATE void vProcessButtons(void);
PRIVATE void vCheckWakeSource(void);
PRIVATE void vToggleLed(void);
PRIVATE void vSleep(teSleepState eSleepType);
PRIVATE void vHandleTimerInterrupt(uint32 u32DeviceId, uint32 u32ItemBitmap);
#ifdef FLASH_SLEEP
PRIVATE void vFlashSleep(uint8 u8CodeWord);
#endif
/****************************************************************************/
/*** Local Variables ***/
/****************************************************************************/
PRIVATE uint32 u32CalibratedIntervalTime;
PRIVATE bool_t bLedState = TRUE;
/****************************************************************************/
/*** Exported Variables ***/
/****************************************************************************/
/****************************************************************************/
/*** Exported Functions ***/
/****************************************************************************/
/****************************************************************************
*
* NAME: AppColdStart
*
* DESCRIPTION:
* Entry point for application.
*
* RETURNS:
* void, never returns
*
****************************************************************************/
PUBLIC void AppColdStart(void)
{
/* Debug hooks: include these regardless of whether debugging or not */
HAL_GDB_INIT();
HAL_BREAKPOINT();
vInit();
#ifdef UART0_DEBUG
vUtils_Debug("Woke from sleep or reset in AppColdStart");
#endif
vInitButtonsLeds();
vMain();
}
/****************************************************************************
*
* NAME: AppWarmStart
*
* DESCRIPTION:
* Entry point for application from boot loader when sleep with memory hold
* is used
*
* RETURNS:
* Never returns.
*
****************************************************************************/
PUBLIC void AppWarmStart(void)
{
vInit();
#ifdef FLASH_SLEEP
/* ensure FLASH device is awake */
vFlashSleep(FLASH_WAKE_CODE);
#endif
#ifdef UART0_DEBUG
vUtils_Debug("Woke from sleep with memory hold in AppWarmStart");
#endif
vMain();
}
/****************************************************************************/
/*** Local Functions ***/
/****************************************************************************/
/****************************************************************************
*
* NAME: vInitSystem
*
* DESCRIPTION:
* Initialises hardware.
*
* RETURNS:
* void
*
****************************************************************************/
PRIVATE void vInit(void)
{
#ifdef UART0_DEBUG
vUtils_Init();
#endif
vCheckWakeSource();
vInitSystem();
}
/****************************************************************************
*
* NAME: vInitSystem
*
* DESCRIPTION:
* Initialises Timers and Interrupts.
*
* RETURNS:
* void
*
****************************************************************************/
PRIVATE void vInitSystem(void)
{
// Register Timer 0 handler
vAHI_Timer0RegisterCallback(vHandleTimerInterrupt);
/* Initialise hardware interface */
(void)u32AHI_Init();
#ifdef HIGH_POWER
#ifdef JN513x
// Enable JN5139 High power module
vAHI_HighPowerModuleEnable(TRUE, TRUE);
#endif
#endif
vConfigureWakeSource(DISABLE_INTS);
(void)u32AppApiInit(NULL,NULL,NULL,NULL,NULL,NULL);
/* set timer up for four cycles per second */
vAHI_TimerEnable(E_AHI_TIMER_0, 10, FALSE, TRUE, FALSE);
vAHI_TimerClockSelect(E_AHI_TIMER_0, FALSE, TRUE );
vAHI_TimerStartRepeat(E_AHI_TIMER_0, 2000, 4000);
}
/****************************************************************************
*
* NAME: vHandleTimerInterrupt
*
* DESCRIPTION:
* Timer 0 interrupt handler
*
* RETURNS:
* void
*
****************************************************************************/
PRIVATE void vHandleTimerInterrupt(uint32 u32DeviceId, uint32 u32ItemBitmap)
{
if (u32DeviceId != E_AHI_DEVICE_TIMER0)
{
return;
}
vToggleLed();
}
/****************************************************************************
*
* NAME: vInitButtonsLeds
*
* DESCRIPTION:
* Initialises buttons and leds.
*
* RETURNS:
* void
*
****************************************************************************/
PRIVATE void vInitButtonsLeds(void)
{
vLedInitFfd();
vLedControl(0, FALSE);
vLedControl(1, TRUE);
vLedControl(2, FALSE);
vLedControl(3, FALSE);
vButtonInitFfd();
}
/****************************************************************************
*
* NAME: vConfigureWakeSource
*
* DESCRIPTION:
* Enables the comparator, DIO and wake timers, either enabling or
* disabling the interrupts on each of them
*
* PARAMETERS: Name RW Usage
* bEnableInts R TRUE to enable interrupts
*
* RETURNS:
* void
*
****************************************************************************/
PRIVATE void vConfigureWakeSource(bool_t bEnableInts)
{
/* Initialise buttons */
vAHI_DioInterruptEnable(0, BUTTON_ALL_MASK_FFD_PIN);
if (bEnableInts)
{
vAHI_DioInterruptEnable(BUTTON_3_PIN, 0);
vAHI_DioInterruptEdge(0, BUTTON_3_PIN);
}
#if 1
// Comparator enable block
/* turn on regulator so we can configure the comparator */
vAHI_ApConfigure(E_AHI_AP_REGULATOR_ENABLE, E_AHI_AP_INT_DISABLE,E_AHI_AP_SAMPLE_8,
E_AHI_AP_CLOCKDIV_500KHZ, E_AHI_AP_INTREF);
while (!bAHI_APRegulatorEnabled());
/* configure comparator */
vAHI_CompEnable(E_AHI_COMP_HYSTERESIS_20MV, E_AHI_COMP_SEL_EXT);
vAHI_CompIntEnable(bEnableInts, bEnableInts);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -