野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12632|回复: 4

【新人求助急】液晶初始化失败问题

[复制链接]
发表于 2016-2-20 13:39:39 | 显示全部楼层 |阅读模式
先上主函数的一部分
5{I%$OP1SJ(6DL1B2MAMJ]W.png
程序一直停在LCD_Init()这个函数开始处,液晶屏一直显示的是白色如图

file:///C:/Users/yhd/AppData/Roaming/Tencent/Users/1079420031/QQ/WinTemp/RichOle/5%7BI%25$OP1SJ(6DL1B2MAMJ]W.png 57BEJ88SK1BU]T{F4(%K5{6.png
但是偶尔重新启动单片机也可以正常显示,但是概率很小,但是把这两个函数注释掉的话就可以正常启动,并显示。如图
4)BKKF6[I5BA@QT3E0I~4[Y.png
void uart_init(u32 bound)
{
  //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
  
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟
  
//USART1_TX   GPIOA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
   
  //USART1_RX   GPIOA.10初始化
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

  //Usart1 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //子优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置

   USART_InitStructure.USART_BaudRate = bound;//串口波特率
   USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
   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; //收发模式

    USART_Init(USART1, &USART_InitStructure); //初始化串口1
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
    USART_Cmd(USART1, ENABLE);                    //使能串口1

}

void USART1_IRQHandler(void)                 //串口1中断服务程序
{
u8 Res;

#if SYSTEM_SUPPORT_OS   //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntEnter();   
#endif
if( USART_GetITStatus( USART1, USART_IT_RXNE ) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
  Res =USART_ReceiveData(USART1); //读取接收到的数据
  
  if(( USART_RX_STA & 0x8000 ) == 0 )//接收未完成
  {
   if( USART_RX_STA & 0x4000 )//接收到了0x0d
   {
    if( Res != 0x0a) USART_RX_STA = 0;//接收错误,重新开始
    else USART_RX_STA |= 0x8000; //接收完成了
   }
   else //还没收到0X0D
   {
    if( Res == 0x0d) USART_RX_STA |= 0x4000;
    else
    {
     USART_RX_BUF[USART_RX_STA&0X3FFF] = Res ;
     USART_RX_STA++;
     if( USART_RX_STA > (USART_REC_LEN-1)) USART_RX_STA = 0;//接收数据错误,重新开始接收   
    }   
   }
  }      
   }

vu16 USART3_RX_STA=0;   


void USART3_IRQHandler(void)
{
u8 res;   

if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据
{  
  res = USART_ReceiveData(USART3);   
  if(( USART3_RX_STA&(1<<15))==0 )//接收完的一批数据,还没有被处理,则不再接收其他数据
  {
   if( USART3_RX_STA < USART3_MAX_RECV_LEN ) //还可以接收数据
   {
    TIM_SetCounter(TIM7,0);//计数器清空              //计数器清空
    if( USART3_RX_STA==0 )     //使能定时器7的中断
    {
     TIM_Cmd( TIM7, ENABLE );//使能定时器7
    }
    USART3_RX_BUF[USART3_RX_STA++] = res; //记录接收到的值  
   }
   else
   {
    USART3_RX_STA|=1<<15;    //强制标记接收完成
   }
  }
}                  
}   


//初始化IO 串口3
//pclk1CLK1时钟频率(Mhz)
//bound:波特率   
void usart3_init(u32 bound)
{  

NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIOB时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //串口3时钟使能

  USART_DeInit(USART3);  //复位串口3
   //USART3_TX   PB10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10
   
    //USART3_RX   PB11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOB, &GPIO_InitStructure);  //初始化PB11

USART_InitStructure.USART_BaudRate = bound;//波特率一般设置为9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
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; //收发模式
  
USART_Init(USART3, &USART_InitStructure); //初始化串口 3
  

USART_Cmd(USART3, ENABLE);                    //使能串口

//使能接收中断
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断   

//设置中断优先级
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器


TIM7_Int_Init(99,7199);  //10ms中断
USART3_RX_STA=0;  //清零
TIM_Cmd(TIM7,DISABLE);   //关闭定时器7

}

回复

使用道具 举报

发表于 2016-2-20 14:40:25 | 显示全部楼层
把串口初始化注释掉看看
回复 支持 反对

使用道具 举报

发表于 2016-2-21 11:00:58 | 显示全部楼层
如果是野火的液晶源码的话,液晶初始化要放在串口初始化前面,要不然会白屏
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-13 22:22:47 | 显示全部楼层
Jwen 发表于 2016-2-21 11:00
如果是野火的液晶源码的话,液晶初始化要放在串口初始化前面,要不然会白屏

放在前面后,就能够显示了,非常谢谢你,但是这是什么原因了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-13 22:23:46 | 显示全部楼层
fire 发表于 2016-2-20 14:40
把串口初始化注释掉看看

谢谢火哥,但是为啥把液晶初始化函数放在串口初始化函数之前就能显示,之后就白屏了?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-6-17 17:01 , Processed in 0.030364 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表