打印
[STM32F1]

STM32 FSMC设置感觉都没问题,但出来就是不对

[复制链接]
3228|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
用STM32 FSMC驱动液晶,卡住快一个星期了,用示波器看WR,RD时序都是一个低电平,100-300毫秒,感觉不对啊! LCD_DATA  写后读出来都是 0XFF,  LCD_CMD读出来是0XE3。搞不懂啊。 调试fsmc_BCR1,fsmc_BTR1后两值还是默认值,不见变化,是FSMC就没驱动对麽?新手,贴上程序大家帮忙看看吧?!
                                 
#define Bank1_LCD_D       ((u32)0x60000001)//Disp Data ADDR
#define Bank1_LCD_C              ((u32)0x60000000)

#define LCD_DATA  (*((volatile u8 *) 0x60000001))
#define LCD_CMD   (*((volatile u8 *) 0x60000000))

void LCD_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    /* 使能FSMC时钟*/
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);

    /* 使能FSMC对应相应管脚时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF , ENABLE);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    /* 配置LCD背光控制管脚*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;               
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* 配置LCD复位控制管脚*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ;          
    GPIO_Init(GPIOD, &GPIO_InitStructure);                    

    /* 配置FSMC相对应的数据线,FSMC-D0~D7: PD 14 15 0 1,PE 7 8 9 10 */       
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_14 | GPIO_Pin_15;                              
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 ;                              
    GPIO_Init(GPIOE, &GPIO_InitStructure);

    /* 配置FSMC相对应的控制线
         * PD4-FSMC_NOE  :LCD-RD   读使能
   * PD5-FSMC_NWE  :LCD-WR           写使能
         * PD7-FSMC_NE1  :LCD-CS
   * PF0-FSMC_A0 :LCD-D/I        相当于片内地址信号,决定是写命令还是写数据

         */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
    GPIO_Init(GPIOD, &GPIO_InitStructure);  

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
    GPIO_Init(GPIOF, &GPIO_InitStructure);  

    /* tft control gpio init */         
   // GPIO_SetBits(GPIOD, GPIO_Pin_13);                 // 背光打开
                GPIO_ResetBits(GPIOB, GPIO_Pin_6);

        GPIO_SetBits(GPIOD, GPIO_Pin_11); //fuwei       
   nor=(*(volatile u16 *)(0xa0000000+8));        //fsmc_BCR1
        cs=(*(volatile u32 *)(0xa0000000+8+4));        //fsmc_BTR1
}

void LCD_FSMC_Config(void)
{
    FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
    FSMC_NORSRAMTimingInitTypeDef  p;


    p.FSMC_AddressSetupTime = 0x02;         //地址建立时间
    p.FSMC_AddressHoldTime = 0x00;         //地址保持时间
    p.FSMC_DataSetupTime = 0x05;                 //数据建立时间
    p.FSMC_BusTurnAroundDuration = 0x00;
    p.FSMC_CLKDivision = 0x00;
    p.FSMC_DataLatency = 0x00;
    p.FSMC_AccessMode = FSMC_AccessMode_B;         // 一般使用模式B来控制LCD

       FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;                         //NOR FLASH的BANK1
    FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;          //数据线与地址线不复用
    FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;                                  //存储器类型NOR FLASH
    FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;                  //数据宽度为16位
    FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;          //使用异步写模式,禁止突发模式
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;  //本成员的配置只在突发模式下有效,等待信号极性为低
    FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;                                 //禁止非对齐突发模式
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;   //本成员配置仅在突发模式下有效。NWAIT信号在什么时期产生
    FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;                          //本成员的配置只在突发模式下有效,禁用NWAIT信号
    FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;                          //禁止突发写操作
           FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;                   //写使能
        FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;                  //禁止扩展模式,扩展模式可以使用独立的读、写模式
        FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;                                                   //配置读写时序
    FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;                                                            //配置写时序


   FSMC_NORSRAMStructInit(&FSMC_NORSRAMInitStructure);
      FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);

    /* 使能 FSMC Bank1_SRAM Bank */
    FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
       
        nor=(*(volatile u16 *)(0xa0000000+8));        //fsmc_BCR1
        cs=(*(volatile u32 *)(0xa0000000+8+4));        //fsmc_BTR1
}






沙发
estelle08|  楼主 | 2014-7-8 23:13 | 只看该作者
没人回麽?

使用特权

评论回复
板凳
mmuuss586| | 2014-7-9 08:44 | 只看该作者
发些FSMC资料你看下;
再仔细对下程序哪里问题,不一定是你的FSMC初始化问题,其它地方有问题也不排除;
FSMC.rar (3.21 MB)

使用特权

评论回复
地板
estelle08|  楼主 | 2014-7-9 12:10 | 只看该作者
这个WR,RD读写时序是不是就不对啊?谁能指点下

使用特权

评论回复
5
IJK| | 2014-7-10 11:46 | 只看该作者
"用示波器看WR,RD时序都是一个低电平,100-300毫秒"
这种情况觉得不对,/WR /RD的低电平时间一般比较短,us级别或者更短。

发张FSMC图片供参考,ch1为片选/CE,ch2为写/WR

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
estelle08 + 1 赞一个!
6
IJK| | 2014-7-10 11:48 | 只看该作者
具体上面怎么对FSMC配置,可以参考STM32 FSMC的例子,根据自己的硬件 改一下就行了。

使用特权

评论回复
7
estelle08|  楼主 | 2014-7-10 16:36 | 只看该作者
谢谢楼IJK!上面一开始测WR,RD时示波器没设置对,所以测出来上百ms。刚发现RST复位信号电平拉不上去,最高只能到1.2V左右,CPU出来就只有这么高,其它脚位控制出来高电平正常,所以猜测是硬件问题导致液晶的低电平复位条件不满足。查出来再来回帖!谢谢!
再弱弱问下,会有可能是软件问题导致RST脚位电平拉不上吗?

使用特权

评论回复
8
estelle08|  楼主 | 2014-7-10 16:38 | 只看该作者
mmuuss586 发表于 2014-7-9 08:44
发些FSMC资料你看下;
再仔细对下程序哪里问题,不一定是你的FSMC初始化问题,其它地方有问题也不排除;
...

谢谢热心帮忙!第一次用FSMC,出了问题就慌了,呵呵,解决了再来回帖,谢谢!

使用特权

评论回复
9
estelle08|  楼主 | 2014-7-10 16:39 | 只看该作者
IJK 发表于 2014-7-10 11:48
具体上面怎么对FSMC配置,可以参考STM32 FSMC的例子,根据自己的硬件 改一下就行了。 ...

谢谢楼IJK!上面一开始测WR,RD时示波器没设置对,所以测出来上百ms。刚发现RST复位信号电平拉不上去,最高只能到1.2V左右,CPU出来就只有这么高,其它脚位控制出来高电平正常,所以猜测是硬件问题导致液晶的低电平复位条件不满足。查出来再来回帖!谢谢!
再弱弱问下,会有可能是软件问题导致RST脚位电平拉不上吗?

使用特权

评论回复
10
mmuuss586| | 2014-7-10 16:57 | 只看该作者
estelle08 发表于 2014-7-10 16:38
谢谢热心帮忙!第一次用FSMC,出了问题就慌了,呵呵,解决了再来回帖,谢谢! ...

拿示波器好好分析下,也很快的;

使用特权

评论回复
11
estelle08|  楼主 | 2014-7-18 15:57 | 只看该作者
问题解决了,历经两周,汗颜啊! 网上FSMC A0一般数据地址为高,指令地址为低,而我这块液晶正好相反。

使用特权

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

本版积分规则

4

主题

14

帖子

0

粉丝