Esempio n. 1
0
/**
  * @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);
  }
Esempio n. 2
0
/**
  * @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;
}
Esempio n. 3
0
/**
  * @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);

}
Esempio n. 4
0
/**
  * @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;
}