/**************************************************************************//** * @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 Initialize GPIO interrupt on PC14 *****************************************************************************/ void GPIO_EVEN_IRQHandler(void) { uint16_t data, joystick; /* Clear interrupt */ data = BSP_InterruptFlagsGet(); BSP_InterruptFlagsClear(data); /* Clear GPIO interrupt */ GPIO_IntClear(1 << 2); /* Read joystick status */ joystick = BSP_JoystickGet(); if ( joystick == BC_UIF_JOYSTICK_UP ) { if ( eMode > 0 ) eMode = eMode - 1; } if ( joystick == BC_UIF_JOYSTICK_DOWN ) { if ( eMode < 6 ) eMode = eMode + 1; } /* Restart counter */ msCountDown = 4000; /* Light up LEDs according to joystick status */ BSP_LedsSet(joystick); }
/**************************************************************************//** * @brief GPIO Interrupt handler *****************************************************************************/ void GPIO_EVEN_IRQHandler(void) { uint16_t joystick; /* Clear interrupt */ BSP_InterruptFlagsClear(BC_INTEN_JOYSTICK); GPIO_IntClear(1 << 14); /* Read and store joystick activity */ joystick = BSP_JoystickGet(); /* One bit for each direction left/right/up/down + button */ switch (joystick) { case JOY_MODE_BUTTON: emMode = JOY_MODE_NONE; BSP_LedsSet(0x0000); SegmentLCD_Symbol(LCD_SYMBOL_PAD0, 0); SegmentLCD_Symbol(LCD_SYMBOL_PAD1, 0); break; case JOY_MODE_EM3: case JOY_MODE_EM4: emMode = joystick; BSP_LedsSet(0xffff); SegmentLCD_Symbol(LCD_SYMBOL_PAD0, 1); SegmentLCD_Symbol(LCD_SYMBOL_PAD1, 1); break; default: break; } }
/**************************************************************************//** * @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 GPIO Interrupt handler * This interrupt handler is not an example of good design, as it will do * a lot of operations inside the interrupt handler. *****************************************************************************/ void GPIO_EVEN_IRQHandler(void) { uint16_t joystick; uint16_t pb; /* Clear interrupt */ BSP_InterruptFlagsClear(BC_INTEN_JOYSTICK); BSP_InterruptFlagsClear(BC_INTEN_PB); GPIO_IntClear(1 << GPIO_INT_PIN); /* LEDs on to indicate joystick used */ BSP_LedsSet(0xffff); /* Read and store joystick activity - wait for key release */ joystick = BSP_JoystickGet(); while (BSP_JoystickGet()) ; /* Read and store pushbutton activity - wait for key release */ pb = BSP_PushButtonsGet(); while (BSP_PushButtonsGet()) ; /* LEDs off to indicate joystick release */ BSP_LedsSet(0x0000); /* Up increases data to store in EEPROM */ if (joystick & BC_UIF_JOYSTICK_UP) { eepromData++; } /* Down decreases data to store in EEPROM */ if (joystick & BC_UIF_JOYSTICK_DOWN) { eepromData--; } /* Reset modified data to factory default */ if (pb & BC_UIF_PB4) { eepromReset = true; } }
/**************************************************************************//** * @brief Initialize GPIO interrupt on PC14 *****************************************************************************/ void GPIO_EVEN_IRQHandler(void) { uint16_t data, joystick; /* Clear interrupt */ data = BSP_InterruptFlagsGet(); BSP_InterruptFlagsClear(data); /* Clear GPIO interrupt */ GPIO_IntClear(1 << GPIO_INT_PIN); /* Read joystick status */ joystick = BSP_JoystickGet(); /* Light up LEDs according to joystick status */ BSP_LedsSet(joystick); }
/**************************************************************************//** * @brief Initialize GPIO interrupt on PC14 *****************************************************************************/ void GPIO_EVEN_IRQHandler(void) { uint16_t flags, joystick, pb; /* Clear interrupt */ flags = BSP_InterruptFlagsGet(); BSP_InterruptFlagsClear(flags); /* Clear GPIO interrupt */ GPIO_IntClear(1 << GPIO_INT_PIN); /* Move selection */ if(flags & BC_INTEN_JOYSTICK) { /* Read joystick status */ joystick = BSP_JoystickGet(); /* Move selection around */ if(joystick == BC_UIF_JOYSTICK_UP) { if(eModeDemo>0) eModeDemo=eModeDemo-1; } if(joystick == BC_UIF_JOYSTICK_DOWN) { if(eModeDemo<8) eModeDemo=eModeDemo+1; } } /* Activate demo */ if(flags & BC_INTEN_PB) { pb = BSP_PushButtonsGet(); if(pb == BC_UIF_PB1) { runDemo = true; } /* Wait until key is released */ while(BSP_PushButtonsGet()!=0) ; } }
/**************************************************************************//** * @brief GPIO Interrupt handler * This interrupt handler is not an example of good design, as it will do * a lot of operations inside the interrupt handler. *****************************************************************************/ void GPIO_EVEN_IRQHandler(void) { uint16_t joystick; /* Clear interrupt */ BSP_InterruptFlagsClear(BC_INTEN_JOYSTICK); GPIO_IntClear(1 << GPIO_INT_PIN); /* LEDs on to indicate joystick used */ BSP_LedsSet(0xffff); /* Read and store joystick activity - wait for key release */ joystick = BSP_JoystickGet(); while (BSP_JoystickGet()); /* LEDs off to indicate joystick release */ BSP_LedsSet(0x0000); /* Push toggles celsius/fahrenheit */ if (joystick & BC_JOYSTICK_CENTER) { showFahrenheit ^= 1; } }
/**************************************************************************//** * @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); } }