int main(void) { UART_Init(); UART_SendStr("\nSTM32F103RET6 is online.\n"); UART_SendStr("I2C init ... "); if (!LM75_Init(100000)) UART_SendStr("ready.\n"); else { UART_SendStr("fail.\n"); UART_SendStr("MCU halted now.\n"); while(1); } uint16_t value; value = LM75_ReadReg(0x00); UART_SendHex16(value); UART_SendChar('\n'); value = LM75_ReadConf(); UART_SendHex8(value); UART_SendChar('\n'); value = LM75_ReadReg(0x02); UART_SendHex16(value); UART_SendChar('\n'); value = LM75_ReadReg(0x03); UART_SendHex16(value); UART_SendChar('\n'); LM75_Shutdown(DISABLE); int16_t temp = LM75_Temperature(); UART_SendInt(temp / 10); UART_SendChar('.'); temp %= 10; if (temp < 0) temp *= -1; UART_SendInt(temp % 10); UART_SendStr("C\n"); while(1); }
/** * @brief Configure the LM75_I2C. * @param None * @retval None */ void LM75_Config(void) { LM75_StructInit (); LM75_Init(); }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f0xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f0xx.c file */ uint32_t index = 0; /* NVIC Configuration */ NVIC_Config(); /* Initialize the LCD */ STM320518_LCD_Init(); /* Initialize the Temperature Sensor */ LM75_Init(); if (LM75_GetStatus() == SUCCESS) { /* Clear the LCD */ LCD_Clear(LCD_COLOR_WHITE); /* Set the Back Color */ LCD_SetBackColor(LCD_COLOR_BLUE); /* Set the Text Color */ LCD_SetTextColor(LCD_COLOR_GREEN); LCD_DisplayStringLine(LCD_LINE_0, " Temperature "); /* Configure the Temperature sensor device STLM75: - Thermostat mode Interrupt - Fault tolerance: 00 */ LM75_WriteConfReg(0x02); /* Configure the THYS and TOS in order to use the SMbus alert interrupt */ LM75_WriteReg(LM75_REG_THYS, TEMPERATURE_THYS << 8); /*31°C*/ LM75_WriteReg(LM75_REG_TOS, TEMPERATURE_TOS << 8); /*32°C*/ /* Enables the I2C SMBus Alert feature */ I2C_SMBusAlertCmd(LM75_I2C, ENABLE); I2C_ClearFlag(LM75_I2C, I2C_FLAG_ALERT); SMbusAlertOccurred = 0; /* Enable SMBus Alert interrupt */ I2C_ITConfig(LM75_I2C, I2C_IT_ERRI, ENABLE); /* Infinite Loop */ while (1) { /* Get double of Temperature value */ TempValue = LM75_ReadTemp(); if (TempValue <= 256) { /* Positive temperature measured */ TempCelsiusDisplay[7] = '+'; /* Initialize the temperature sensor value*/ TempValueCelsius = TempValue; } else { /* Negative temperature measured */ TempCelsiusDisplay[7] = '-'; /* Remove temperature value sign */ TempValueCelsius = 0x200 - TempValue; } /* Calculate temperature digits in °C */ if ((TempValueCelsius & 0x01) == 0x01) { TempCelsiusDisplay[12] = 0x05 + 0x30; TempFahrenheitDisplay[12] = 0x05 + 0x30; } else { TempCelsiusDisplay[12] = 0x00 + 0x30; TempFahrenheitDisplay[12] = 0x00 + 0x30; } TempValueCelsius >>= 1; TempCelsiusDisplay[8] = (TempValueCelsius / 100) + 0x30; TempCelsiusDisplay[9] = ((TempValueCelsius % 100) / 10) + 0x30; TempCelsiusDisplay[10] = ((TempValueCelsius % 100) % 10) + 0x30; if (TempValue > 256) { if (((9 * TempValueCelsius) / 5) <= 32) { /* Convert temperature °C to Fahrenheit */ TempValueFahrenheit = abs (32 - ((9 * TempValueCelsius) / 5)); /* Calculate temperature digits in °F */ TempFahrenheitDisplay[8] = (TempValueFahrenheit / 100) + 0x30; TempFahrenheitDisplay[9] = ((TempValueFahrenheit % 100) / 10) + 0x30; TempFahrenheitDisplay[10] = ((TempValueFahrenheit % 100) % 10) + 0x30; /* Positive temperature measured */ TempFahrenheitDisplay[7] = '+'; } else { /* Convert temperature °C to Fahrenheit */ TempValueFahrenheit = abs(((9 * TempValueCelsius) / 5) - 32); /* Calculate temperature digits in °F */ TempFahrenheitDisplay[8] = (TempValueFahrenheit / 100) + 0x30; TempFahrenheitDisplay[9] = ((TempValueFahrenheit % 100) / 10) + 0x30; TempFahrenheitDisplay[10] = ((TempValueFahrenheit % 100) % 10) + 0x30; /* Negative temperature measured */ TempFahrenheitDisplay[7] = '-'; } } else { /* Convert temperature °C to Fahrenheit */ TempValueFahrenheit = ((9 * TempValueCelsius) / 5) + 32; /* Calculate temperature digits in °F */ TempFahrenheitDisplay[8] = (TempValueFahrenheit / 100) + 0x30; TempFahrenheitDisplay[9] = ((TempValueFahrenheit % 100) / 10) + 0x30; TempFahrenheitDisplay[10] = ((TempValueFahrenheit % 100) % 10) + 0x30; /* Positive temperature measured */ TempFahrenheitDisplay[7] = '+'; } /* Display Fahrenheit value on LCD */ for (index = 0; index < 20; index++) { LCD_DisplayChar(LCD_LINE_6, (319 - (16 * index)), TempCelsiusDisplay[index]); LCD_DisplayChar(LCD_LINE_7, (319 - (16 * index)), TempFahrenheitDisplay[index]); } if (SMbusAlertOccurred == 1) { /* Set the Back Color */ LCD_SetBackColor(LCD_COLOR_BLUE); /* Set the Text Color */ LCD_SetTextColor(LCD_COLOR_RED); LCD_DisplayStringLine(LCD_LINE_2, "Warning: Temp exceed"); LCD_DisplayStringLine(LCD_LINE_3, " 32 C "); } if (SMbusAlertOccurred == 2) { /* Set the Back Color */ LCD_SetBackColor(LCD_COLOR_WHITE); /* Set the Text Color */ LCD_SetTextColor(LCD_COLOR_WHITE); LCD_ClearLine(LCD_LINE_2); LCD_ClearLine(LCD_LINE_3); SMbusAlertOccurred = 0; /* Set the Back Color */ LCD_SetBackColor(LCD_COLOR_BLUE); /* Set the Text Color */ LCD_SetTextColor(LCD_COLOR_GREEN); } } }
/** * @brief Restore Demonstration context (GPIOs Configurations, peripherals,...). * @param None * @retval None */ void IDD_Measurement_RestoreContext(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; GPIOA->MODER = GPIOA_MODER; GPIOB->MODER = GPIOB_MODER; GPIOC->MODER = GPIOC_MODER; GPIOD->MODER = GPIOD_MODER; GPIOE->MODER = GPIOE_MODER; GPIOH->MODER = GPIOH_MODER; GPIOA->PUPDR = GPIOA_PUPDR; GPIOB->PUPDR = GPIOB_PUPDR; GPIOC->PUPDR = GPIOC_PUPDR; GPIOD->PUPDR = GPIOD_PUPDR; GPIOE->PUPDR = GPIOE_PUPDR; GPIOH->PUPDR = GPIOH_PUPDR; /* At this stage the system has resumed from STOP mode ---------------------*/ EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Line = IDD_WAKEUP_EXTI_LINE; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = DISABLE; EXTI_Init(&EXTI_InitStructure); /* Enable the EXTI Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = IDD_WAKEUP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; NVIC_Init(&NVIC_InitStructure); /* Configure IDD_CNT_EN pin as output push-pull ----------------------------*/ GPIO_InitStructure.GPIO_Pin = IDD_CNT_EN_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_Init(IDD_CNT_EN_GPIO_PORT, &GPIO_InitStructure); /* Allow access to the RTC */ PWR_RTCAccessCmd(ENABLE); /*!< LSE Enable */ RCC_LSEConfig(RCC_LSE_ON); /*!< Wait till LSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {} /*!< LCD Clock Source Selection */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* LCD GLASS Initialization */ LCD_GLASS_Init(); /* GPIO Configuration */ Demo_GPIOConfig(); /* Interrupt Configuration */ Demo_InterruptConfig(); /* Configure the systick */ Demo_SysTickConfig(); /*------------------- Drivers Initialization -------------------------------*/ /* Initialize the LEDs toggling */ Demo_LedShowInit(); /* Initialize the LCD */ STM32L152_LCD_Init(); /* If HSE is not detected at program startup */ if (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET) { /* Generate NMI exception */ SCB->ICSR |= SCB_ICSR_NMIPENDSET; } /* Initialize Wave player application */ WavePlayer_Init(); /* Initialize the Thermometer application */ LM75_Init(); /* Enable Leds toggling */ Demo_LedShow(ENABLE); /* COMP2 Configuration */ Demo_COMPConfig(); /* Enable Leds toggling */ Demo_LedShow(ENABLE); Demo_SysTickConfig(); }