/** * @brief Initializes the LCD according to the specified parameters. * @param LCD_CLKPrescalerDiv : LCD clock prescaler * This parameter can be one of the following values: * @arg LCD_Prescaler_1: CLKprescaler = ClKinput * @arg LCD_Prescaler_2: CLKprescaler = ClKinput/2 * @arg LCD_Prescaler_4: CLKprescaler = ClKinput/4 * @arg LCD_Prescaler_8: CLKprescaler = ClKinput/8 * @arg LCD_Prescaler_16: CLKprescaler = ClKinput/16 * @arg LCD_Prescaler_32: CLKprescaler = ClKinput/32 * @arg LCD_Prescaler_64: CLKprescaler = ClKinput/64 * @arg LCD_Prescaler_128: CLKprescaler = ClKinput/128 * @arg LCD_Prescaler_256: CLKprescaler = ClKinput/256 * @arg LCD_Prescaler_512: CLKprescaler = ClKinput/512 * @arg LCD_Prescaler_1024: CLKprescaler = ClKinput/1024 * @arg LCD_Prescaler_2048: CLKprescaler = ClKinput/2048 * @arg LCD_Prescaler_4096: CLKprescaler = ClKinput/4096 * @arg LCD_Prescaler_8192: CLKprescaler = ClKinput/8192 * @arg LCD_Prescaler_16384: CLKprescaler = ClKinput/16384 * @arg LCD_Prescaler_32768: CLKprescaler = ClKinput/32768 * @param LCD_Divider : LCD clock divider * This parameter can be one of the following values: * @arg LCD_Divider_16: LCD frequency = CLKprescaler/16 * @arg LCD_Divider_17: LCD frequency = CLKprescaler/17 * @arg LCD_Divider_18: LCD frequency = CLKprescaler/18 * @arg LCD_Divider_19: LCD frequency = CLKprescaler/19 * @arg LCD_Divider_20: LCD frequency = CLKprescaler/20 * @arg LCD_Divider_21: LCD frequency = CLKprescaler/21 * @arg LCD_Divider_22: LCD frequency = CLKprescaler/22 * @arg LCD_Divider_23: LCD frequency = CLKprescaler/23 * @arg LCD_Divider_24: LCD frequency = CLKprescaler/24 * @arg LCD_Divider_25: LCD frequency = CLKprescaler/25 * @arg LCD_Divider_26: LCD frequency = CLKprescaler/26 * @arg LCD_Divider_27: LCD frequency = CLKprescaler/27 * @arg LCD_Divider_28: LCD frequency = CLKprescaler/28 * @arg LCD_Divider_29: LCD frequency = CLKprescaler/29 * @arg LCD_Divider_30: LCD frequency = CLKprescaler/30 * @arg LCD_Divider_31: LCD frequency = CLKprescaler/31 * @param LCD_Duty : LCD duty * This parameter can be one of the following values: * @arg LCD_Duty_Static: Static duty * @arg LCD_Duty_1_2: 1/2 duty * @arg LCD_Duty_1_3: 1/3 duty * @arg LCD_Duty_1_4: 1/4 duty * @arg LCD_Duty_1_8: 1/8 duty * @param LCD_Bias : LCD bias * This parameter can be one of the following values: * @arg LCD_Bias_1_4: 1/4 bias * @arg LCD_Bias_1_3: 1/3 bias * @arg LCD_Bias_1_2: 1/2 bias * @param LCD_VoltageSource : LCD voltage source * This parameter can be one of the following values: * @arg LCD_VoltageSource_Internal: Internal voltage source * @arg LCD_VoltageSource_External: External voltage source * @retval None */ void LCD_Init(LCD_Prescaler_TypeDef LCD_Prescaler, LCD_Divider_TypeDef LCD_Divider, LCD_Duty_TypeDef LCD_Duty, LCD_Bias_TypeDef LCD_Bias, LCD_VoltageSource_TypeDef LCD_VoltageSource) { /* Check function parameters */ assert_param(IS_LCD_CLOCK_PRESCALER(LCD_Prescaler)); assert_param(IS_LCD_CLOCK_DIVIDER(LCD_Divider)); assert_param(IS_LCD_DUTY(LCD_Duty)); assert_param(IS_LCD_BIAS(LCD_Bias)); assert_param(IS_LCD_VOLTAGE_SOURCE(LCD_VoltageSource)); LCD->FRQ &= (uint8_t)(~LCD_FRQ_PS); /* Clear the prescaler bits */ LCD->FRQ |= LCD_Prescaler; LCD->FRQ &= (uint8_t)(~LCD_FRQ_DIV); /* Clear the divider bits */ LCD->FRQ |= LCD_Divider; /* Configure the Duty cycle */ LCD->CR1 &= (uint8_t)(~LCD_CR1_DUTY); /* Clear the duty bits */ LCD->CR4 &= (uint8_t)(~LCD_CR4_DUTY8); /* Clear the DUTY8 bit */ if (LCD_Duty == LCD_Duty_1_8) { LCD->CR4 |= (uint8_t)((uint8_t)((uint8_t)LCD_Duty & (uint8_t)0xF0) >> 4); }
/** * @brief Initializes the LCD according to the specified parameters. * @param LCD_CLKPrescalerDiv : This parameter can be any of the @ref LCD_Divider_TypeDef enumeration. * @param LCD_Divider : This parameter can be any of the @ref LCD_Divider_TypeDef enumeration. * @param LCD_Duty : This parameter can be any of the @ref LCD_Duty_TypeDef enumeration. * @param LCD_Bias : This parameter can be any of the @ref LCD_Bias_TypeDef enumeration. * @param LCD_VoltageSource : This parameter can be any of the @ref LCD_VoltageSource_TypeDef enumeration. * @retval None */ void LCD_Init(LCD_Prescaler_TypeDef LCD_Prescaler, LCD_Divider_TypeDef LCD_Divider, LCD_Duty_TypeDef LCD_Duty, LCD_Bias_TypeDef LCD_Bias, LCD_VoltageSource_TypeDef LCD_VoltageSource) { /* Check function parameters */ assert_param(IS_LCD_CLOCK_PRESCALER(LCD_Prescaler)); assert_param(IS_LCD_CLOCK_DIVIDER(LCD_Divider)); assert_param(IS_LCD_DUTY(LCD_Duty)); assert_param(IS_LCD_BIAS(LCD_Bias)); assert_param(IS_LCD_VOLTAGE_SOURCE(LCD_VoltageSource)); LCD->FRQ &= (uint8_t)(~LCD_FRQ_PS); /* Clear the prescaler bits */ LCD->FRQ |= (uint8_t)LCD_Prescaler; LCD->FRQ &= (uint8_t)(~LCD_FRQ_DIV); /* Clear the divider bits */ LCD->FRQ |= (uint8_t)LCD_Divider; LCD->CR1 &= (uint8_t)(~LCD_CR1_DUTY); /* Clear the duty bits */ LCD->CR1 |= (uint8_t)LCD_Duty; LCD->CR1 &= (uint8_t)(~LCD_CR1_B2); /* Clear the bias bits */ LCD->CR1 |= (uint8_t)LCD_Bias; LCD->CR2 &= (uint8_t)(~LCD_CR2_VSEL); /* Clear the voltage source bit */ LCD->CR2 |= (uint8_t)LCD_VoltageSource; }
/** * @brief Initializes the LCD peripheral according to the specified parameters * in the LCD_InitStruct. * @note This function can be used only when the LCD is disabled. * @param LCD_InitStruct: pointer to a LCD_InitTypeDef structure that contains * the configuration information for the specified LCD peripheral. * @retval None */ void LCD_Init(LCD_InitTypeDef* LCD_InitStruct) { /* Check function parameters */ assert_param(IS_LCD_PRESCALER(LCD_InitStruct->LCD_Prescaler)); assert_param(IS_LCD_DIVIDER(LCD_InitStruct->LCD_Divider)); assert_param(IS_LCD_DUTY(LCD_InitStruct->LCD_Duty)); assert_param(IS_LCD_BIAS(LCD_InitStruct->LCD_Bias)); assert_param(IS_LCD_VOLTAGE_SOURCE(LCD_InitStruct->LCD_VoltageSource)); LCD->FCR &= (uint32_t)FCR_MASK; LCD->FCR |= (uint32_t)(LCD_InitStruct->LCD_Prescaler | LCD_InitStruct->LCD_Divider); LCD_WaitForSynchro(); LCD->CR &= (uint32_t)CR_MASK; LCD->CR |= (uint32_t)(LCD_InitStruct->LCD_Duty | LCD_InitStruct->LCD_Bias | \ LCD_InitStruct->LCD_VoltageSource); }
/** * @brief Initializes the LCD peripheral according to the specified parameters * in the LCD_InitStruct. * @note This function can be used only when the LCD is disabled. * The LCD HighDrive can be enabled/disabled using related macros up to user. * @param hlcd: LCD handle * @retval None */ HAL_StatusTypeDef HAL_LCD_Init(LCD_HandleTypeDef *hlcd) { uint32_t tickstart = 0x00; uint8_t counter = 0; /* Check the LCD handle allocation */ if(hlcd == NULL) { return HAL_ERROR; } /* Check function parameters */ assert_param(IS_LCD_ALL_INSTANCE(hlcd->Instance)); assert_param(IS_LCD_PRESCALER(hlcd->Init.Prescaler)); assert_param(IS_LCD_DIVIDER(hlcd->Init.Divider)); assert_param(IS_LCD_DUTY(hlcd->Init.Duty)); assert_param(IS_LCD_BIAS(hlcd->Init.Bias)); assert_param(IS_LCD_VOLTAGE_SOURCE(hlcd->Init.VoltageSource)); assert_param(IS_LCD_PULSE_ON_DURATION(hlcd->Init.PulseOnDuration)); assert_param(IS_LCD_HIGHDRIVE(hlcd->Init.HighDrive)); assert_param(IS_LCD_DEAD_TIME(hlcd->Init.DeadTime)); assert_param(IS_LCD_CONTRAST(hlcd->Init.Contrast)); assert_param(IS_LCD_BLINK_FREQUENCY(hlcd->Init.BlinkFrequency)); assert_param(IS_LCD_BLINK_MODE(hlcd->Init.BlinkMode)); assert_param(IS_LCD_MUXSEGMENT(hlcd->Init.MuxSegment)); if(hlcd->State == HAL_LCD_STATE_RESET) { /* Allocate lock resource and initialize it */ hlcd->Lock = HAL_UNLOCKED; /* Initialize the low level hardware (MSP) */ HAL_LCD_MspInit(hlcd); } hlcd->State = HAL_LCD_STATE_BUSY; /* Disable the peripheral */ __HAL_LCD_DISABLE(hlcd); /* Clear the LCD_RAM registers and enable the display request by setting the UDR bit in the LCD_SR register */ for(counter = LCD_RAM_REGISTER0; counter <= LCD_RAM_REGISTER15; counter++) { hlcd->Instance->RAM[counter] = 0; } /* Enable the display request */ SET_BIT(hlcd->Instance->SR, LCD_SR_UDR); /* Configure the LCD Prescaler, Divider, Blink mode and Blink Frequency: Set PS[3:0] bits according to hlcd->Init.Prescaler value Set DIV[3:0] bits according to hlcd->Init.Divider value Set BLINK[1:0] bits according to hlcd->Init.BlinkMode value Set BLINKF[2:0] bits according to hlcd->Init.BlinkFrequency value Set DEAD[2:0] bits according to hlcd->Init.DeadTime value Set PON[2:0] bits according to hlcd->Init.PulseOnDuration value Set CC[2:0] bits according to hlcd->Init.Contrast value Set HD[0] bit according to hlcd->Init.HighDrive value */ MODIFY_REG(hlcd->Instance->FCR, \ (LCD_FCR_PS | LCD_FCR_DIV | LCD_FCR_BLINK| LCD_FCR_BLINKF | \ LCD_FCR_DEAD | LCD_FCR_PON | LCD_FCR_CC), \ (hlcd->Init.Prescaler | hlcd->Init.Divider | hlcd->Init.BlinkMode | hlcd->Init.BlinkFrequency | \ hlcd->Init.DeadTime | hlcd->Init.PulseOnDuration | hlcd->Init.Contrast | hlcd->Init.HighDrive)); /* Wait until LCD Frame Control Register Synchronization flag (FCRSF) is set in the LCD_SR register This bit is set by hardware each time the LCD_FCR register is updated in the LCDCLK domain. It is cleared by hardware when writing to the LCD_FCR register.*/ LCD_WaitForSynchro(hlcd); /* Configure the LCD Duty, Bias, Voltage Source, Dead Time: Set DUTY[2:0] bits according to hlcd->Init.Duty value Set BIAS[1:0] bits according to hlcd->Init.Bias value Set VSEL bit according to hlcd->Init.VoltageSource value Set MUX_SEG bit according to hlcd->Init.MuxSegment value */ MODIFY_REG(hlcd->Instance->CR, \ (LCD_CR_DUTY | LCD_CR_BIAS | LCD_CR_VSEL | LCD_CR_MUX_SEG), \ (hlcd->Init.Duty | hlcd->Init.Bias | hlcd->Init.VoltageSource | hlcd->Init.MuxSegment)); /* Enable the peripheral */ __HAL_LCD_ENABLE(hlcd); /* Get timeout */ tickstart = HAL_GetTick(); /* Wait Until the LCD is enabled */ while(__HAL_LCD_GET_FLAG(hlcd, LCD_FLAG_ENS) == RESET) { if((HAL_GetTick() - tickstart ) > LCD_TIMEOUT_VALUE) { hlcd->ErrorCode = HAL_LCD_ERROR_ENS; return HAL_TIMEOUT; } } /* Get timeout */ tickstart = HAL_GetTick(); /*!< Wait Until the LCD Booster is ready */ while(__HAL_LCD_GET_FLAG(hlcd, LCD_FLAG_RDY) == RESET) { if((HAL_GetTick() - tickstart ) > LCD_TIMEOUT_VALUE) { hlcd->ErrorCode = HAL_LCD_ERROR_RDY; return HAL_TIMEOUT; } } /* Initialize the LCD state */ hlcd->ErrorCode = HAL_LCD_ERROR_NONE; hlcd->State= HAL_LCD_STATE_READY; return HAL_OK; }