关于stm32f103VE 使用FSMC控制LCD 应该如何初始化FSMC??求指点

2019-08-14 07:38发布

原子哥的资料里是103ZE的 可我的只有100脚 没有F G 的管脚啊 那么该怎么配置? ?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
36条回答
八度空间
1楼-- · 2019-08-14 11:07
回复【楼主位】_tank_:
---------------------------------
就这样配置

GPIO_InitTypeDef GPIO_InitStructure;
      
FSMC_NORSRAMInitTypeDef FSMC_TFTLCD_InitStructure;

FSMC_NORSRAMTimingInitTypeDef ReadWrite_Time;
FSMC_NORSRAMTimingInitTypeDef Write_Time;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE); //使能FSMC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE); //开启外设时钟
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //开启复用时钟

/* 初始化GPIOD为复用推挽输出 */
/* PD.0为FSMC_D2    D.1为FSMC_D3 */
/* PD.4为FSMC_NOE    D.5为FSMC_NWE */
/* PD.7为FSMC_NE1 */
/* PD.8为FSMC_D13    D.9为FSMC_D14    D.10为FSMC_D15 */
/* PD.11为FSMC_A16 */
/* PD.14为FSMC_D0    D.15为FSMC_D1 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_8 | 
                              GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO翻转速度为50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置为复用推挽输出

GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化GPIO相关结构体

/* 初始化GPIOE为复用推挽输出 */
/* PE.7为FSMC_D4    E.8为FSMC_D5 */
/* PE.9为FSMC_D6    E.10为FSMC_D7 */
/* PE.11为FSMC_D8    E.12为FSMC_D9 */
/* PE.13为FSMC_D10    E.14为FSMC_D11 */
/* PE.5为FSMC_D12 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | 
                              GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO翻转速度为50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置为复用推挽输出

GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化GPIO相关结构体
正点原子
2楼-- · 2019-08-14 16:25
 精彩回答 2  元偷偷看……
_tank_
3楼-- · 2019-08-14 17:59
回复【2楼】Badu_Space:
---------------------------------
还是不可以 GPIO的设置直接粘贴你的代码  RS采用A16 FSMC选用bank1 第一分区   可返回的id只是0

把代码贴一下吧

void FSMC_LCD_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure; 
       
  FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
  FSMC_NORSRAMTimingInitTypeDef readWriteTiming;
  FSMC_NORSRAMTimingInitTypeDef writeTiming; 

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE); //使能FSMC时钟 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE); //开启外设时钟 
  // RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //开启复用时钟 

/* 初始化GPIOD为复用推挽输出 */ 
/* PD.0为FSMC_D2    D.1为FSMC_D3 */ 
/* PD.4为FSMC_NOE    D.5为FSMC_NWE */ 
/* PD.7为FSMC_NE1 */ 
/* PD.8为FSMC_D13    D.9为FSMC_D14    D.10为FSMC_D15 */ 
/* PD.11为FSMC_A16 */ 
/* PD.14为FSMC_D0    D.15为FSMC_D1 */ 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_15; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO翻转速度为50MHz 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置为复用推挽输出 

    GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化GPIO相关结构体 

/* 初始化GPIOE为复用推挽输出 */ 
/* PE.7为FSMC_D4    E.8为FSMC_D5 */ 
/* PE.9为FSMC_D6    E.10为FSMC_D7 */ 
/* PE.11为FSMC_D8    E.12为FSMC_D9 */ 
/* PE.13为FSMC_D10    E.14为FSMC_D11 */ 
/* PE.5为FSMC_D12 */ 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | 
                              GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO翻转速度为50MHz 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置为复用推挽输出 

GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化GPIO相关结构体



    readWriteTiming.FSMC_AddressSetupTime = 0x01;  //地址建立时间(ADDSET)为2个HCLK 1/36M=27ns
    readWriteTiming.FSMC_AddressHoldTime = 0x00;  //地址保持时间(ADDHLD)模式A未用到
    readWriteTiming.FSMC_DataSetupTime = 0x0f;  // 数据保存时间为16个HCLK,因为液晶驱动IC的读数据的时候,速度不能太快,尤其对1289这个IC。
    readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
    readWriteTiming.FSMC_CLKDivision = 0x00;
    readWriteTiming.FSMC_DataLatency = 0x00;
    readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;  //模式A 
    

writeTiming.FSMC_AddressSetupTime = 0x00;  //地址建立时间(ADDSET)为1个HCLK  
    writeTiming.FSMC_AddressHoldTime = 0x00;  //地址保持时间(A
    writeTiming.FSMC_DataSetupTime = 0x03;  ////数据保存时间为4个HCLK
    writeTiming.FSMC_BusTurnAroundDuration = 0x00;
    writeTiming.FSMC_CLKDivision = 0x00;
    writeTiming.FSMC_DataLatency = 0x00;
    writeTiming.FSMC_AccessMode = FSMC_AccessMode_A;  //模式A 

 
    FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;//  这里我们使用NE4 ,也就对应BTCR[6],[7]。
    FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不复用数据地址
    FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM;  //SRAM   
    FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit   
    FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable; 
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable; 
    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_Enable; // 读写使用不同的时序
    FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; 
    FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //读写时序
    FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming;  //写时序

    FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //初始化FSMC配置

    FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);  // 使能BANK1  
}

结构体为:
typedef struct
{
u16 LCD_REG;
u16 LCD_RAM;
} LCD_TypeDef;
#define LCD_BASE        ((u32)(0x60000000 | 0x0001FFFE))
#define LCD             ((LCD_TypeDef *) LCD_BASE)

帮我看看吧
_tank_
4楼-- · 2019-08-14 20:17
回复【3楼】正点原子:
---------------------------------
把我的代码贴上去了 原子哥也帮我看看吧
ricefat
5楼-- · 2019-08-14 23:32
回复【5楼】_tank_:
---------------------------------
先看看FSMC的介绍吧,没有FG可以用FSMC其他相同功能的引脚代替,代码中做相应修改即可
正点原子
6楼-- · 2019-08-15 02:18
我的:
u16 i;
RCC->AHBENR|=1<<8;        //使能FSMC时钟   
   RCC->APB2ENR|=1<<3;      //使能PORTB时钟
RCC->APB2ENR|=1<<5;      //使能PORTD时钟
RCC->APB2ENR|=1<<6;      //使能PORTE时钟
  RCC->APB2ENR|=1<<8;       //使能PORTG时钟  
GPIOB->CRL&=0XFFFFFF0F; //PB1 推挽输出 背光
GPIOB->CRL|=0X00000030;    
//PORTD复用推挽输出 
GPIOD->CRH&=0X00FFF000;
GPIOD->CRH|=0XBB000BBB; 
GPIOD->CRL&=0X0F00FF00;
GPIOD->CRL|=0XB0BB00BB;     
//PORTE复用推挽输出 
GPIOE->CRH&=0X00000000;
GPIOE->CRH|=0XBBBBBBBB; 
GPIOE->CRL&=0X000FFFFF;
GPIOE->CRL|=0XBBB00000;      

//寄存器清零
//bank1有NE1~4,每一个有一个BCR+TCR,所以总共八个寄存器。
//这里我们使用NE1 ,也就对应BTCR[0],[1]。     
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<<14; //读写使用不同的时序
FSMC_Bank1->BTCR[0]|=1<<4;  //存储器数据宽度为16bit      
//操作BTR寄存器
//读时序控制寄存器      
FSMC_Bank1->BTCR[1]|=0<<28; //模式A        
FSMC_Bank1->BTCR[1]|=1<<0;  //地址建立时间(ADDSET)为2个HCLK 1/36M=27ns    
//因为液晶驱动IC的读数据的时候,速度不能太快,尤其对1289这个IC。
FSMC_Bank1->BTCR[1]|=0XF<<8;   //数据保存时间为16个HCLK    
//写时序控制寄存器  
FSMC_Bank1E->BWTR[0]|=0<<28;  //模式A        
FSMC_Bank1E->BWTR[0]|=0<<0; //地址建立时间(ADDSET)为1个HCLK 
  //4个HCLK(HCLK=72M)因为液晶驱动IC的写信号脉宽,最少也得50ns。72M/4=24M=55ns    
FSMC_Bank1E->BWTR[0]|=3<<8;  //数据保存时间为4个HCLK
//使能BANK1,区域4
FSMC_Bank1->BTCR[0]|=1<<0; //使能BANK1,区域1   
 
  delay_ms(50); // delay 50 ms 
  LCD_WriteReg(0x0000,0x0001);
delay_ms(50); // delay 50 ms 
   lcddev.id = LCD_ReadReg(0x0000); 


//LCD地址结构体
typedef struct
{
u16 LCD_REG; 
u16 LCD_RAM;
} LCD_TypeDef;
//使用NOR/SRAM的 Bank1.sector1,地址位HADDR[27,26]=00 A21作为数据命令区分线 
//注意设置时STM32内部会右移一位对其!      
#define LCD_BASE        ((u32)(0x60000000 | 0x003FFFFE))
#define LCD             ((LCD_TypeDef *) LCD_BASE)


使用的是A21,你对照着改成A16,就OK了。

一周热门 更多>