打印
[STM32L1]

STM32L152驱动段码LCD一直卡死在初始化部分,求教!!

[复制链接]
1604|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
确认过板子硬件是没有问题的,用IO口直接驱动能点亮,但是直接用芯片内部驱动就会出现卡死的问题。麻烦各位帮忙分析分析。感谢各位!下面是我的初始化代码:
void LCD_GLASS_Init(void)
{
  LCD_InitTypeDef LCD_InitStructure;

  LCD_GPIOConfig(); /*!< Configure the LCD Glass GPIO pins */

  /*!< Configure the LCD interface -------------------------------------------*/
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_LCD, ENABLE); /*!< Enable LCD APB1 Clock */

  LCD_InitStructure.LCD_Prescaler = LCD_Prescaler_8;
  LCD_InitStructure.LCD_Divider = LCD_Divider_16;
  LCD_InitStructure.LCD_Duty = LCD_Duty_1_8;
  LCD_InitStructure.LCD_Bias = LCD_Bias_1_4;
  LCD_InitStructure.LCD_VoltageSource = LCD_VoltageSource_Internal;
  LCD_Init(&LCD_InitStructure);

  //LCD_HighDriveCmd(ENABLE);
  /*!< Configure the Pulse On Duration*/
  LCD_PulseOnDurationConfig(LCD_PulseOnDuration_2);

  /*!< Configure the LCD Contrast (3.51V) */
  LCD_ContrastConfig(LCD_Contrast_Level_5);

  /*!< Wait Until the LCD FCR register is synchronized */
  LCD_WaitForSynchro();

  /*!< Enable LCD peripheral */
  LCD_Cmd(ENABLE);

  /*!< Wait Until the LCD is enabled */
  while(LCD_GetFlagStatus(LCD_FLAG_ENS) == RESET)
  {
  }
  /*!< Wait Until the LCD Booster is ready */  
  while(LCD_GetFlagStatus(LCD_FLAG_RDY) == RESET)
  {
  }   
}

一直卡在最后一个while,请问该怎么解决这个问题啊?

R@H%S~U{_{5W[O(CA)[J)5A.png (27.49 KB )

R@H%S~U{_{5W[O(CA)[J)5A.png

~}C@RBY1ZY{V$H)93~1`%`G.png (22.63 KB )

~}C@RBY1ZY{V$H)93~1`%`G.png

使用特权

评论回复
沙发
yklstudent| | 2020-2-26 22:41 | 只看该作者
问题没解决,又来求助啦

使用特权

评论回复
板凳
zhazhahua|  楼主 | 2020-2-26 22:45 | 只看该作者
yklstudent 发表于 2020-2-26 22:41
问题没解决,又来求助啦

对的呀,只要能驱动起来就不是问题了哈哈哈

使用特权

评论回复
地板
zhazhahua|  楼主 | 2020-2-27 09:56 | 只看该作者
有没有哪位兄弟遇到类似的情况呀?

使用特权

评论回复
5
zhazhahua|  楼主 | 2020-2-28 23:31 | 只看该作者
历时一个半星期我终于点亮了我的屏,真开心哈哈哈哈。等我完善之后会分享。

使用特权

评论回复
6
Andymei| | 2020-2-29 10:00 | 只看该作者
zhazhahua 发表于 2020-2-28 23:31
历时一个半星期我终于点亮了我的屏,真开心哈哈哈哈。等我完善之后会分享。 ...

请教楼主怎么解决的呀 我现在遇到了同样的问题

使用特权

评论回复
7
zhazhahua|  楼主 | 2020-2-29 11:46 | 只看该作者
Andymei 发表于 2020-2-29 10:00
请教楼主怎么解决的呀 我现在遇到了同样的问题

你有没有加上RTC时钟呀?我还在整理资料

使用特权

评论回复
8
Andymei| | 2020-2-29 12:03 | 只看该作者
zhazhahua 发表于 2020-2-29 11:46
你有没有加上RTC时钟呀?我还在整理资料

你好楼主  我应该是加上了  ,能否帮看下我这代码是哪里的问题 ,十分感谢

void RTC_Cfig(void)
{
    /* Power enable */
    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
        RCC_LSICmd(ENABLE);
        while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
        RCC_RTCCLKCmd(ENABLE);
       
}


void BSP_LCD_GLASS_Init(void)
{

        RTC_Cfig();
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_LCD, ENABLE);
        LCD_GPIOConfig();
       
        LCDHandle.LCD_Bias = LCD_Bias_1_3;
        LCDHandle.LCD_Divider = LCD_Divider_30;
        LCDHandle.LCD_Duty = LCD_Duty_1_4;
        LCDHandle.LCD_Prescaler = LCD_Prescaler_4;
        LCDHandle.LCD_VoltageSource = LCD_VoltageSource_Internal;
        LCD_Init(&LCDHandle);
       
       
//        LCD_HighDriveCmd(DISABLE);
//        LCD_MuxSegmentCmd(ENABLE);
        LCD_PulseOnDurationConfig(LCD_PulseOnDuration_7);
        LCD_DeadTimeConfig(LCD_DeadTime_2);
        LCD_BlinkConfig(LCD_BlinkMode_Off,LCD_BlinkFrequency_Div8);
        LCD_ContrastConfig(LCD_Contrast_Level_3);
       
        LCD_WaitForSynchro();
       
        LCD_Cmd(ENABLE);
       
    while(LCD_GetFlagStatus(LCD_FLAG_ENS) == RESET)
    {
    }
      
    while(LCD_GetFlagStatus(LCD_FLAG_RDY) == RESET)
    {
    }
       
}
void LCD_GPIOConfig(void)
{
                                GPIO_InitTypeDef GPIO_InitStructure;
                               
                                /*!&lt; Enable GPIOA, GPIOB, GPIOC,  AHB Clocks */
                                RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB,ENABLE);
       
       
                                /*!&lt; Connect PA.01 to LCD SEG0 */
                                GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_LCD);
                                /*!&lt; Connect PA.02 to LCD SEG1 */
                                GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_LCD);
                                /*!&lt; Connect PA.03 to LCD SEG2 */
                                GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_LCD);
                                /*!&lt; Connect PA.06 to LCD SEG3 */
                                GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_LCD);       
                                /*!&lt; Connect PA.07 to LCD SEG4 */
                                GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_LCD);
                                /*!&lt; Connect PB.00 to LCD SEG5 */
                                GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_LCD);               
                                /*!&lt; Connect PA.01 to LCD SEG6 */
                                GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_LCD);       
//        #ifndef SimulationEn                        
                                /*!&lt; Connect PB.03 to LCD SEG7 */
                //                GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_LCD);//¹²ÓÃJTDO
//        #endif
                               
                                /*!&lt; Connect PA.08 to LCD COM0 */
                                GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_LCD);
                                /*!&lt; Connect PA.09 to LCD COM1 */
                                GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_LCD);
                                /*!&lt; Connect PA.10 to LCD COM2 */
                                GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_LCD);
                                /*!&lt; Connect PB.09 to LCD COM3 */
                                GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_LCD);
                               

                               
                                GPIO_InitStructure.GPIO_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_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
                                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
                                GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
                                GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
                                GPIO_Init(GPIOA, &GPIO_InitStructure);

        //                        #ifndef SimulationEn
                                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_9;// | GPIO_Pin_3 ;ºÍ·ÂÕæ¿Ú¸´ÓÃ
        //                        #else  
                                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
                                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
                                GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
                                GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;       
                                GPIO_Init(GPIOB, &GPIO_InitStructure);                              
}

使用特权

评论回复
评论
Andymei 2020-2-29 13:21 回复TA
详细看了看器件手册,找到原因了!就是RCC CLOCK那少写了一句话!PWR->CR |= PWR_CR_DBP; 
9
zhazhahua|  楼主 | 2020-2-29 13:27 | 只看该作者
Andymei 发表于 2020-2-29 12:03
你好楼主  我应该是加上了  ,能否帮看下我这代码是哪里的问题 ,十分感谢

void RTC_Cfig(void)

LCDHandle.LCD_Duty = LCD_Duty_1_4;
        LCDHandle.LCD_Prescaler = LCD_Prescaler_4;
这两行的代码是根据屏给的资料写的吗

使用特权

评论回复
10
Andymei| | 2020-2-29 14:40 | 只看该作者
zhazhahua 发表于 2020-2-29 13:27
LCDHandle.LCD_Duty = LCD_Duty_1_4;
        LCDHandle.LCD_Prescaler = LCD_Prescaler_4;
这两行的代码 ...

你好楼主  我刚才发现RCC那少写了个使能更改那个位,现在能显示了 但是目前只有COM0和COM1正常,,
COM2和COM3没作用发现,目前正在找原因。   1/4那个是屏幕资料 。LCD_Prescaler_4那个是我根据时钟用的MSI然后算了一下,不知道用的对不对。

使用特权

评论回复
11
zhazhahua|  楼主 | 2020-2-29 14:50 | 只看该作者
Andymei 发表于 2020-2-29 14:40
你好楼主  我刚才发现RCC那少写了个使能更改那个位,现在能显示了 但是目前只有COM0和COM1正常,,
COM2 ...

LCDHandle.LCD_Bias = LCD_Bias_1_3;
我说错了,应该是bias和duty这两个是根据屏的资料来,能亮就是初始化基本没问题了,至于COM2和COM3没作用你要具体看看你的程序才行。

使用特权

评论回复
12
Andymei| | 2020-2-29 15:03 | 只看该作者
zhazhahua 发表于 2020-2-29 14:50
LCDHandle.LCD_Bias = LCD_Bias_1_3;
我说错了,应该是bias和duty这两个是根据屏的资料来,能亮就是初始 ...

对  那两个参数是屏幕资料上的   好的  十分感谢  我再查查

使用特权

评论回复
13
zhazhahua|  楼主 | 2020-2-29 16:17 | 只看该作者
Andymei 发表于 2020-2-29 15:03
对  那两个参数是屏幕资料上的   好的  十分感谢  我再查查

没事,我也在学习。哈哈哈

使用特权

评论回复
14
645919447| | 2020-3-13 17:43 | 只看该作者
zhazhahua 发表于 2020-2-29 11:46
你有没有加上RTC时钟呀?我还在整理资料

LCD_InitTypeDef LCD_InitStructure;
  
        RCC_LSICmd(ENABLE);
  while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
        RCC_RTCCLKCmd(ENABLE);
       
  LCD_GPIOConfig(); /*!< Configure the LCD Glass GPIO pins */

  /*!< Configure the LCD interface -------------------------------------------*/
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_LCD,ENABLE); /*!< Enable LCD APB1 Clock */
  
  LCD_InitStructure.LCD_Prescaler = LCD_Prescaler_16;
  LCD_InitStructure.LCD_Divider = LCD_Divider_16;
  LCD_InitStructure.LCD_Duty = LCD_Duty_1_4;
  LCD_InitStructure.LCD_Bias = LCD_Bias_1_3;
  LCD_InitStructure.LCD_VoltageSource = LCD_VoltageSource_Internal;
  LCD_Init(&LCD_InitStructure);

  /*!< Configure the Pulse On Duration */
  LCD_PulseOnDurationConfig(LCD_PulseOnDuration_2);
  
  /*!< Configure the LCD Contrast (3.51V) */
  LCD_ContrastConfig(LCD_Contrast_Level_5);

  /*!< Wait Until the LCD FCR register is synchronized */
  LCD_WaitForSynchro();
  
  /*!< Enable LCD peripheral */
  LCD_Cmd(ENABLE);
  
  /*!< Wait Until the LCD is enabled */
  while(LCD_GetFlagStatus(LCD_FLAG_ENS) == RESET){
  }
  /*!< Wait Until the LCD Booster is ready */  
  while(LCD_GetFlagStatus(LCD_FLAG_RDY) == RESET){
  }

请教一下,同样的现象  一直死在最后LCD_FLAG_RDY这里(前面已经加上了LSI时钟)

使用特权

评论回复
15
zhazhahua|  楼主 | 2020-3-13 19:47 | 只看该作者
645919447 发表于 2020-3-13 17:43
LCD_InitTypeDef LCD_InitStructure;
  
        RCC_LSICmd(ENABLE);

你看看前面的评论有没有帮助,仔细观察整个程序,很简单就是需要注意RTC时钟,还有bias,duty,其他的就是IO口之类的没什么了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

274

帖子

2

粉丝