/** * @brief Initializes the LCD. * @param None * @retval None */ void GL_LCD_Init(void) { /* Setups the LCD */ #if defined(USE_STM3210C_EVAL) STM3210C_LCD_Init(); #elif defined (USE_STM3210B_EVAL) STM3210B_LCD_Init(); #elif defined (USE_STM32100B_EVAL) STM32100B_LCD_Init(); #elif defined(USE_STM3210E_EVAL) STM3210E_LCD_Init(); #elif defined(USE_STM32100E_EVAL) STM32100E_LCD_Init(); #elif defined(USE_STM322xG_EVAL) STM322xG_LCD_Init(); #elif defined(USE_STM32L152_EVAL) STM32L152_LCD_Init(); #endif }
/** * @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_stm32f10x_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file */ /* Initialize LEDs, Key Button, LCD and COM port(USART) available on STM3210X-EVAL board ******************************************************/ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); /* USARTx configured as follow: - BaudRate = 115200 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */ USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; STM_EVAL_COMInit(COM1, &USART_InitStructure); /* Initialize the LCD */ #ifdef USE_STM32100B_EVAL STM32100B_LCD_Init(); #elif defined (USE_STM3210B_EVAL) STM3210B_LCD_Init(); #elif defined (USE_STM3210E_EVAL) STM3210E_LCD_Init(); #elif defined (USE_STM3210C_EVAL) STM3210C_LCD_Init(); #elif defined (USE_STM32100E_EVAL) STM32100E_LCD_Init(); #endif /* Display message on STM3210X-EVAL LCD *************************************/ /* Clear the LCD */ LCD_Clear(LCD_COLOR_WHITE); /* Set the LCD Back Color */ LCD_SetBackColor(LCD_COLOR_BLUE); /* Set the LCD Text Color */ LCD_SetTextColor(LCD_COLOR_WHITE); LCD_DisplayStringLine(LCD_LINE_0, (uint8_t *)MESSAGE1); LCD_DisplayStringLine(LCD_LINE_1, (uint8_t *)MESSAGE2); LCD_DisplayStringLine(LCD_LINE_2, (uint8_t *)MESSAGE3); /* Retarget the C library printf function to the USARTx, can be USART1 or USART2 depending on the EVAL board you are using ********************************/ printf("\n\r %s", MESSAGE1); printf(" %s", MESSAGE2); printf(" %s\n\r", MESSAGE3); /* Turn on leds available on STM3210X-EVAL **********************************/ STM_EVAL_LEDOn(LED1); STM_EVAL_LEDOn(LED2); STM_EVAL_LEDOn(LED3); STM_EVAL_LEDOn(LED4); /* Add your application code here */ /* Infinite loop */ while (1) { } }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /* Initialize LEDs and push-buttons mounted on STM3210X-EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); /* Initialize the LCD */ #ifdef USE_STM3210C_EVAL STM3210C_LCD_Init(); #elif defined (USE_STM32100E_EVAL) STM32100E_LCD_Init(); #endif /* USE_STM3210C_EVAL */ /* Clear the LCD */ LCD_Clear(White); /* Set the LCD Back Color */ LCD_SetBackColor(Blue); /* Set the LCD Text Color */ LCD_SetTextColor(White); /* Display messages on the LCD */ LCD_DisplayStringLine(Line0, MESSAGE1); LCD_DisplayStringLine(Line1, MESSAGE2); LCD_DisplayStringLine(Line2, MESSAGE3); /* Configure the IO Expander */ if (IOE_Config() == IOE_OK) { /* Display "IO Expander OK" on the LCD */ LCD_DisplayStringLine(Line4, " IO Expander OK "); } else { LCD_DisplayStringLine(Line4, "IO Expander FAILED "); LCD_DisplayStringLine(Line5, " Please Reset the "); LCD_DisplayStringLine(Line6, " board and start "); LCD_DisplayStringLine(Line7, " again "); while(1); } /* Draw a rectangle with the specifies parameters and Blue Color */ LCD_SetTextColor(Blue); LCD_DrawRect(180, 310, 40, 60); /* Draw a rectangle with the specifies parameters and Red Color */ LCD_SetTextColor(Red); LCD_DrawRect(180, 230, 40, 60); /* Draw a rectangle with the specifies parameters and Yellow Color */ LCD_SetTextColor(Yellow); LCD_DrawRect(180, 150, 40, 60); /* Draw a rectangle with the specifies parameters and Black Color */ LCD_SetTextColor(Black); LCD_DrawRect(180, 70, 40, 60); #ifdef IOE_INTERRUPT_MODE #ifdef USE_STM32100E_EVAL /* Enable the Touch Screen interrupts */ IOE_ITConfig(IOE_ITSRC_TSC); #else /* Enable the Touch Screen and Joystick interrupts */ IOE_ITConfig(IOE_ITSRC_JOYSTICK | IOE_ITSRC_TSC); #endif /* USE_STM32100E_EVAL */ #endif /* IOE_INTERRUPT_MODE */ /* Loop infinitely */ while(1) { #ifdef IOE_POLLING_MODE static TS_STATE* TS_State; #ifdef USE_STM3210C_EVAL static JOY_State_TypeDef JoyState = JOY_NONE; /* Get the Joytick State */ JoyState = IOE_JoyStickGetState(); switch (JoyState) { /* None Joystick has been selected */ case JOY_NONE: LCD_DisplayStringLine(Line5, "JOY: ---- "); break; case JOY_UP: LCD_DisplayStringLine(Line5, "JOY: UP "); break; case JOY_DOWN: LCD_DisplayStringLine(Line5, "JOY: DOWN "); break; case JOY_LEFT: LCD_DisplayStringLine(Line5, "JOY: LEFT "); break; case JOY_RIGHT: LCD_DisplayStringLine(Line5, "JOY: RIGHT "); break; case JOY_CENTER: LCD_DisplayStringLine(Line5, "JOY: CENTER "); break; default: LCD_DisplayStringLine(Line5, "JOY: ERROR "); break; } #endif /* USE_STM3210C_EVAL */ /* Update the structure with the current position of the Touch screen */ TS_State = IOE_TS_GetState(); if ((TS_State->TouchDetected) && (TS_State->Y < 220) && (TS_State->Y > 180)) { if ((TS_State->X > 10) && (TS_State->X < 70)) { /* Display LD4 on the LCD and turn on LED4 */ LCD_DisplayStringLine(Line6, " LD4 "); STM_EVAL_LEDOn(LED4); } else if ((TS_State->X > 90) && (TS_State->X < 150)) { /* Display LD3 on the LCD and turn on LED3 */ LCD_DisplayStringLine(Line6, " LD3 "); STM_EVAL_LEDOn(LED3); } else if ((TS_State->X > 170) && (TS_State->X < 230)) { /* Display LD2 on the LCD and turn on LED2 */ LCD_DisplayStringLine(Line6, " LD2 "); STM_EVAL_LEDOn(LED2); } else if ((TS_State->X > 250) && (TS_State->X < 310)) { /* Display LD1 on the LCD and turn on LED1 */ LCD_DisplayStringLine(Line6, " LD1 "); STM_EVAL_LEDOn(LED1); } } else { /* Turn off LED1..4 */ STM_EVAL_LEDOff(LED1); STM_EVAL_LEDOff(LED2); STM_EVAL_LEDOff(LED3); STM_EVAL_LEDOff(LED4); } #endif /* IOE_POLLING_MODE */ } }
/** * @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_stm32f10x_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file */ /* NVIC Configuration */ NVIC_Configuration(); /* Initialize the LCD */ #ifdef USE_STM32100E_EVAL STM32100E_LCD_Init(); #elif defined USE_STM3210E_EVAL STM3210E_LCD_Init(); #elif defined USE_STM32100B_EVAL STM32100B_LCD_Init(); #elif defined USE_STM3210B_EVAL STM3210B_LCD_Init(); #endif #ifdef USE_STM3210E_EVAL /* Disable FSMC only for STM32 High-density and XL-density devices */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, DISABLE); #endif /* USE_STM3210E_EVAL */ /* Initialize the Temperature Sensor */ LM75_Init(); if (LM75_GetStatus() == SUCCESS) { #ifdef USE_STM3210E_EVAL /* Enable FSMC */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); #endif /* USE_STM3210E_EVAL */ /* 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 "); #ifdef USE_STM3210E_EVAL /* Disable FSMC */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, DISABLE); /* Initialize the Temperature Sensor */ LM75_Init(); #endif /* USE_STM3210E_EVAL */ /* Configure the Temperature sensor device STLM75: - Thermostat mode Interrupt - Fault tolerance: 00 */ LM75_WriteConfReg(0x02); /* Configure the THYS and TOS inorder 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*/ I2C_ClearITPendingBit(LM75_I2C, I2C_IT_SMBALERT); SMbusAlertOccurred = 0; /* Infinite Loop */ while (1) { #ifdef USE_STM3210E_EVAL /* Disable FSMC */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, DISABLE); /* Initialize the Temperature Sensor */ LM75_Init(); #endif /* USE_STM3210E_EVAL */ /* Get double of Temperature value */ TempValue = LM75_ReadTemp(); #ifdef USE_STM3210E_EVAL /* Enable FSMC */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); #endif /* USE_STM3210E_EVAL */ 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 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_stm32xxx_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32xxx.c file */ /* Initialize LEDs, Key Button, LCD and COM port(USART) available on STM3210X-EVAL board ******************************************************/ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); /* Initialize TIM6 */ TIM6_Config(); /* Initialize the LCD */ #ifdef USE_STM322xG_EVAL STM322xG_LCD_Init(); #elif defined USE_STM324xG_EVAL STM324xG_LCD_Init(); #elif defined USE_STM3210C_EVAL STM3210C_LCD_Init(); #elif defined USE_STM32100E_EVAL STM32100E_LCD_Init(); #elif defined USE_STM32L152_EVAL STM32L152_LCD_Init(); #elif defined USE_STM32L152D_EVAL STM32L152D_LCD_Init(); #endif /* Display message on STM3210X-EVAL LCD *************************************/ /* Clear the LCD */ LCD_Clear(White); /* Set the LCD Back Color */ LCD_SetBackColor(Blue); /* Set the LCD Text Color */ LCD_SetTextColor(Yellow); LCD_DisplayStringLine(Line0, MESSAGE1); LCD_DisplayStringLine(Line1, MESSAGE2); LCD_DisplayStringLine(Line5, MESSAGE3); /* Configure the Push buttons in interrupt mode *****************************/ #if defined (USE_STM32100E_EVAL) || defined(USE_STM3210C_EVAL) || defined(USE_STM322xG_EVAL ) || defined (USE_STM324xG_EVAL) STM_EVAL_PBInit(BUTTON_KEY, Mode_EXTI); STM_EVAL_PBInit(BUTTON_TAMPER, Mode_EXTI); #elif defined (USE_STM32L152_EVAL) || defined (USE_STM32L152D_EVAL) STM_EVAL_PBInit(BUTTON_LEFT, Mode_EXTI); STM_EVAL_PBInit(BUTTON_RIGHT, Mode_EXTI); #endif /* USE_STM32100E_EVAL || USE_STM3210C_EVAL || USE_STM322xG_EVAL || USE_STM324xG_EVAL */ /* Start CPAL communication configuration ***********************************/ /* Initialize local Reception structures */ sRxStructure.wNumData = BufferSize; /* Maximum Number of data to be received */ sRxStructure.pbBuffer = tRxBuffer; /* Common Rx buffer for all received data */ sRxStructure.wAddr1 = OWN_ADDRESS; /* The own board address */ sRxStructure.wAddr2 = 0; /* Not needed */ /* Initialize local Transmission structures */ sTxStructure.wNumData = BufferSize; /* Maximum Number of data to be received */ sTxStructure.pbBuffer = (uint8_t*)tStateSignal; /* Common Rx buffer for all received data */ sTxStructure.wAddr1 = OWN_ADDRESS; /* The own board address */ sTxStructure.wAddr2 = 0; /* Not needed */ /* Configure the device structure */ CPAL_I2C_StructInit(&I2C_DevStructure); /* Set all fields to default values */ I2C_DevStructure.CPAL_Mode = CPAL_MODE_SLAVE; #ifdef CPAL_I2C_DMA_PROGMODEL I2C_DevStructure.wCPAL_Options = CPAL_OPT_NO_MEM_ADDR | CPAL_OPT_I2C_NACK_ADD; I2C_DevStructure.CPAL_ProgModel = CPAL_PROGMODEL_DMA; #elif defined (CPAL_I2C_IT_PROGMODEL) I2C_DevStructure.wCPAL_Options = CPAL_OPT_NO_MEM_ADDR | CPAL_OPT_I2C_NACK_ADD; I2C_DevStructure.CPAL_ProgModel = CPAL_PROGMODEL_INTERRUPT; #else #error "Please select one of the programming model (in main.h)" #endif I2C_DevStructure.pCPAL_I2C_Struct->I2C_ClockSpeed = I2C_SPEED; I2C_DevStructure.pCPAL_I2C_Struct->I2C_OwnAddress1 = OWN_ADDRESS; I2C_DevStructure.pCPAL_TransferRx = &sRxStructure; I2C_DevStructure.pCPAL_TransferTx = &sTxStructure; /* Initialize CPAL device with the selected parameters */ CPAL_I2C_Init(&I2C_DevStructure); /* Infinite loop */ while (1) { /* Write operations ------------------------------------------------------*/ /* Check if any action has been triggered by push buttons */ if ((ActionState != ACTION_PENDING) && (ActionState != ACTION_NONE)) { /* Check if the current CPAL device state allows write operation */ if (((DeviceMode == SLAVE) && (LastMode == SLAVE))||\ (((I2C_DevStructure.CPAL_State == CPAL_STATE_READY) ||\ (I2C_DevStructure.CPAL_State == CPAL_STATE_DISABLED)) && (DeviceMode == MASTER))) { if (LastMode == SLAVE) { /* Set the LCD Back Color */ LCD_SetBackColor(Red); /* Set the LCD Text Color */ LCD_SetTextColor(White); LCD_DisplayStringLine(Line3, (uint8_t*)" MASTER MODE ACTIVE "); /* Set the LCD Back Color */ LCD_SetBackColor(White); /* Set the LCD Text Color */ LCD_SetTextColor(Blue); /* Disable CPAL_OPT_I2C_NACK_ADD option when switch to Master mode */ I2C_DevStructure.wCPAL_Options &= (~CPAL_OPT_I2C_NACK_ADD); } LastMode = MASTER; /* Initialize local Reception structures */ sRxStructure.wNumData = BufferSize; /* Initialize local Transmission structures */ sTxStructure.wNumData = BufferSize; switch (ActionState) { case BUTTON_KEY: TransmitMode = STATE_ON; sTxStructure.pbBuffer = (uint8_t*)tSignal; Divider = 2; break; case BUTTON_TAMPER: TransmitMode = STATE_OFF; sRxStructure.pbBuffer = tRxBuffer; Divider = 4; break; case ACTION_PERIODIC: if(TransmitMode == STATE_ON) { sTxStructure.pbBuffer = (uint8_t*)tStateSignal; } break; default: break; } /* Configure the device mode to master */ I2C_DevStructure.CPAL_Mode = CPAL_MODE_MASTER; /* Force the CPAL state to ready (in case a read operation has been initiated) */ I2C_DevStructure.CPAL_State = CPAL_STATE_READY; /* Prevent other actions to be performed while the current is not finished */ ActionState = ACTION_PENDING; DeviceMode = MASTER; /* Configure a Timer to generate periodic interrupt: used to send state signal */ TIM7_Config(PeriodicValue/Divider); if(TransmitMode == STATE_ON) { /* Start writing data in master mode */ if (CPAL_I2C_Write(&I2C_DevStructure) == CPAL_PASS) { } } else { /* Start reading data in master mode */ if (CPAL_I2C_Read(&I2C_DevStructure) == CPAL_PASS) { } } } } /* Read Operations -------------------------------------------------------*/ if (((I2C_DevStructure.CPAL_State == CPAL_STATE_READY) || \ (I2C_DevStructure.CPAL_State == CPAL_STATE_DISABLED)) && \ (DeviceMode == SLAVE)) { /* Reconfigure device for slave receiver mode */ I2C_DevStructure.CPAL_Mode = CPAL_MODE_SLAVE; I2C_DevStructure.CPAL_State = CPAL_STATE_READY; if (LastMode == SLAVE) { /* Set the LCD Back Color */ LCD_SetBackColor(Red); /* Set the LCD Text Color */ LCD_SetTextColor(White); LCD_DisplayStringLine(Line3, (uint8_t*)" SLAVE MODE ACTIVE "); /* Set the LCD Back Color */ LCD_SetBackColor(White); /* Set the LCD Text Color */ LCD_SetTextColor(Blue); } /* Start waiting for data to be received in slave mode */ if (CPAL_I2C_Listen(&I2C_DevStructure) == CPAL_PASS) { LCD_DisplayStringLine(Line9, MEASSAGE_EMPTY); } } } }