OpenEdv-开源电子网

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

关于FSMC控制LCD的几个问题请教下原子哥

[复制链接]

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2012-7-26 14:18:00 | 显示全部楼层 |阅读模式
RT,对FSMC的原理不是很了解,看了几遍手册,还是不清楚FSMC的工作结构。
    
1.FSMC的接口在STM32的芯片里是固定的对应某些IO口吗?因为我在原子哥的程序里只看到对IO口进行初始化,没有说明那个IO口对应FSMC上的,所以有这个猜测、
2.#define LCD_BASE     ((u32)(0x60000000 | 0x0C0007FE))
    #define LCD             ((LCD_TypeDef *) LCD_BASE)
这个代码中0x60000000指的是 bank1 NE1的地址,而0x0C0007FE是A10的地址是吗,那么这些地址怎么计算出来的呢?
3.typedef struct
{
u16 LCD_REG;
u16 LCD_RAM;
} LCD_TypeDef;
相对于2的地址,这个结构体中LCD_REG和LCD_RAM的地址应该是什么? 

4.请原子哥和各位朋友指点下,感谢原子哥,感谢openedv

互联网,智能设备爱好者,欢迎讨论任何有意思的想法。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1815
金钱
1815
注册时间
2011-10-9
在线时间
230 小时
发表于 2012-7-26 16:52:45 | 显示全部楼层
我说说我对fsmc的理解

首先 要确定 基地址

stm32的fsmc 针对不不同的器件   分成4个bank    .这个是固定的  那个器件就用那个bank 

每个bak根据不同的 CE 引脚 分成4个区  每个区的起始地址 不一样(具体地址手册有说)

这个起始地址 就是 基址地址  。 部分需要用到 RS 控制的 还有偏移地址。
把这个地址算对了 然后配置采用什么时序 时序的保持时间 然后enable fsmc 就好了。

我的tft 和 sram  nandflash 都是这么弄上去的


————————————————如上述不是楼主需要的。请忽略。。。______________________________________________









回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-26 17:31:02 | 显示全部楼层
回复【楼主位】shibusha:
---------------------------------
1,FSMC的IO是固定的.具体看芯片数据手册.
2,你要让RS=0(写命令),然后下一个地址的时候(写数据)RS=1.如果取RS接A0,那么 你认为写命令的时候,地址应该是多少?
3,同问题2.
4,欢迎常来openedv.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
 楼主| 发表于 2012-7-26 18:11:51 | 显示全部楼层
回复【2楼】simms01:
--------------------------------
谢谢朋友的热心回复,综合原子的回复,在控制LCD的时候,只要相应IO口初始化,再设置一下FSMC时序就可以了吗?
互联网,智能设备爱好者,欢迎讨论任何有意思的想法。
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
 楼主| 发表于 2012-7-26 18:25:11 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
是不是可以这么理解,起始地址+偏移量只是选择了RS,而选择了RS后,再写入数据或者指令的地址是FSMC根据所给出的RS地址??
互联网,智能设备爱好者,欢迎讨论任何有意思的想法。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-26 18:44:58 | 显示全部楼层
回复【5楼】shibusha:
---------------------------------
LCD要改变的就只有个RS,用来区分命令和数据.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
 楼主| 发表于 2012-7-26 19:02:38 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
原子你的程序,
        //bank1有NE1~4,每一个有一个BCR+TCR,所以总共八个寄存器。
//这里我们使用NE4 ,也就对应BTCR[6],[7]。     
FSMC_Bank1->BTCR[6]=0X00000000;
FSMC_Bank1->BTCR[7]=0X00000000;
FSMC_Bank1E->BWTR[6]=0X00000000;
//操作BCR寄存器 使用异步模式
FSMC_Bank1->BTCR[6]|=1<<12;//存储器写使能
FSMC_Bank1->BTCR[6]|=1<<4; //存储器数据宽度为16bit      
//操作BTR寄存器     
//3个HCLK(HCLK=72M)因为液晶驱动IC的写信号脉宽,最少也得50ns。72M/3=24M=42ns,已经超频了。   
FSMC_Bank1->BTCR[7]|=1<<9; //数据保存时间为3个HCLK    
//闪存写时序寄存器  
FSMC_Bank1E->BWTR[6]=0x0FFFFFFF;//默认值
//使能BANK4(PC卡设备)
FSMC_Bank1->BTCR[6]|=1<<0;
你这里是用了BANK1 NE4 的A10作为RS,如果我用BANK1 NE4 A0作为RS,这段代码是不是直接可以拿来做FSMC的初始化?
互联网,智能设备爱好者,欢迎讨论任何有意思的想法。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
 楼主| 发表于 2012-7-26 22:40:24 | 显示全部楼层
回复【8楼】 正点原子 :
---------------------------------

改了半天也不成功,我用下面这段代码替换了你程序里的FSMC的初始化代码就可以显示了,因为FSMC的库函数没有中文介绍,看不懂这段代码的具体怎么初始化的,还是看原子的寄存器比较清晰,原子哥能帮忙看下,改成直接操作寄存器的方式吗?
  FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
  FSMC_NORSRAMTimingInitTypeDef  p;

/*-- FSMC Configuration ------------------------------------------------------*/
/*----------------------- SRAM Bank 4 ----------------------------------------*/
  /* 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_NORSRAM4;
  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_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 4 (of NOR/SRAM Bank 1~4) is enabled */
  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);


替换是是你程序里的这段



FSMC_Bank1->BTCR[6]=0X00000000; 
FSMC_Bank1->BTCR[7]=0X00000000; 
FSMC_Bank1E->BWTR[6]=0X00000000; 
//操作BCR寄存器 使用异步模式 
FSMC_Bank1->BTCR[6]|=1<<12;//存储器写使能 
FSMC_Bank1->BTCR[6]|=1<<4; //存储器数据宽度为16bit     
//操作BTR寄存器      
//3个HCLK(HCLK=72M)因为液晶驱动IC的写信号脉宽,最少也得50ns。72M/3=24M=42ns,已经超频了。  
FSMC_Bank1->BTCR[7]|=1<<9; //数据保存时间为3个HCLK  
//闪存写时序寄存器   
FSMC_Bank1E->BWTR[6]=0x0FFFFFFF;//默认值 
//使能BANK4(PC卡设备) 
FSMC_Bank1->BTCR[6]|=1<<0;

还有
个小问题,我有块TFTLCD,刚接触STM32的时候好奇,乱下了几个程序,屏幕白屏,仿真看了DeviceCode的值变成了0x9120。
手动指定DeviceCode=0x9320能显示,但
在屏幕的底部有大概240x20的像素不能显示,这个有可能是什么问题呢?按理说LCD型号那个寄存器应该是只读。
互联网,智能设备爱好者,欢迎讨论任何有意思的想法。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-27 00:27:32 | 显示全部楼层
回复【9楼】shibusha:
---------------------------------
检查D9.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

27

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
300
金钱
300
注册时间
2012-9-11
在线时间
31 小时
发表于 2014-10-29 10:06:46 | 显示全部楼层
回复【7楼】shibusha:
---------------------------------
//3个HCLK(HCLK=72M)因为液晶驱动IC的写信号脉宽,最少也得50ns。72M/3=24M=42ns,已经超频了。
是这样计算的吗???
应该是主频为72M,每个HCLK周期为13.89ns,因为液晶驱动IC的写信号脉宽,最少也得50ns,FSMC_Bank1->BTCR[7]|=1<<9; //数据保存时间为3个HCLK
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
 楼主| 发表于 2014-10-29 13:50:04 | 显示全部楼层
回复【11楼】apple:
---------------------------------
问题已经解决了,谢谢关注!
互联网,智能设备爱好者,欢迎讨论任何有意思的想法。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-29 21:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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