STM32L0 Segmetn LCD Driver Init Sorunu

Başlatan Mucit23, 20 Temmuz 2020, 23:23:21

Mucit23

Selamlar,

STM32L053C8'de Segment LCD sürecek bir sistem tasarımı yapıyorum. Bu mcu üzerinde doğrudan Segment lcd sürecek donanım var. Ben bu donanımı init etmekte sorun yaşıyorum.

İnit işlemi sürekli Error ile sonuçlanıyor. İçeride bir yerde timeout yaşanıyor anlayamadım. İnit ayarlarım bu şekilde.

void LCD_MspInit(LCD_HandleTypeDef *hlcd)
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
  /*##-1- Enable PWR  peripheral Clock #######################################*/
  __HAL_RCC_PWR_CLK_ENABLE();
  
	__HAL_RCC_GPIOA_CLK_ENABLE();
	__HAL_RCC_GPIOB_CLK_ENABLE();	
	
    /**LCD GPIO Configuration    
    PA1     ------> LCD_SEG0
    PA2     ------> LCD_SEG1
    PA3     ------> LCD_SEG2
    PA6     ------> LCD_SEG3
    PA7     ------> LCD_SEG4
    PB0     ------> LCD_SEG5
    PB1     ------> LCD_SEG6
    PB3     ------> LCD_SEG7
    PB4     ------> LCD_SEG8
    PB5     ------> LCD_SEG9	
    PA8     ------> LCD_COM0
    PA9     ------> LCD_COM1
    PA10    ------> LCD_COM2
    PB9     ------> LCD_COM3 */
		
		GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_6 
                          |GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF1_LCD;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3 
                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF1_LCD;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
		
  /* Wait for the external capacitor Cext which is connected to the VLCD pin is charged
  (approximately 2ms for Cext=1uF) */
  HAL_Delay(2);
	
	__HAL_RCC_LCD_CLK_ENABLE();
}

/**
  * @brief LCD Initialization Function
  * @param None
  * @retval None
  */
void MX_LCD_Init(void)
{
  LCDHandle.Instance = LCD;
  LCDHandle.Init.Prescaler = LCD_PRESCALER_1;
  LCDHandle.Init.Divider = LCD_DIVIDER_31;
  LCDHandle.Init.Duty = LCD_DUTY_1_4;
  LCDHandle.Init.Bias = LCD_BIAS_1_3;
  LCDHandle.Init.VoltageSource = LCD_VOLTAGESOURCE_INTERNAL;
  LCDHandle.Init.Contrast = LCD_CONTRASTLEVEL_5;
  LCDHandle.Init.DeadTime = LCD_DEADTIME_0;
  LCDHandle.Init.PulseOnDuration = LCD_PULSEONDURATION_4;
  LCDHandle.Init.HighDrive = LCD_HIGHDRIVE_0;
  LCDHandle.Init.BlinkMode = LCD_BLINKMODE_OFF;
  LCDHandle.Init.BlinkFrequency = LCD_BLINKFREQUENCY_DIV32;
  LCDHandle.Init.MuxSegment = LCD_MUXSEGMENT_DISABLE;
	
	LCD_MspInit(&LCDHandle);  //GPIO Ayarlari Yapiliyor.
	
  if ( HAL_LCD_Init(&LCDHandle)!= HAL_OK)
  {
    Error_Handler();
  }
}

HAL_LCD_Init fonksiyonu sürekli error ile sonuçlanıyor dolayısıyla Fault Handler'a düşüyor program. Biraz araştırınca aşağıdaki fonksiyon fail olarak sonuçlanıyor

HAL_StatusTypeDef LCD_WaitForSynchro(LCD_HandleTypeDef *hlcd)
{
  uint32_t tickstart = 0x00U;
 
  /* Get timeout */
  tickstart = HAL_GetTick();

  /* Loop until FCRSF flag is set */
  while(__HAL_LCD_GET_FLAG(hlcd, LCD_FLAG_FCRSF) == RESET)
  {
    if((HAL_GetTick() - tickstart) > LCD_TIMEOUT_VALUE)
    {       
      hlcd->ErrorCode = HAL_LCD_ERROR_FCRSF;
      return HAL_TIMEOUT;
    }
  }

  return HAL_OK;
}

Donanımda VLCD pinine 3.3V uyguluyorum. Girişin hemen dibinde 100nf kapasite mevcut. Donanımsal olarak dikkat edilecek başka birşey yok diye biliyorum.

Bunların dışında dikkat edilmesi gereken birşey varmı?

RaMu

Şurada bir cevap var:
https://community.st.com/s/question/0D50X00009XkWFA/fcrsf-not-being-set-lcdwaitforsynchro

Alıntı YapRCC->CSR |= RCC_CSR_RTCSEL_LSE;
Lcd şu harici 32768 olan RTC clock u kullanıyormuş
oraya bir kristal bağlayıp, harici RTC clock u seçerek çözmüş
yanlış anlamadıysam.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Mucit23

Sorunu çözdüm sanırım arkadaşlar. @RaMu Aynen bende oradaki yazıyı görünce dikkatimi çekti. CubeMX'de baktım LCD RTC clock kaynağı üzerinden besleniyormuş.  Buraya not düşeyim Segment LCD driver donanımı ile uğraşacaklar bu konuya dikkat etsin.

LCD Driver donanımı RTC ile aynı kaynaktan besleniyor. RTC için ya harici osilatör bağlı olması lazım(32768HZ) veya LSI osilatör aktif olması gerekiyor. Ben PCB'lerimi ürettiğim için Harici osilatör bağlama imkanım yoktu bu yüzden LSI osilatörü aktfi edip MCO ile çalıştığına emin oldum. Daha sonra RTC'nin RCC ayarlarında Clock kaynağını LSI olarak ayarladım. Daha sonra LCD init işlemi başarılı bir şekilde gerçekleşti. Şuanda LCD donanımım da sorun yok gibi. LCD ekranımda istediğim segmentleri aktif etmeyi başardım.