OpenEdv-开源电子网

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

战舰LCD小问题,请求大家指点

[复制链接]

12

主题

85

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2013-11-24
在线时间
0 小时
发表于 2013-12-16 15:22:48 | 显示全部楼层 |阅读模式

//LCD???·?á????
typedef struct
{
 u16 LCD_REG;
 u16 LCD_RAM;
} LCD_TypeDef;
//????NOR/SRAM?? Bank1.sector4,???·??HADDR[27,26]=11 A10×÷???????ü????·???
//×????è???±STM32?????á????????????! 111110=0X3E      
#define LCD_BASE        ((u32)(0x6C000000 | 0x000007FE))
#define LCD             ((LCD_TypeDef *) LCD_BASE)

 

 

依我自己的理解,这样定义也行啊,可实际是不行的,请问差在哪?

//LCD???·?á????
typedef struct
{
 u32 LCD_REG;
 u32 LCD_RAM;

} LCD_TypeDef;
//????NOR/SRAM?? Bank1.sector4,???·??HADDR[27,26]=11 A10×÷???????ü????·???
//×????è???±STM32?????á????????????! 111110=0X3E      
#define LCD_BASE        ((u32)(0x6C000000 | 0x000007FC))
#define LCD             ((LCD_TypeDef *) LCD_BASE)

 

A10的话数据和命令的控制信号是0x000007fe,结构体中定义的是16位的变量,两字节加上2就是RAM地址0x00000800.   如果定义的是32位的变量,是不是就是0x000007fc,四字节加上四后就是RAM的地址0x00000800了,但就是不好使,为什么呢?是因为给LCD的数据或是命令是16位的,结构体中就得定义成16位的变量吗?

学一天不会,我学两天;再不会,再两天·········
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-12-31 13:40:26 | 显示全部楼层
1612103064 发表于 2016-12-26 20:52
2.//写寄存器函数
//regval:寄存器值
void LCD_WR_REG(u16 regval)

1、LCD->LCD_REG这个是FSMC的地址,regval这个是要写入的数据
2、LCD->LCD_RAM这个也是FSMC的地址
3、两个不同的地址,控制的就是FMSC的地址管脚FSMC_Ax,通过硬件连接,实际上就是控制LCD的RS管脚,让LCD知道此时发送过来的数据是个什么东西
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-12-16 23:36:13 | 显示全部楼层
回复【楼主位】正点妹子:
---------------------------------
FSMC总线就是16位的,你要是32位数据,得访问两次总线.
不是很明白你的定义32位变量,做什么用?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

85

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2013-11-24
在线时间
0 小时
 楼主| 发表于 2013-12-17 11:16:56 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥好
      咱要的不就是那个LCD_REG,LCD_RAM的地址么,然后往这两个地址写数据就相当于向LCD写数据和命令了,LCD_REG/LCD_RAM是多少位的有什么关系啊
学一天不会,我学两天;再不会,再两天·········
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-12-17 12:22:10 | 显示全部楼层
回复【3楼】正点妹子:
---------------------------------
LCD_REG/LCD_RAM这两个东西是定义了FSMC的相关地址变量,看#define LCD_BASE        ((u32)(0x6C000000 | 0x000007FE))
#define LCD             ((LCD_TypeDef *) LCD_BASE)这里就强制性转换成结构体的指针了,当你往LCD_REG送数据的时候就是往0x6C000000 | 0x000007FE这个地址上面放上数据,如同51上的P0 = 0XFF一样,仔细看下有关于STM32的FSMC的介绍吧

我的这样写的
#define LCD_REG_ADD           ((u32)(0x6c000000 | 0x000007fe)) //寄存器地址,命令,RS = 0
      #define LCD_DAT_ADD           ((u32)(0x6c000000 | 0x00000800)) //显示数据地址,显示RAM,RS = 1

      #define LCD_WR_REG(index)     ((*(__IO u16 *)(LCD_REG_ADD)) = ((u16)index))
                                    //写LCD寄存器写入数值index
      #define LCD_WR_Data(val)      ((*(__IO u16 *)(LCD_DAT_ADD)) = ((u16)val))
                                    //往LCD的RAM写入数据val
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-12-17 12:23:58 | 显示全部楼层
回复【3楼】正点妹子:
---------------------------------
LCD的寄存器数据是16位的,加上FSMC的数据总线也是16位的,所以你如果定义成了32位的话就访问两次了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

12

主题

85

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2013-11-24
在线时间
0 小时
 楼主| 发表于 2013-12-17 12:38:48 | 显示全部楼层
回复【4楼】Badu_Space:
---------------------------------
谢谢您  您说的这个我明白,但是咱要的不就是那个LCD_REG,LCD_RAM的地址么,然后往这两个地址写数据就相当于向LCD写数据和命令了,LCD_REG/LCD_RAM是多少位的有什么关系啊? 如果我驱动八位的液晶,得定义成多少位的?      我知道我的问题很愚蠢,但就是没转过弯了,卡住了,谢谢不厌其烦的解答
学一天不会,我学两天;再不会,再两天·········
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-12-17 13:15:21 | 显示全部楼层
回复【6楼】正点妹子:
---------------------------------
就是说你液晶上面数据线接的是8位是吧

这样也没关系啊,对应的数据右移8位(左移8位)就好啦,或者你定义LCD_REG/LCD_RAM位8位即可,初始化FSMC的时候设置成8位数据总线即可
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-12-17 19:55:12 | 显示全部楼层
回复【6楼】正点妹子:
---------------------------------
这是用的结构体,必须u16,然后让地址偏移2个位置,也就是让外部地址线增加1.
如果你用u32,那就地址偏移4个位置,外部地址线加2,你一定要这么搞,也可以,自己设计的时候,首地址设置好就可以了。

至于8位的,外部总线你设置为8位模式咯,这样就可以定义为u8,否则如果设置为16位/32位,解决办法参考前面提到的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

85

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2013-11-24
在线时间
0 小时
 楼主| 发表于 2013-12-18 11:36:15 | 显示全部楼层
回复【8楼】正点原子:
-------------------------回复【8楼】正点原子:
---------------------------------
这夏懂了懂了!!!!   谢谢原子哥,谢谢Badu_space哥,感谢
学一天不会,我学两天;再不会,再两天·········
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-1-17
在线时间
18 小时
发表于 2016-12-26 20:52:46 | 显示全部楼层
八度空间 发表于 2013-12-17 12:22
回复【3楼】正点妹子:
---------------------------------
LCD_REG/LCD_RAM这两个东西是定义了FSMC的相关地 ...


2.//写寄存器函数
//regval:寄存器值
void LCD_WR_REG(u16 regval)
{
LCD->LCD_REG=regval; //写入要写的寄存器序号
}

这个寄存器序号是谁的寄存器啊?怎样理解这个寄存器?
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-1-17
在线时间
18 小时
发表于 2016-12-26 20:53:02 | 显示全部楼层
正点原子 发表于 2013-12-17 19:55
回复【6楼】正点妹子:
---------------------------------
这是用的结构体,必须u16,然后让地址偏移2个位 ...


2.//写寄存器函数
//regval:寄存器值
void LCD_WR_REG(u16 regval)
{
LCD->LCD_REG=regval; //写入要写的寄存器序号
}

这个寄存器序号是谁的寄存器啊?怎样理解这个寄存器?
回复 支持 反对

使用道具 举报

15

主题

68

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2014-1-2
在线时间
62 小时
发表于 2016-12-27 13:01:15 | 显示全部楼层
我是来围观楼主ID的
回复 支持 反对

使用道具 举报

5

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2016-10-28
在线时间
41 小时
发表于 2016-12-27 14:56:36 | 显示全部楼层

同楼上   我也是来围观楼主ID的
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 07:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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