/**************************************************************************//** * @brief Main function *****************************************************************************/ int main(void) { bool vboost = false; /* Chip revision alignment and errata fixes */ CHIP_Init(); /* Initialize DVK board register access */ BSP_Init(BSP_INIT_DEFAULT); /* If first word of user data page is non-zero, enable eA Profiler trace */ BSP_TraceProfilerSetup(); /* Initialize board specific registers */ VDDCHECK_Init(); /* Check if voltage is below 3V, if so use voltage boost */ if (VDDCHECK_LowVoltage(2.9)) vboost = true; /* Disable Voltage Comparator */ VDDCHECK_Disable(); /* Run Energy Mode with LCD demo, see lcdtest.c */ SegmentLCD_Init(vboost); /* Display a message if vboost is enabled */ if ( vboost ) { SegmentLCD_Write("vboost"); RTCDRV_Delay(5000, false); } Test(); return 0; }
/**************************************************************************//** * @brief Fire energy mode segments on the LCD. *****************************************************************************/ static void BullsEye( int mode ) { if ( mode ) { SegmentLCD_EnergyMode( 0, 1 ); RTCDRV_Delay( 100 , false); SegmentLCD_EnergyMode( 1, 1 ); RTCDRV_Delay( 100 , false); SegmentLCD_EnergyMode( 2, 1 ); RTCDRV_Delay( 100 , false); SegmentLCD_EnergyMode( 3, 1 ); RTCDRV_Delay( 100 , false); SegmentLCD_EnergyMode( 4, 1 ); RTCDRV_Delay( 100 , false); } else { SegmentLCD_EnergyMode( 0, 0 ); SegmentLCD_EnergyMode( 1, 0 ); SegmentLCD_EnergyMode( 2, 0 ); SegmentLCD_EnergyMode( 3, 0 ); SegmentLCD_EnergyMode( 4, 0 ); } }
/**************************************************************************//** * @brief Main function. *****************************************************************************/ int main( void ) { int i; MPU_RegionInit_TypeDef flashInit = MPU_INIT_FLASH_DEFAULT; MPU_RegionInit_TypeDef sramInit = MPU_INIT_SRAM_DEFAULT; MPU_RegionInit_TypeDef peripheralInit = MPU_INIT_PERIPHERAL_DEFAULT; /* Chip alignment */ CHIP_Init(); /* If first word of user data page is non-zero, enable eA Profiler trace */ BSP_TraceProfilerSetup(); /* Enable LCD without voltage boost */ SegmentLCD_Init( false ); SegmentLCD_AllOff(); SegmentLCD_Symbol(LCD_SYMBOL_GECKO, 1); SegmentLCD_Symbol(LCD_SYMBOL_EFM32, 1); GpioInit(); RTCDRV_Setup( cmuSelect_LFXO, cmuClkDiv_32); ScrollText( " MPU DEMO PRESS Pb0 OR Pb1 " "TO GENERATE MPU EXCEPTIONS " ); MPU_Disable(); /* Flash memory */ MPU_ConfigureRegion( &flashInit ); /* SRAM */ MPU_ConfigureRegion( &sramInit ); /* SRAM, a 4k part with priviledged only access, this regions settings */ /* will override those of the previous region */ sramInit.regionNo = 2; sramInit.baseAddress = RAM_MEM_BASE + 0x2000; sramInit.size = mpuRegionSize4Kb; sramInit.accessPermission = mpuRegionApPRw; MPU_ConfigureRegion( &sramInit ); /* LCD, priviledged only access */ peripheralInit.regionNo = 3; peripheralInit.baseAddress = LCD_BASE; peripheralInit.size = mpuRegionSize128b; peripheralInit.accessPermission = mpuRegionApPRw; MPU_ConfigureRegion( &peripheralInit ); MPU_Enable( MPU_CTRL_PRIVDEFENA ); /* Full access to default memory map */ /* in priviledged state */ i = 0; while ( 1 ) { SegmentLCD_Number( i ); /* Count on numeric diplay */ i = ( i + 1 ) % 101; RTCDRV_Delay( 150 , false); if ( PB0_PUSHED() ) { BullsEye( 1 ); /* Generate an access violation in internal SRAM */ __set_CONTROL( 1 ); /* Enter User (unpriviledged) state */ *(volatile uint32_t *)(RAM_MEM_BASE + 0x2000) = 1; BullsEye( 0 ); } if ( PB1_PUSHED() ) { BullsEye( 1 ); /* Generate an access violation in LCD peripheral */ __set_CONTROL( 1 ); /* Enter User (unpriviledged) state */ BullsEye( 0 ); } } }
/**************************************************************************//** * @brief LCD Test Routine, shows various text and patterns *****************************************************************************/ void Test(void) { int i, numberOfIterations = 0; /* Initialize GPIO */ GPIO_IRQInit(); /* Initialize RTC */ RTCDRV_Setup(cmuSelect_LFRCO, cmuClkDiv_32); /* Loop through funny pattern */ while (1) { SegmentLCD_AllOff(); #if VBOOST_SUPPORT checkVoltage(); #endif if (emMode != DEMO_MODE_NONE) { SegmentLCD_Symbol(LCD_SYMBOL_PAD0, 1); SegmentLCD_Symbol(LCD_SYMBOL_PAD1, 1); } else { for (i = 100; i > 0; i--) { SegmentLCD_Number(i); EM2Sleep(10); } SegmentLCD_NumberOff(); SegmentLCD_Symbol(LCD_SYMBOL_GECKO, 1); SegmentLCD_Symbol(LCD_SYMBOL_EFM32, 1); SegmentLCD_Write(" TINY "); EM2Sleep(500); SegmentLCD_Write(" Gecko "); EM2Sleep(1000); SegmentLCD_AllOn(); EM2Sleep(1000); SegmentLCD_AllOff(); } if (emMode != DEMO_MODE_NONE) { SegmentLCD_Symbol(LCD_SYMBOL_PAD0, 1); SegmentLCD_Symbol(LCD_SYMBOL_PAD1, 1); } else { SegmentLCD_Write("OOOOOOO"); EM2Sleep(62); SegmentLCD_Write("XXXXXXX"); EM2Sleep(62); SegmentLCD_Write("+++++++"); EM2Sleep(62); SegmentLCD_Write("@@@@@@@"); EM2Sleep(62); SegmentLCD_Write("ENERGY "); EM2Sleep(250); SegmentLCD_Write("@@ERGY "); EM2Sleep(62); SegmentLCD_Write(" @@RGY "); EM2Sleep(62); SegmentLCD_Write(" M@@GY "); EM2Sleep(62); SegmentLCD_Write(" MI@@Y "); EM2Sleep(62); SegmentLCD_Write(" MIC@@ "); EM2Sleep(62); SegmentLCD_Write(" MICR@@"); EM2Sleep(62); SegmentLCD_Write(" MICRO@"); EM2Sleep(62); SegmentLCD_Write(" MICRO "); EM2Sleep(250); SegmentLCD_Write("-EFM32-"); EM2Sleep(250); /* Various eye candy */ SegmentLCD_AllOff(); if (emMode != DEMO_MODE_NONE) { SegmentLCD_Symbol(LCD_SYMBOL_PAD0, 1); SegmentLCD_Symbol(LCD_SYMBOL_PAD1, 1); } for (i = 0; i < 8; i++) { SegmentLCD_Number(numberOfIterations + i); SegmentLCD_ARing(i, 1); EM2Sleep(20); } for (i = 0; i < 8; i++) { SegmentLCD_Number(numberOfIterations + i); SegmentLCD_ARing(i, 0); EM2Sleep(100); } for (i = 0; i < 5; i++) { SegmentLCD_Number(numberOfIterations + i); SegmentLCD_Battery(i); SegmentLCD_EnergyMode(i, 1); EM2Sleep(100); SegmentLCD_EnergyMode(i, 0); EM2Sleep(100); } SegmentLCD_Symbol(LCD_SYMBOL_ANT, 1); for (i = 0; i < 4; i++) { SegmentLCD_EnergyMode(i, 1); EM2Sleep(100); } SegmentLCD_Symbol(LCD_SYMBOL_ANT, 0); SegmentLCD_Battery(0); } /* Energy Modes */ SegmentLCD_NumberOff(); SegmentLCD_Symbol(LCD_SYMBOL_GECKO, 1); SegmentLCD_Symbol(LCD_SYMBOL_EFM32, 1); if ((emMode != DEMO_MODE_EM3) && (emMode != DEMO_MODE_EM4)) { ScrollText("Energy Mode demo, Press PB0 for EM3 or PB1 for EM4 "); } SegmentLCD_Write(" EM0 "); SegmentLCD_Number(0); SegmentLCD_EnergyMode(0, 1); SegmentLCD_EnergyMode(1, 1); SegmentLCD_EnergyMode(2, 1); SegmentLCD_EnergyMode(3, 1); SegmentLCD_EnergyMode(4, 1); RTCDRV_Delay(4000, false); SegmentLCD_Write(" EM1 "); SegmentLCD_Number(1111); SegmentLCD_EnergyMode(0, 0); EM1Sleep(4000); SegmentLCD_Write(" EM2 "); SegmentLCD_Number(2222); SegmentLCD_EnergyMode(1, 0); EM2Sleep(4000); /* Check if somebody has pressed one of the buttons */ if (emMode == DEMO_MODE_EM3) { ScrollText("Going down to EM3, press PB0 to wake up "); SegmentLCD_Write(" EM3 "); SegmentLCD_Number(3333); RTCDRV_Delay(1000, false); /* Wake up on GPIO interrupt */ EM3Sleep(); SegmentLCD_Number(0000); SegmentLCD_Write("--EM0--"); RTCDRV_Delay(500, false); SegmentLCD_Symbol(LCD_SYMBOL_PAD0, 0); SegmentLCD_Symbol(LCD_SYMBOL_PAD1, 0); emMode = DEMO_MODE_NONE; } /* Check if somebody's joystick down */ if (emMode == DEMO_MODE_EM4) { ScrollText("Going down to EM4, press reset to restart "); SegmentLCD_Write(" EM4 "); SegmentLCD_Number(4444); RTCDRV_Delay(1000, false); /* Wake up on reset */ EM4Sleep(); } SegmentLCD_EnergyMode(0, 0); SegmentLCD_EnergyMode(1, 0); SegmentLCD_EnergyMode(2, 0); SegmentLCD_EnergyMode(3, 0); SegmentLCD_EnergyMode(4, 0); /* Scrolltext */ ScrollText(stext); /* Blink and animation featurs */ BlinkTest(); numberOfIterations++; } }
/**************************************************************************//** * @brief Main function *****************************************************************************/ int main(void) { WDOG_Init_TypeDef wInit = WDOG_INIT_DEFAULT; int i; /* Chip revision alignment and errata fixes */ CHIP_Init(); /* If first word of user data page is non-zero, enable eA Profiler trace */ BSP_TraceProfilerSetup(); /* Watchdog setup - Use defaults, excepts for these :*/ wInit.em2Run = true; wInit.em3Run = true; wInit.perSel = wdogPeriod_4k; /* 4k 1kHz periods should give ~4 seconds in EM3 */ /* Do the demo forever. */ /* EM0 - 1 sec HFXO */ CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFXO); /* Setup SysTick Timer for 1 msec interrupts */ if (SysTick_Config(CMU_ClockFreqGet(cmuClock_CORE) / 1000)) { while (1) ; } Delay(1000); /* EM0 - 1 sec HFRCO */ CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFRCO); /* Setup SysTick Timer for 1 msec interrupts */ if (SysTick_Config(CMU_ClockFreqGet(cmuClock_CORE) / 1000)) { while (1) ; } Delay(1000); /* Turn off systick */ SysTick_Disable(); /* EM1 - 1 sec */ RTCDRV_Trigger(1000, NULL); EMU_EnterEM1(); /* EM2 - 1 sec */ RTCDRV_Trigger(1000, NULL); EMU_EnterEM2(true); /* EM1 - 1 sec */ RTCDRV_Trigger(1000, NULL); EMU_EnterEM1(); /* EM2 - 1 sec */ RTCDRV_Trigger(1000, NULL); EMU_EnterEM2(true); /* Up and down from EM2 each 10 msec */ for (i=0; i < 10; i++) { RTCDRV_Trigger(10, NULL); EMU_EnterEM2(true); RTCDRV_Delay(10, false); } /* EM2 - 1 sec */ RTCDRV_Trigger(1000, NULL); EMU_EnterEM2(true); /* Up and down from EM2 each 2 msec */ for (i=0; i < 10; i++) { RTCDRV_Trigger(2, NULL); EMU_EnterEM2(true); } /* EM2 - 1 sec */ RTCDRV_Trigger(1000, NULL); EMU_EnterEM2(true); /* Up and down from EM2 each msec */ for (i=0; i < 10; i++) { RTCDRV_Trigger(1, NULL); EMU_EnterEM2(true); } /* EM2 - 1 sec */ RTCDRV_Trigger(1000, NULL); EMU_EnterEM2(true); /* Start watchdog */ WDOG_Init(&wInit); /* Enter EM3 - Watchdog will reset chip (and confuse debuggers) */ EMU_EnterEM3(true); /* We will never reach this point */ return 0; }
/**************************************************************************//** * @brief LCD Test Routine, shows various text and patterns *****************************************************************************/ void Test(void) { int i, numberOfIterations = 0; /* Initialize GPIO */ GPIO_IRQInit(); /* Loop through funny pattern */ while (1) { SegmentLCD_AllOff(); if (emMode == DEMO_MODE_NONE) { for (i = 100; i > 0; i--) { SegmentLCD_Number(i); EM2Sleep(10); } SegmentLCD_NumberOff(); SegmentLCD_Symbol(LCD_SYMBOL_OLIMEX, 1); SegmentLCD_Write(" Gecko "); EM2Sleep(1000); SegmentLCD_AllOn(); EM2Sleep(1000); SegmentLCD_AllOff(); SegmentLCD_Write("OPENOCD"); EM2Sleep(2000); SegmentLCD_Write("GDB"); EM2Sleep(2000); SegmentLCD_Write("DONE"); EM2Sleep(2000); SegmentLCD_Write("XXXXXXX"); EM2Sleep(500); SegmentLCD_Write("-EFM32-"); EM2Sleep(2000); /* Various eye candy */ SegmentLCD_AllOff(); for (i = 0; i < 17; i++) { SegmentLCD_LowerNumber( i); SegmentLCD_Battery(i); SegmentLCD_UnsignedHex(numberOfIterations +i); EM2Sleep(200); } SegmentLCD_Symbol(LCD_SYMBOL_ARR_UP, 1); EM2Sleep(200); SegmentLCD_Symbol(LCD_SYMBOL_ARR_DN, 1); EM2Sleep(200); SegmentLCD_Symbol(LCD_SYMBOL_ARR_L, 1); EM2Sleep(200); SegmentLCD_Symbol(LCD_SYMBOL_ARR_R, 1); EM2Sleep(200); SegmentLCD_Symbol(LCD_SYMBOL_MINUS, 1); SegmentLCD_Symbol(LCD_SYMBOL_PLUS, 1); EM2Sleep(100); SegmentLCD_Symbol(LCD_SYMBOL_u, 1); SegmentLCD_Symbol(LCD_SYMBOL_m, 1); SegmentLCD_Symbol(LCD_SYMBOL_H, 1); SegmentLCD_Symbol(LCD_SYMBOL_F, 1); EM2Sleep(200); SegmentLCD_Symbol(LCD_SYMBOL_2COL, 1); SegmentLCD_Symbol(LCD_SYMBOL_3COL, 1); SegmentLCD_Symbol(LCD_SYMBOL_4COL, 1); SegmentLCD_Symbol(LCD_SYMBOL_5COL, 1); SegmentLCD_Symbol(LCD_SYMBOL_6COL, 1); SegmentLCD_Symbol(LCD_SYMBOL_10COL, 1); SegmentLCD_Symbol(LCD_SYMBOL_1DP, 1); SegmentLCD_Symbol(LCD_SYMBOL_2DP, 1); SegmentLCD_Symbol(LCD_SYMBOL_3DP, 1); SegmentLCD_Symbol(LCD_SYMBOL_4DP, 1); SegmentLCD_Symbol(LCD_SYMBOL_5DP, 1); SegmentLCD_Symbol(LCD_SYMBOL_6DP, 1); SegmentLCD_Symbol(LCD_SYMBOL_8DP, 1); SegmentLCD_Symbol(LCD_SYMBOL_10DP, 1); SegmentLCD_Symbol(LCD_SYMBOL_11DP, 1); EM2Sleep(800); SegmentLCD_AllOff(); /* Energy Modes */ SegmentLCD_Number(0); SegmentLCD_Battery(0); SegmentLCD_Write(" EM0 "); RTCDRV_Delay(2000, false); SegmentLCD_Number(1111); SegmentLCD_Battery(1); SegmentLCD_Write(" EM1 "); EM1Sleep(2000); SegmentLCD_Number(2222); SegmentLCD_Battery(2); SegmentLCD_Write(" EM2 "); EM2Sleep(2000); ScrollText("Energy Mode demo, Press BUT2 for EM3 or BUT1 for EM4 "); EM2Sleep(500); SegmentLCD_Write("PRESS x"); EM2Sleep(2000); } /* Check if somebody has pressed one of the buttons */ if (emMode == DEMO_MODE_EM3) { SegmentLCD_Number(3333); SegmentLCD_Battery(3); SegmentLCD_Arrows(0, 1); //arrow down, go to sleep in EM3 ScrollText("Going down to EM3, press BUT2 to wake up "); SegmentLCD_Write(" EM3 "); RTCDRV_Delay(1000, false); /* Wake up on GPIO interrupt */ EM3Sleep(); SegmentLCD_Battery(0); SegmentLCD_Arrows(0, 0); //arrow down off SegmentLCD_Arrows(2, 1); //arrow up, wakeup from sleep in EM3 SegmentLCD_Write("wakeup"); RTCDRV_Delay(1500, false); SegmentLCD_Arrows(2, 0); //arrow up off SegmentLCD_Battery(0); SegmentLCD_Number(0000); SegmentLCD_Write("--EM0--"); RTCDRV_Delay(500, false); } /* Check if somebody's joystick down */ if (emMode == DEMO_MODE_EM4) { SegmentLCD_Number(4444); SegmentLCD_Battery(4); SegmentLCD_Arrows(0, 1); //arrow down, go to sleep in EM4 ScrollText("Going down to EM4, press reset to restart "); SegmentLCD_Write(" EM4 "); RTCDRV_Delay(1000, false); /* Wake up on reset */ EM4Sleep(); } /* Scrolltext */ ScrollText(stext); numberOfIterations++; } }