/**************************************************************************//** * @brief Enable DK FPGA to generate GPIO PC14 trigger on control updates *****************************************************************************/ void DK_IRQInit(void) { /* Enable interrupts on joystick events only */ BSP_InterruptDisable(0xffff); BSP_InterruptFlagsClear(0xffff); BSP_InterruptEnable(BC_INTEN_JOYSTICK); }
/**************************************************************************//** * @brief Main function *****************************************************************************/ int main(void) { I2C_Init_TypeDef i2cInit = I2C_INIT_DEFAULT; TEMPSENS_Temp_TypeDef temp; /* Define previous temp to invalid, just to ensure update first time */ TEMPSENS_Temp_TypeDef prevTemp = {1000, 0}; int prevShowFahrenheit = showFahrenheit; /* Initialize DK 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 TFT */ RETARGET_SerialInit(); printf("\nEFM32 I2C temperature sensor example\n\n"); /* Enable board control interrupts */ BSP_InterruptDisable(0xffff); BSP_InterruptFlagsClear(0xffff); BSP_InterruptEnable(BC_INTEN_JOYSTICK); temperatureIRQInit(); /* Initialize I2C driver, using standard rate. Devices on DK itself */ /* supports fast mode, but in case some slower devices are added on */ /* prototype board, we use standard mode. */ I2CDRV_Init(&i2cInit); /* Main loop - just read temperature and update LCD */ while (1) { if (TEMPSENS_TemperatureGet(I2C0, TEMPSENS_DK_ADDR, &temp) < 0) { printf("ERROR\n"); /* Enter EM2, no wakeup scheduled */ EMU_EnterEM2(true); } /* Update LCD display if any change. This is just an example of how */ /* to save some energy, since the temperature normally is quite static. */ /* The compare overhead is much smaller than actually updating the display. */ if ((prevTemp.i != temp.i) || (prevTemp.f != temp.f) || (prevShowFahrenheit != showFahrenheit)) { temperatureUpdate(&temp); } prevTemp = temp; prevShowFahrenheit = showFahrenheit; /* Read every 2 seconds which is more than it takes worstcase to */ /* finish measurement inside sensor. */ RTCDRV_Trigger(2000, NULL); EMU_EnterEM2(true); } }
/**************************************************************************//** * @brief Energy Mode 2 demonstration, no active perpherals *****************************************************************************/ void Demo_EM2(void) { /* Disable DK interrupts */ BSP_InterruptDisable(0xffff); /* Enable LFRCO */ CMU->OSCENCMD = CMU_OSCENCMD_LFRCOEN; /* Disable all peripheral clocks */ CMU->HFPERCLKEN0 = 0x00000000; CMU->HFCORECLKEN0 = 0x00000000; CMU->LFACLKEN0 = 0x00000000; CMU->LFBCLKEN0 = 0x00000000; /* Enter Energy Mode 2 - this will never wake up */ EMU_EnterEM2(false); while(1) BSP_LedsSet(0xffff); }
/**************************************************************************//** * @brief Energy Mode 3 demonstration, no active peripherals *****************************************************************************/ void Demo_EM3(void) { /* Disable systick timer */ SysTick->CTRL = 0; /* Disable DVK interrupts */ BSP_InterruptDisable(0xffff); NVIC_DisableIRQ(GPIO_EVEN_IRQn); NVIC_ClearPendingIRQ(GPIO_EVEN_IRQn); /* Disable peripheral clocks */ CMU->HFPERCLKEN0 = 0x00000000; CMU->HFCORECLKEN0 = 0x00000000; CMU->LFACLKEN0 = 0x00000000; CMU->LFBCLKEN0 = 0x00000000; /* Enter Energy Mode 3 - never wake up */ EMU_EnterEM3(false); while(1) BSP_LedsSet(0xffff); }
/**************************************************************************//** * @brief Energy Mode 2 demonstration, with RTC wake up every 2nd second *****************************************************************************/ void Demo_EM2_RTC(void) { /* Disable systick timer */ SysTick->CTRL = 0; /* Disable DK interrupts */ BSP_InterruptDisable(0xffff); /* Disable all peripheral clocks */ CMU->HFPERCLKEN0 = 0x00000000; CMU->HFCORECLKEN0 = 0x00000000; CMU->LFACLKEN0 = 0x00000000; CMU->LFBCLKEN0 = 0x00000000; /* LFRCO will be enabled by RTCDRV_Trigger below */ /* Enter Energy Mode 2 - this will never wake up */ while(1) { /* Wake up every 2nd second */ RTCDRV_Trigger(2000, NULL); EMU_EnterEM2(false); } }
/**************************************************************************//** * @brief Main function *****************************************************************************/ int main(void) { I2C_Init_TypeDef i2cInit = I2C_INIT_DEFAULT; uint8_t data[3]; /* Initialize DK 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 TFT */ RETARGET_SerialInit(); printf("\nEFM32 I2C EEPROM example\n\n"); /* Enable board control interrupts */ BSP_InterruptDisable(0xffff); BSP_InterruptFlagsClear(0xffff); BSP_InterruptEnable(BC_INTEN_JOYSTICK); BSP_InterruptEnable(BC_INTEN_PB); eepromtestIRQInit(); /* Initialize I2C driver, using standard rate. Devices on DK itself */ /* supports fast mode, but in case some slower devices are added on */ /* prototype board, we use standard mode. */ I2CDRV_Init(&i2cInit); /* Main loop - just read data and update LCD */ while (1) { /* Should data be reset to factory default? */ if (eepromReset) { eepromReset = false; /* Data changed by user? */ data[0] = 0xFF; data[1] = 0xFF; data[2] = 0xFF; if (EEPROM_Write(I2C0, EEPROM_DVK_ADDR, 0, data, 3) < 0) { printf("RST ERR\n"); /* Enter EM2, no wakeup scheduled */ EMU_EnterEM2(true); } } if (EEPROM_Read(I2C0, EEPROM_DVK_ADDR, 0, data, 3) < 0) { printf("RD ERR\n"); /* Enter EM2, no wakeup scheduled */ EMU_EnterEM2(true); } eepromData = data[0]; eepromtestUpdateLCD(data); /* Just enter EM2 until joystick pressed */ EMU_EnterEM2(true); /* Data changed by user? */ if (eepromData != data[0]) { data[0] = eepromData; data[1] = eepromData + 1; data[2] = eepromData + 2; if (EEPROM_Write(I2C0, EEPROM_DVK_ADDR, 0, data, 3) < 0) { printf("WR ERR\n"); /* Enter EM2, no wakeup scheduled */ EMU_EnterEM2(true); } } } }
/**************************************************************************//** * @brief Main function *****************************************************************************/ int main(void) { SYSTEM_ChipRevision_TypeDef revision; char string[8]; int i; uint32_t temp; /* 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(); CMU_ClockEnable(cmuClock_HFPER, true); CMU_ClockEnable(cmuClock_ADC0, true); CMU_ClockEnable(cmuClock_GPIO, true); /* Initialize LCD controller without boost */ SegmentLCD_Init(false); SegmentLCD_AllOff(); /* Check for revision after revision B. Chips with revision earlier than */ /* Revision C has known problems with the internal temperature sensor. */ /* Display a warning in this case */ SYSTEM_ChipRevisionGet(&revision); if (revision.minor < 2) { SegmentLCD_Write("WARNING"); RTCDRV_Trigger(2000, NULL); EMU_EnterEM2(true); SegmentLCD_Write("REV C+"); RTCDRV_Trigger(2000, NULL); EMU_EnterEM2(true); SegmentLCD_Write("REQUIRD"); RTCDRV_Trigger(2000, NULL); EMU_EnterEM2(true); } /* Enable board control interrupts */ BSP_InterruptDisable(0xffff); BSP_InterruptFlagsClear(0xffff); BSP_InterruptEnable(BC_INTEN_JOYSTICK); temperatureIRQInit(); /* Setup ADC for sampling internal temperature sensor. */ setupSensor(); /* Main loop - just read temperature and update LCD */ while (1) { /* Start one ADC sample */ ADC_Start(ADC0, adcStartSingle); /* Wait in EM1 for ADC to complete */ EMU_EnterEM1(); /* Read sensor value */ temp = ADC_DataSingleGet(ADC0); /* Convert ADC sample to Fahrenheit / Celsius and print string to display */ if (showFahrenheit) { /* Show Fahrenheit on alphanumeric part of display */ i = (int)(convertToFahrenheit(temp) * 10); snprintf(string, 8, "%2d,%1d%%F", (i/10), i%10); /* Show Celsius on numeric part of display */ i = (int)(convertToCelsius(temp) * 10); SegmentLCD_Number(i*10); SegmentLCD_Symbol(LCD_SYMBOL_DP10, 1); } else { /* Show Celsius on alphanumeric part of display */ i = (int)(convertToCelsius(temp) * 10); snprintf(string, 8, "%2d,%1d%%C", (i/10), i%10); /* Show Fahrenheit on numeric part of display */ i = (int)(convertToFahrenheit(temp) * 10); SegmentLCD_Number(i*10); SegmentLCD_Symbol(LCD_SYMBOL_DP10, 1); } SegmentLCD_Write(string); /* Sleep for 2 seconds in EM 2 */ RTCDRV_Trigger(2000, NULL); EMU_EnterEM2(true); } }
/**************************************************************************//** * @brief Main function *****************************************************************************/ int main(void) { uint8_t prod_rev; uint32_t temp; uint32_t temp_offset; float temperature; /* Initialize DK 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 the TFT stdio retarget module. */ RETARGET_TftInit(); printf("\nEFM32 onchip temperature sensor example\n\n"); CMU_ClockEnable(cmuClock_HFPER, true); CMU_ClockEnable(cmuClock_ADC0, true); CMU_ClockEnable(cmuClock_GPIO, true); /* Enable board control interrupts */ BSP_InterruptDisable(0xffff); BSP_InterruptFlagsClear(0xffff); BSP_InterruptEnable(BC_INTEN_JOYSTICK); temperatureIRQInit(); /* This is a work around for Chip Rev.D Errata, Revision 0.6. */ /* Check for product revision 16 and 17 and set the offset */ /* for ADC0_TEMP_0_READ_1V25. */ prod_rev = (DEVINFO->PART & _DEVINFO_PART_PROD_REV_MASK) >> _DEVINFO_PART_PROD_REV_SHIFT; if( (prod_rev == 16) || (prod_rev == 17) ) { temp_offset = 112; } else { temp_offset = 0; } /* Setup ADC for sampling internal temperature sensor. */ setupSensor(); /* Main loop - just read temperature and update LCD */ while (1) { /* Start one ADC sample */ ADC_Start(ADC0, adcStartSingle); /* Wait in EM1 for ADC to complete */ EMU_EnterEM1(); /* Read sensor value */ /* According to rev. D errata ADC0_TEMP_0_READ_1V25 should be decreased */ /* by the offset but it is the same if ADC reading is increased - */ /* reference manual 28.3.4.2. */ temp = ADC_DataSingleGet(ADC0) + temp_offset; /* Convert ADC sample to Fahrenheit / Celsius and print string to display */ if (showFahrenheit) { temperature = convertToFahrenheit(temp); } else { temperature = convertToCelsius(temp); } printf("%d.%d %c\n", (int) temperature, (int)(10*(temperature-(int)temperature)), showFahrenheit? 'F' : 'C'); /* Sleep for 2 seconds in EM 2 */ RTCDRV_Trigger(2000, NULL); EMU_EnterEM2(true); } }