OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8790|回复: 3

请教原子哥,螃蟹版主和各位高手,关于FSMC驱动alien 2.8寸液晶的问题

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2012-8-26
在线时间
0 小时
发表于 2012-8-26 14:40:39 | 显示全部楼层 |阅读模式
我用的是F103ZET,用bank1的NE1,然后RS接的是A0

调了好几天了,在二位的代码基础上写的,觉得lcd驱动的代码应该没有问题啊,但是不知为何读出来的devicecode 是0xb
量过lcd的所有地址和数据管脚,用通用推挽io的方式测过都是通的

求指点,高手们帮我看看吧
LCD_base_addr 改成0x60000000
我一开始是把base地址改过后把所有的fsmc管脚都设成复用推挽输出,用寄存器方式对bctr[0], bctr[1]和bwtr[0]操作
然后担心是因为设成输出了所以读取device code不对,试过只设置fsmc的控制管脚和地址管脚,data管脚默认,还是不行
然后用库里的函数写了一个,也还是没进展,我觉得fsmc的设置应该没有问题啊?高手帮我看看问题到底在哪儿呢?


?//初始化lcd
//该初始化函数可以初始化各种ILI93XX液晶,但是其他函数是基于ILI9320的!!!
//在其他型号的驱动芯片上没有测试! 
void LCD_Init(void)
{                                            
FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
  FSMC_NORSRAMTimingInitTypeDef  p;
 
 
    RCC->AHBENR|=1<<8;       //使能FSMC时钟     
    RCC->APB2ENR |=1<<2;      //使能PORTA时钟
     RCC->APB2ENR|=1<<3;      //使能PORTB时钟
    RCC->APB2ENR|=1<<5;      //使能PORTD时钟
    RCC->APB2ENR|=1<<6;      //使能PORTE时钟
    RCC->APB2ENR|=1<<7;      //使能PORTF时钟
     RCC->APB2ENR|=1<<8;      //使能PORTG时钟
     //RCC->APB2ENR |= 1<<7;
    RCC->APB2ENR|=1<<0;      //使能AFIO时钟     
 
 
///////////////////
    //GPIOB->CRL&=0XFFFFFFF0;//PB0 推挽输出 
    //GPIOB->CRL|=0X00000003;       
    GPIOA->CRH&=0XFFFFFF0F; 
    GPIOA->CRH|=0X00000030;//PA9 推挽输出  背光      
    GPIOA->ODR|=1<<9;      //PA9 输出高
LED = 0;
LED = 1;
    //PORTD复用推挽输出      
    //GPIOD->CRH&=0X00000000;
    //GPIOD->CRH|=0XBBbbbBBB; 
    //PD7:CS  PD5:WR~  PD4: RD~
     GPIOD->CRL&=0X0F00FFFF;
     GPIOD->CRL|=0XB0BB0000;        
    //PORTE复用推挽输出      
//    GPIOE->CRH&=0X00000000;
//    GPIOE->CRH|=0XBBBBBBBB; 
//    GPIOE->CRL&=0X00000000;
//    GPIOE->CRL|=0XBBBBBBBB; 
        //PORTE复用推挽输出      
    GPIOE->CRH&=0X00000000;
    GPIOE->CRH|=0XBBBBBBBB; 
    GPIOE->CRL&=0X0FFFFFFF;
    GPIOE->CRL|=0XB0000000;    
//    GPIOE->CRL&=0X0FFFFFFF;
//    GPIOE->CRL|=0XB0000000;                                                              
//    //PORTG12复用推挽输出 A0                                                          /
//    GPIOG->CRH&=0XFFF0FFFF;
//    GPIOG->CRH|=0X000B0000; 
//    GPIOG->CRL&=0XFFFFFFF0;//PG0->RS
//    GPIOG->CRL|=0X0000000B; 
        //PORTF0复用推挽输出 A0                                                          
//    GPIOF->CRH&=0XFFFfFFF0;
//    GPIOF->CRH|=0X0000000B; 
//    GPIOF->CRL&=0XFFFFFFF0;//PF0->RS
//    GPIOF->CRL|=0X0000000B;      
 
//        GPIOF->CRH&=0X00000000;
//    GPIOF->CRH|=0XbbbbbbbB; 
    GPIOF->CRL&=0XFFFFFFF0;//PF0->RS
    GPIOF->CRL|=0X0000000B;            
 
/*    //寄存器清零
    //bank1有NE1~4,每一个有一个BCR+TCR,所以总共八个寄存器。
    //这里我们使用NE4 ,也就对应BTCR[6],[7]。                    
    FSMC_Bank1->BTCR[0]=0X00000000;
    FSMC_Bank1->BTCR[1]=0X00000000;
    FSMC_Bank1E->BWTR[0]=0X00000000;
     
    //操作BCR寄存器    使用异步模式
    FSMC_Bank1->BTCR[0]|=1<<12;//存储器写使能
    FSMC_Bank1->BTCR[0]|=1<<4; //存储器数据宽度为16bit         
    //操作BTR寄存器                                    
    //3个HCLK(HCLK=72M)因为液晶驱动IC的写信号脉宽,最少也得50ns。72M/3=24M=42ns,已经超频了。      
    FSMC_Bank1->BTCR[1]|=1<<9; //数据保存时间为3个HCLK          
    //闪存写时序寄存器           
    FSMC_Bank1E->BWTR[0]=0x0FFFFFFF;//默认值
    //使能BANK4(PC卡设备)
    FSMC_Bank1->BTCR[0]|=1<<0;        
////////////////////////////////////////////////////////
    //RCC->AHBENR |= 1<<8; //开启FSMC时钟
    //RCC->APB2ENR |= 1<<0; //开启辅助时钟AFIO
    //FSMC->BCR1 = 0X00001050;//sram 16BIT 模式B    位4,5->01:16位(default)     位6->1:允许对NOR闪存存储器的访问操作。  位12->1:允许FSMC对存储器的写操作;这是复位后的默认状态。
    //FSMC->BTR1 = 0X00000501;    //位3:0->地址建立时间    0001->2个HCLK时钟周期     ; 位7:4->地址保持时间  0101->6个HCLK时钟周期   
    //FSMC->BCR1 |= 0X00000001;     //位0->存储器块使能位      1:启用对应的存储器块。
    //FSMC ->BWTR1=0X0FFFFFFF;     //这个寄存器包含了每个存储器块的控制信息,可以用于SRAM、ROM和NOR闪存存储器。如果FSMC_BCRx寄存器中设置了EXTMOD位,则这个寄存器对应写操作。
*/
/*-- FSMC Configuration ------------------------------------------------------*/
/*----------------------- SRAM Bank 1 ----------------------------------------*/
  /* FSMC_Bank1_NORSRAM4 configuration */
/*
  p.FSMC_AddressSetupTime = 1;
  p.FSMC_AddressHoldTime = 0;
  p.FSMC_DataSetupTime = 2;
  p.FSMC_BusTurnAroundDuration = 0;
  p.FSMC_CLKDivision = 0;
  p.FSMC_DataLatency = 0;
  p.FSMC_AccessMode = FSMC_AccessMode_A;
 
  /* Color LCD configuration ------------------------------------
     LCD configured as follow:
        - Data/Address MUX = Disable
        - Memory Type = SRAM
        - Data Width = 16bit
        - Write Operation = Enable
        - Extended Mode = Enable
        - Asynchronous Wait = Disable 
  FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
  FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
  FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
  FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
  FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
  //FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
  FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
  FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
  FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
  FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
  FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
  FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
 
  FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  
 
  /* BANK 1 (of NOR/SRAM Bank 1~4) is enabled 
  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);*/
////////////////////////////////////////////////////////
    delay_ms(50); // delay 50 ms 
    //while(1)
    //{
    LCD_WriteReg(0x0000,0x0001);
    //}
    delay_ms(50); // delay 50 ms 
     //因为液晶驱动IC的读数据的时候,速度不能太快,尤其对1289这个IC。
    FSMC_Bank1->BTCR[1]|=0XF<<8; //数据保存时间为16个HCLK          
    DeviceCode = LCD_ReadReg(0x0000);   
    FSMC_Bank1->BTCR[1]&=~(0XF<<8); //数据保存时间为0
    //因为液晶驱动IC的写信号脉宽,最少也得50ns。72M/3=24M=42ns,已经超频了。      
    FSMC_Bank1->BTCR[1]|=1<<9;      //数据保存时间为3个HCLK        
    printf(" LCD ID:%x\n",DeviceCode); //打印LCD ID  
    if(DeviceCode==0x9325||DeviceCode==0x9328)//ILI9325   OK |/|/|
    {
          LCD_WriteReg(0x00e7,0x0010);      
        LCD_WriteReg(0x0000,0x0001);//开启内部时钟
        LCD_WriteReg(0x0001,0x0100);     
        LCD_WriteReg(0x0002,0x0700);//电源开启                    
        //LCD_WriteReg(0x0003,(1<<3)|(1<<4) );     //65K  RGB
        //DRIVE TABLE(寄存器 03H)
        //BIT3=AM BIT4:5=ID0:1
        //AM ID0 ID1   FUNCATION
        // 0  0   0       R->L D->U
        // 1  0   0       D->U    R->L
        // 0  1   0       L->R D->U
        // 1  1   0    D->U    L->R
        // 0  0   1       R->L U->D
        // 1  0   1    U->D    R->L
        // 0  1   1    L->R U->D 正常就用这个.
        // 1  1   1       U->D    L->R
        LCD_WriteReg(0x0003,(1<<12)|(3<<4)|(1<<3) );//65K    
        LCD_WriteReg(0x0004,0x0000);                                   
        LCD_WriteReg(0x0008,0x0207);               
        LCD_WriteReg(0x0009,0x0000);         
        LCD_WriteReg(0x000a,0x0000);//display setting         
        LCD_WriteReg(0x000c,0x0001);//display setting          
        LCD_WriteReg(0x000d,0x0000);//0f3c          
        LCD_WriteReg(0x000f,0x0000);
        //电源配置
        LCD_WriteReg(0x0010,0x0000);   
        LCD_WriteReg(0x0011,0x0007);
        LCD_WriteReg(0x0012,0x0000);                                                                 
        LCD_WriteReg(0x0013,0x0000);                 
        delay_ms(50); 
        LCD_WriteReg(0x0010,0x1590);   
        LCD_WriteReg(0x0011,0x0227);
        delay_ms(50); 
        LCD_WriteReg(0x0012,0x009c);                  
        delay_ms(50); 
        LCD_WriteReg(0x0013,0x1900);   
        LCD_WriteReg(0x0029,0x0023);
        LCD_WriteReg(0x002b,0x000e);
        delay_ms(50); 
        LCD_WriteReg(0x0020,0x0000);                                                            
        LCD_WriteReg(0x0021,0x013f);           
        delay_ms(50); 
        //伽马校正
        LCD_WriteReg(0x0030,0x0007); 
        LCD_WriteReg(0x0031,0x0707);   
        LCD_WriteReg(0x0032,0x0006);
        LCD_WriteReg(0x0035,0x0704);
        LCD_WriteReg(0x0036,0x1f04); 
        LCD_WriteReg(0x0037,0x0004);
        LCD_WriteReg(0x0038,0x0000);        
        LCD_WriteReg(0x0039,0x0706);     
        LCD_WriteReg(0x003c,0x0701);
        LCD_WriteReg(0x003d,0x000f);
        delay_ms(50); 
        LCD_WriteReg(0x0050,0x0000); //水平GRAM起始位置 
        LCD_WriteReg(0x0051,0x00ef); //水平GRAM终止位置                    
        LCD_WriteReg(0x0052,0x0000); //垂直GRAM起始位置                    
        LCD_WriteReg(0x0053,0x013f); //垂直GRAM终止位置  
        
        LCD_WriteReg(0x0060,0xa700);        
        LCD_WriteReg(0x0061,0x0001); 
        LCD_WriteReg(0x006a,0x0000);
        LCD_WriteReg(0x0080,0x0000);
        LCD_WriteReg(0x0081,0x0000);
        LCD_WriteReg(0x0082,0x0000);
        LCD_WriteReg(0x0083,0x0000);
        LCD_WriteReg(0x0084,0x0000);
        LCD_WriteReg(0x0085,0x0000);
      
        LCD_WriteReg(0x0090,0x0010);     
        LCD_WriteReg(0x0092,0x0000);  
        LCD_WriteReg(0x0093,0x0003);
        LCD_WriteReg(0x0095,0x0110);
        LCD_WriteReg(0x0097,0x0000);        
        LCD_WriteReg(0x0098,0x0000);  
        //开启显示设置    
        LCD_WriteReg(0x0007,0x0133);   
        LCD_WriteReg(0x0020,0x0000);                                                            
        LCD_WriteReg(0x0021,0x013f);
    }
     
    int main(void)
{      
     Stm32_Clock_Init(9);//系统时钟设置
    delay_init(72);
    //uart_init(72,9600);                                                    
    LCD_Init();     
    LCD_ShowString(0,0,"START INITing...");         
      while(1)//初始化ov7670
    {
        LCD_ShowString(0,0,"TEST OK");
        delay_ms(511);  
        LCD_ShowString(0,0,"       ");
    };
 
}
 


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-26 17:18:07 | 显示全部楼层
与LCD相连接的IO(触摸部分和背光部分除外)都需要设置为复用输出.方向FSMC会自动控制的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

33

主题

489

帖子

6

精华

金牌会员

Rank: 6Rank: 6

积分
1565
金钱
1565
注册时间
2011-12-10
在线时间
4 小时
发表于 2012-8-26 18:06:42 | 显示全部楼层
很久不见螃蟹版主了,呵呵.
学习交流请加Q群:242876057(STM32F4交流群)
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-26 19:27:03 | 显示全部楼层
工作忙啊...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 13:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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